- 數(shù)據(jù)庫簡介
- 關(guān)系型數(shù)據(jù)庫
- MySQL安裝和使用
- SQL語言
一亏栈、數(shù)據(jù)庫簡介
(一)數(shù)據(jù)庫的發(fā)展
- 文件系統(tǒng):磁盤文件存儲數(shù)據(jù)
- 第一代數(shù)據(jù)庫:網(wǎng)狀模型冕末、層次模型
- 第二代數(shù)據(jù)庫:關(guān)系型數(shù)據(jù)庫肺魁、結(jié)構(gòu)化查詢語言
- 新一代數(shù)據(jù)庫:“對象—關(guān)系”型數(shù)據(jù)庫
(二)文件管理系統(tǒng)的缺點
- 編寫應用程序不方便
- 數(shù)據(jù)冗余不可避免
- 應用程序依賴性
- 不支持對文件的并發(fā)訪問
- 數(shù)據(jù)間聯(lián)系弱
- 難以按用戶視圖表示數(shù)據(jù)
- 無安全控制功能
(三)數(shù)據(jù)庫管理系統(tǒng)的優(yōu)點
- 相互關(guān)聯(lián)的數(shù)據(jù)的集合
- 較少的數(shù)據(jù)冗余
- 程序與數(shù)據(jù)相互獨立
- 保證數(shù)據(jù)的安全、可靠
- 最大限度地保證數(shù)據(jù)的正確性
- 數(shù)據(jù)可以并發(fā)使用并能同時保證一致性
(四)數(shù)據(jù)庫管理系統(tǒng)的基本概念
(一)術(shù)語定義
- 數(shù)據(jù)庫:數(shù)據(jù)的匯集,它以一定的組織形式存于存儲介質(zhì)上
- DBMS(數(shù)據(jù)庫管理系統(tǒng)):管理數(shù)據(jù)庫的系統(tǒng)軟件,它實現(xiàn)數(shù)據(jù)庫系統(tǒng)的各種功能漱牵,是數(shù)據(jù)庫系統(tǒng)的核心
- DBA(數(shù)據(jù)庫管理員):負責數(shù)據(jù)庫的規(guī)劃、設計枝缔、協(xié)調(diào)布疙、維護和管理等工作
- 應用程序:指以數(shù)據(jù)庫為基礎的應用程序
(二)DBMS的基本功能
- 數(shù)據(jù)定義
- 數(shù)據(jù)處理:增、刪愿卸、改、查
- 數(shù)據(jù)安全
- 數(shù)據(jù)備份
(三)數(shù)據(jù)庫系統(tǒng)的架構(gòu)
- 單機架構(gòu)
- 大型主機/終端架構(gòu)
- 主從式架構(gòu)(C/S)
- 分布式架構(gòu)
二截型、關(guān)系型數(shù)據(jù)庫
(一)基本概念
- 關(guān)系:關(guān)系就是二維表趴荸,表中的行、列次序并不重要
- 行 (row):表中的每一行宦焦,又稱為一條記錄
- 列 (column):表中的每一列发钝,又稱為屬性、字段
- 主鍵 (Primary key):用于惟一確定一個記錄的字段
- 域 (domain):屬性的取值范圍
(二)主流關(guān)系型數(shù)據(jù)庫
MySQL, MariaDB, PostgreSQL, Oracle, MSSQL, DB2
(三)事務: transaction
- 定義:被視作整體對待的若干個操作
- 事務的特性:ACID
A:原子性波闹,一個事務不可分割酝豪。
當一個事務進行過程中出現(xiàn)了中斷,下一次開始本事務時會執(zhí)行回滾(rollback)操作恢復至事務執(zhí)行前的狀態(tài)精堕;當一個事務完成后孵淘,會執(zhí)行提交(commit)操作,此后無法再恢復至事務執(zhí)行前的狀態(tài)
C:一致性歹篓,數(shù)據(jù)保持一致
I:隔離性瘫证,使用鎖機制避免多用戶同時修改某數(shù)據(jù),可能出現(xiàn)死鎖
D:持久性庄撮,提交后的改變是不可撤銷的背捌,而尚未提交的數(shù)據(jù)是臟數(shù)據(jù)
(四)實體—聯(lián)系模型(E-R模型)
-
實體(Entity):客觀存在并可以相互區(qū)分的客觀事物或抽象事件
- 在E-R圖中用矩形框表示實體,把實體名寫在框內(nèi)
- 屬性:實體所具有的特征或性質(zhì)
-
聯(lián)系(Relationship):數(shù)據(jù)之間的關(guān)聯(lián)集合洞斯,是客觀存在的應用語義鏈
- 實體內(nèi)部的聯(lián)系:指組成實體的各屬性之間的聯(lián)系毡庆。
- 實體之間的聯(lián)系:指不同實體之間聯(lián)系。
- 實體之間的聯(lián)系用菱形框表示
-
實體之間聯(lián)系的類型:
- 一對一聯(lián)系 (1:1)
- 一對多聯(lián)系 (1:n)
- 多對多聯(lián)系 (m:n)
(五)數(shù)據(jù)的三要素
-
數(shù)據(jù)結(jié)構(gòu)烙如,包含兩類
- 與數(shù)據(jù)類型么抗、內(nèi)容、性質(zhì)有關(guān)的對象
- 與數(shù)據(jù)之間聯(lián)系有關(guān)的對象
-
數(shù)據(jù)的操作
- 數(shù)據(jù)提忍琛:在數(shù)據(jù)集合中提取感興趣的內(nèi)容(SELECT)
- 數(shù)據(jù)更新:變更數(shù)據(jù)庫中的數(shù)據(jù)(INSERT乖坠、DELETE、UPDATE)
-
數(shù)據(jù)的約束條件:是一組完整性規(guī)則的集合
- 實體(行)完整性 (Entity integrity)
- 域(列)完整性 (Domain Integrity)
- 參考完整性 (Referential Integrity)
(六)范式(NF)
定義:設計關(guān)系數(shù)據(jù)庫時刀闷,為設計出合理的關(guān)系型數(shù)據(jù)庫而遵從的規(guī)范要求
各種范式呈遞次規(guī)范熊泵,越高的范式數(shù)據(jù)庫冗余越小目前有六種范式仰迁,設計關(guān)系型數(shù)據(jù)庫時一般需滿足至第三范式的要求
1NF:無重復的列,每一列都是不可分割的基本數(shù)據(jù)項顽分,同一列中不能有多個值徐许,即實體中的某個屬性不能有多個值或者不能有重復的屬性。除去同類型的字段卒蘸,就是無重復的列
2NF:屬性完全依賴于主鍵雌隅,第二范式必須先滿足第一范式,要求表中的每個行必須可以被唯一地區(qū)分缸沃。通常為表加上一個列恰起,以存儲各個實例的唯一標識PK。非PK的字段需要與整個PK有直接相關(guān)性
3NF:屬性不依賴于其他非主屬性趾牧,滿足第三范式必須先滿足第二范式检盼。第三范式要求一個數(shù)據(jù)庫表中不包含已在其它表中包含的非主關(guān)鍵字信息,非PK的字段間不能有從屬關(guān)系
有時出于性能或其他特殊需求的考慮翘单,需要主動違反范式
(七)SQL概念
(1)基本概念:
SQL(Structure Query Language):結(jié)構(gòu)化查詢語言
應用編程接口
ODBC:Open Database Connectivity
JDBC:Java Data Base Connectivity索引:將表中的一個或多個字段中的數(shù)據(jù)復制一份另存吨枉,并且此些需要按特定次序排序存儲
關(guān)系運算:
選擇:挑選出符合條件的行
投影:挑選出需要的字段
連接:表間字段的關(guān)聯(lián)
(2)約束
約束(constraint):表中的數(shù)據(jù)要遵守的限制
主鍵:一個或多個字段的組合(復合主鍵),填入的數(shù)據(jù)必須能在本表中唯一標識本行哄芜;必須提供數(shù)據(jù)貌亭,即NOT NULL,一個表只能存在一個
惟一鍵:一個或多個字段的組合认臊,填入的數(shù)據(jù)必須能在本表中唯一標識本行圃庭;允許為NULL,一個表可以存在多個
外鍵:一個表中的某字段可填入的數(shù)據(jù)取決于另一個表的主鍵或唯一鍵已有的數(shù)據(jù)
檢查:字段值在一定范圍內(nèi)
(3)數(shù)據(jù)模型
- 數(shù)據(jù)抽象
- 物理層:決定數(shù)據(jù)的存儲格式美尸,即RDBMS在磁盤上如何組織文件
- 邏輯層:描述存儲什么數(shù)據(jù)冤议,以及數(shù)據(jù)間存在什么樣的關(guān)系
- 視圖層:描述DB中的部分數(shù)據(jù),是虛擬的表
- 關(guān)系模型的分類
- 關(guān)系模型
- 基于對象的關(guān)系模型
- 半結(jié)構(gòu)化的關(guān)系模型:XML數(shù)據(jù)
三师坎、MySQL安裝和使用
(一)MySQL和MariaDB
- MariaDB是MySQL的分支恕酸,軟件使用與MySQL相同
- yum安裝:CentOS 6 默認安裝MySQL,CentOS 7默認安裝MariaDB
(1)MariaDB的特性
- 單進程胯陋,多線程
- 插件式存儲引擎:
- 存儲引擎有多種實現(xiàn)版本蕊温,功能和特性可能均略有差別,用戶可根據(jù)需要靈活選擇
- 主要存儲引擎:MyISAM和InnoDB遏乔,當前絕大多數(shù)使用的是InnoDB(支持事務功能)
(2)MariaDB的程序組成:C/S架構(gòu)
Client:mysql, mysqldump, mysqladmin
Server:mysqld_safe, mysqld, mysqld_multi
(3)服務器監(jiān)聽的兩種socket地址
- ip socket:監(jiān)聽在tcp的3306端口义矛,支持遠程通信
- unix sock:監(jiān)聽在sock文件上(客戶機路徑:/tmp/mysql.sock, 服務器路徑:/var/lib/mysql/mysql.sock),僅支持本機通信
當本機通信時(server: localhost, 127.0.0.1)盟萨,自動使用unix sock
(二)MariaDB安裝
(1)安裝方式
源代碼:編譯安裝
二進制格式的程序包:展開至特定路徑凉翻,并經(jīng)過簡單配置后即可使用
程序包管理器管理的程序包
項目官方生成yum倉庫配置信息的地址:https://downloads.mariadb.org/mariadb/repositories/
(2)yum安裝和配置MariaDB
- 第1步,安裝和開啟服務
yum groupinstall mariadb mariadb-client
systemctl start mariadb
systemctl enable mariadb
-
第2步捻激,提高安全性
- 安裝并啟動服務后制轰,發(fā)現(xiàn)輸入
mysql
命令后可以不需輸入密碼直接進入系統(tǒng) - 執(zhí)行
select user();
命令前计,發(fā)現(xiàn)以root@localhost登錄
- 執(zhí)行
select user,host,password from mysql.user;
命令,發(fā)現(xiàn)當前的所有用戶都沒有設置密碼垃杖,同時允許匿名登錄數(shù)據(jù)庫男杈,存在很大安全隱患
-
執(zhí)行腳本
mysql_secure_installation
修改數(shù)據(jù)庫安全設置- 設置數(shù)據(jù)庫管理員root口令
- 禁止root遠程登錄
- 刪除anonymous用戶帳號
- 刪除test數(shù)據(jù)庫
再次嘗試登錄時,發(fā)現(xiàn)已經(jīng)無法匿名登錄了调俘,執(zhí)行
mysql -u root -p
以root@localhost身份輸入爭取密碼后成功登錄
- 安裝并啟動服務后制轰,發(fā)現(xiàn)輸入
- 第3步伶棒,編輯配置文件
/etc/my.cnf
vim /etc/my.cnf
skip-networking=1 //[mysqld]下添加選項,跳過反向解析過程加速啟動
(3)通用二進制格式安裝MariaDB
第1步彩库,創(chuàng)建用戶并制定數(shù)據(jù)庫數(shù)據(jù)的存放目錄
useradd -r -m -d /app/dbdata -s /sbin/nologin mysql
第2步肤无,準備二進制程序,要求必須解壓到/usr/local目錄下并命名為mysql
tar xvf mariadb-10.2.8-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local
ln -sv mariadb-10.2.8-linux-x86_64/ mysql //創(chuàng)建軟鏈接便于切換版本
chown -R root:mysql /usr/local/mysql/
- 第3步骇钦,準備配置文件
配置文件查找次序:后面覆蓋前面的配置文件
/etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf
mkdir /etc/mysql/
cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf //復制模板文件
vim /etc/mysql/my.cnf //[mysqld]下添加三個選項
datadir = /app/dbdata //數(shù)據(jù)庫數(shù)據(jù)存放目錄
innodb_file_per_table= on //innodb引擎下創(chuàng)建的每個表都是一個文件
skip_name_resolve= on //禁止主機名解析
- 第4步舅锄,創(chuàng)建數(shù)據(jù)庫文件
cd /usr/local/mysql
./scripts/mysql_install_db --datadir=/app/dbdata --user=mysql
- 第5步,準備日志文件
//CentOS 7下的操作
mkdir /var/log/mariadb
touch /var/log/mariadb/mariadb.log
setfacl -R -m u:mysql:rwx /var/log/mariadb/mariadb.log
//CentOS 6下的操作
touch /var/log/mysqld.log
setfacl -R -m u:mysql:rwx /var/log/mysqld.log
- 第6步司忱,準備服務腳本,并啟動服務
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
service mysqld start
- 第7步畴蹭,創(chuàng)建環(huán)境變量
vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile.d/mysql.sh
- 第8步坦仍,安全初始化
執(zhí)行腳本:mysql_secure_installation
(三)MariaDB的使用
(1)客戶端工具
mysql:命令行交互式客戶端工具
mysql選項:
-u:用戶名,默認為root
-h:服務器主機叨襟,默認為localhost
-p:建議使用用戶密碼繁扎,默認為空密碼-
mysql用戶賬號由兩部分組成:
USERNAME@HOST
HOST用于限制此用戶可通過哪些遠程主機連接mysql服務
支持使用通配符:- % 匹配任意長度的任意字符怒炸,如:
172.16.0.0/16
或172.16.%.%
- _ 匹配任意單個字符
- % 匹配任意長度的任意字符怒炸,如:
(2)常用命令
- 運行
mysql
命令:默認空密碼登錄
mysql>select user(); //查看當前用戶
mysql>use mysql; //選擇進入名為mysql的數(shù)據(jù)庫
mysql>SELECT user,host,password FROM user;
//從當前數(shù)據(jù)庫名為user的表中查詢每行中user,host,password列的數(shù)據(jù)
安全初始化
/usr/local/mysql/bin/mysql_secure_installation
登錄系統(tǒng):
mysql -uroot -p
-u 指定用戶名 -p 指定輸入密碼(直接跟密碼時與p之間無空格)客戶端命令:本地執(zhí)行
mysql> help
:查詢mysql客戶端命令
每個命令都完整形式和簡寫格式
mysql> status 或\s
服務端命令:通過mysql協(xié)議發(fā)往服務器執(zhí)行并取回結(jié)果
每個命令都必須有結(jié)束符號羡宙,默認為分號
select version();
四丰涉、SQL語言
(一)SQL語言簡介
(1)SQL語句構(gòu)成
由關(guān)鍵詞(Keyword)組成子句(Clause)戈鲁,多條子句組成一條語句
SELECT * //SELECT子句埋凯,SELECT為關(guān)鍵詞
FROM products //FROM子句桑包,F(xiàn)ROM為關(guān)鍵詞
WHERE price>400 //WHERE子句尾抑,WHERE為關(guān)鍵詞
(2)SQL語句分類
- DDL: Data Defination Language 數(shù)據(jù)定義語言
CREATE, DROP, ALTER - DML: Data Manipulation Language 數(shù)據(jù)操作語言
INSERT, DELETE, UPDATE - DCL:Data Control Language 數(shù)據(jù)控制語言
GRANT, REVOKE - DQL:Data Query Language 數(shù)據(jù)查詢語言
SELECT
(3)SQL語言規(guī)范
- 大小寫:
- 關(guān)鍵詞不區(qū)分大小寫(建議用大寫)
- 但字符串常量區(qū)分大小寫
- 跨行:
- 可單行或多行書寫侮邀,每條語句以";"結(jié)尾
- 關(guān)鍵詞不能跨多行或簡寫
- 用空格和縮進來提高語句的可讀性
- 子句通常位于獨立行念链,便于編輯盼忌,提高可讀性
- 注釋:
- SQL標準:
/*注釋內(nèi)容*/
多行注釋
-- 注釋內(nèi)容
單行注釋,注意有空格 - MySQL注釋:
#注釋內(nèi)容
- SQL標準:
(4)數(shù)據(jù)庫對象的命名規(guī)則
- 必須以字母開頭
- 可包括數(shù)字和三個特殊字符(# _ $掂墓,不建議使用)
- 不要使用MySQL的保留字
- 同一個表下的對象不能同名
(5)數(shù)據(jù)庫操作
創(chuàng)建數(shù)據(jù)庫:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
刪除數(shù)據(jù)庫:
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
查看支持所有字符集:
SHOW CHARACTER SET;
查看支持所有排序規(guī)則:
SHOW COLLATION;
獲取命令使用幫助:
HELP KEYWORD;
查看數(shù)據(jù)庫列表:
SHOW DATABASES;
(二)SQL語言應用
(1)創(chuàng)建谦纱、刪除表操作
-
語法:
- 創(chuàng)建表:
CREATE TABLE [IF NOT EXISTS] 'tbl_name' (col1 type1 修飾符, col2 type2 修飾符, ...)
- 刪除表:
DROP TABLE [IF EXISTS] tbl_name;
- 創(chuàng)建表:
-
修飾符
- NULL:數(shù)據(jù)列可包含NULL值
- NOT NULL:數(shù)據(jù)列不允許包含NULL值
- DEFAULT:默認值
- PRIMARY KEY:主鍵
- UNIQUE KEY:唯一鍵
- CHARACTER SET name:指定一個字符集
- AUTO_INCREMENT:自動遞增,適用于整數(shù)類型
- UNSIGNED:無符號君编,適用于數(shù)值類型
-
其他與表相關(guān)的操作
- 查看所有的引擎:
SHOW ENGINES;
- 查看表:
SHOW TABLES [FROM db_name];
- 查看表結(jié)構(gòu):
DESC [db_name.]tbl_name;
- 查看表創(chuàng)建命令:
SHOW CREATE TABLE tbl_name;
- 查看表狀態(tài):
SHOW TABLE STATUS LIKE 'tbl_name'\G
\G豎直顯示
- 查看所有的引擎:
(2)數(shù)據(jù)類型
-
mysql支持的數(shù)據(jù)類型:
- 數(shù)值類型
- 日期/時間類型
- 字符串(字符)類型
-
選擇正確的數(shù)據(jù)類型對于獲得高性能至關(guān)重要跨嘉,三大原則:
- 更小的通常更好,盡量使用可正確存儲數(shù)據(jù)的最小數(shù)據(jù)類型
- 簡單就好吃嘿,簡單數(shù)據(jù)類型的操作通常需要更少的CPU周期
- 盡量避免NULL祠乃,包含為NULL的列梦重,對MySQL更難優(yōu)化
-
整型
- tinyint(m):1個字節(jié)范圍
- smallint(m):2個字節(jié)范圍
- mediumint(m):3個字節(jié)范圍
- int(m):4個字節(jié)范圍
- bigint(m):8個字節(jié)范圍
- 加unsigned后綴代表正整數(shù),取值范圍:0至原范圍最大值*2
- m指select查詢結(jié)果顯示寬度跳纳,不影響實際取值
-
浮點型忍饰,近似值
- float(m,d):單精度浮點型8位精度(4字節(jié)) m:總位數(shù),d:小數(shù)位位數(shù)
- double(m,d):雙精度浮點型16位精度(8字節(jié)) m:總位數(shù)寺庄,d:小數(shù)位位數(shù)
-
定點型艾蓝,精確值
- decimal(m,d):m為總位數(shù),d為小數(shù)位位數(shù)
- 占用空間大斗塘、計算消耗大赢织,盡量只在精確計算時使用
-
字符串型
- char(n)固定長度,最多255個字符
- varchar(n)可變長度馍盟,最多65535個字符
- tinytext可變長度于置,最多255個字符
- text可變長度,最多65535個字符
- mediumtext 可變長度贞岭,最多2的24次方-1個字符
- longtext可變長度八毯,最多2的32次方-1個字符
- BINARY(M) 固定長度,可存二進制或字符瞄桨,允許長度為0-M字節(jié)话速,
- VARBINARY(M) 可變長度,可存二進制或字符芯侥,允許長度為0-M字節(jié)
- 內(nèi)建類型:ENUM枚舉, SET集合
-
二進制數(shù)據(jù):BLOB
- BLOB和text存儲方式不同泊交,TEXT以文本方式存儲,英文存儲區(qū)分大小寫柱查,而Blob是以二進制方式存儲廓俭,不分大小寫
- BLOB存儲的數(shù)據(jù)只能整體讀出
- TEXT可以指定字符集,BLOB不用指定字符集
-
日期時間類型
- date:日期'2008-12-2'
- time:時間'12:25:36'
- datetime:日期時間'2008-12-2 22:06:44'
- timestamp:自動存儲記錄修改時間
字段里的時間數(shù)據(jù)會隨其他字段修改的時候自動刷新唉工,這個數(shù)據(jù)類型的字段可以存放這條記錄最后被修改的時間 - YEAR(2), YEAR(4):年份
實驗1:創(chuàng)建數(shù)據(jù)庫hellodb并按下表設置建立第一個表student
列名 | id | name | age | gender |
---|---|---|---|---|
含義 | 學號 | 姓名 | 年齡 | 性別 |
類型 | 數(shù)值 | 字符串 | 數(shù)值 | 字符串 |
范圍 | 0-200 | 不超過20個字符 | 0-100 | 1個字符 |
其他 | 主鍵 | 不允許為空 | 無 | 默認為"m" |
create database hellodb;
use hellodb;
create table student (id tinyint unsigned primary key, name varchar(20) not null, age tinyint unsigned, gender char(1) default "m");
desc student;
- 實驗2:在hellodb數(shù)據(jù)庫中創(chuàng)建表student1研乒,字段設置與實驗1基本相同,唯一的區(qū)別是:id和name構(gòu)成復合主鍵
use hellodb;
create table student1 (id tinyint unsigned, name varchar(20) not null, age tinyint unsigned, gender char(1) default "m", primary key(id, name));
desc student1;
(3)修改表操作
- 語法:
ALTER TABLE 'tbl_name'
ADD col_name data_type [FIRST|AFTER col_name] //添加字段
CHANGE COLUMN old_col_name new_col_name data_type //修改字段名
MODIFY col_name data_type //修改字段屬性
DROP COLUMN col_name //刪除字段
-
實驗3:對數(shù)據(jù)庫hellodb的表student一次做如下操作:
- 在name字段后增加字段phone酵紫,類型為varchar(11)
alter table student add phone varchar(11) after name;
- 修改phone字段的屬性為int
alter table student modify phone int;
- 將name字段定義為唯一鍵
alter table student add unique key(name);
- 建立age字段的索引
alter table student add index(age);
show indexes from student;
查看表student建立索引的字段
主鍵和唯一鍵都會自動建立索引告嘲,name字段的索引也可以看到
- 刪除phone字段
alter table student drop phone;
- 在name字段后增加字段phone酵紫,類型為varchar(11)
(4)索引
-
索引是特殊數(shù)據(jù)結(jié)構(gòu),定義查找時作為查找條件的字段
- 優(yōu)點:提高查詢速度
- 缺點:占用額外空間奖地,影響插入速度
創(chuàng)建索引:必須要有索引名稱
CREATE INDEX index_name ON tbl_name(index_col_name,...);
刪除索引:
DROP INDEX index_name ON tbl_name;
查看索引:
SHOW INDEXES FROM [db_name.]tbl_name;
-
實驗4:索引的添加橄唬、查看、刪除
- 添加表studen字段gender的索引
create index genderindex on student(gender);
- 查看表student的索引(豎列顯示)
show indexes from student\G;
- 刪除表student字段gender的索引
drop index genderindex on student;
- 添加表studen字段gender的索引
(5)DML語句:INSERT, UPDATE, DELETE
INSERT:插入行
INSERT [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} (val1,...),(...),...
UPDATE:更新行
UPDATE tbl_name SET col1=val1, col2=val2, ... [WHERE clause];
DELETE:刪除行
DELETE FROM tbl_name [WHERE clause];
TRUNCATE TABLE tbl_name
:清空表-
實驗5:SQL的DML語句應用
- 測試1:按照下表的內(nèi)容参歹,對表student進行賦值
id name age gender 1 zhao 25 m 2 qian 18 f 3 sun 30 m 4 li 27 m 5 zhou 22 f insert into student (id, name, age, gender) values (1, 'zhao', 25, 'm'); //完整寫法 insert into student (name, id, gender, age) values ('qian', 2, 'f', 18); //注意順序 insert into student values (3, 'sun', 30, 'm'); //可以省略字段描述仰楚,但賦值按照字段默認順序 insert into student values (4, 'li', 27, 'm'), (5, 'zhou', 22, 'f'); //可以一次賦多個值
-
測試2:復制student表并命名為表student2,清空表中的內(nèi)容
create table student2 select * from student
當空表的字段設置與原表完全相同時,可以使用insert語句復制表內(nèi)容:
insert into student2 select * from student;
truncate table student2
truncate語句的效率比delete高僧界,但是由于truncate不記錄日志侨嘀,刪除后的信息無法恢復 測試3:修改、刪除表記錄
將zhao的年齡改為24
update student set age=24 where id=1
將li的年齡改為29捂襟,性別改為f
update student set age=29, gender='f' where name='li'
刪除name為li的記錄
delete from student where name='li';
(6)DQL語句:SELECT
語法:
SELECT col1,col2,... FROM tbl_name [WHERE clause] [ORDER BY 'col_name' [DESC]] [LIMIT [m,]n];
Limit m,n:跳過m個咬腕,要n個字段表示法:
*:所有字段
AS:字段別名,col1 AS alias1-
WHERE 子句:條件描述方式
- 操作符:
- 關(guān)系:
>, <, >=, <=, ==, !=
- 范圍:
BETWEEN ... AND ...
- 模糊匹配 LIKE
%:任意長度的任意字符
_:任意單個字符 - 正則表達式模式匹配:
RLIKE
- 空葬荷,非空判斷:
IS NULL 涨共,IS NOT NULL
- 枚舉:
IN (val1,val2,…)
- 關(guān)系:
- 條件邏輯操作:
and,or宠漩,not
- 操作符:
-
實驗6:SELECT語句的使用
當前表student內(nèi)容如下:id name age gender 1 zhao 25 m 2 qian 18 f 3 sun 30 m 4 li 27 m 5 zhou 22 f 6 wu 17 m 7 zheng 29 NULL 8 wang 33 NULL 查詢本表信息举反,依次實現(xiàn)以下功能:
- 查詢本表中字段id, name,age的信息,顯示時id字段顯示“編號”扒吁,name字段顯示“姓名”火鼻,age字段顯示“年齡”
select id as 編號, name as 姓名, age as 年齡 from student;
- 查詢本表中年齡大于等于20并且小于等于30的記錄
select * from student where age >= 20 and age <= 30;
或者
select * from student where age between 20 and 30;
- 查詢本表中姓名以'z'開頭的記錄,輸出時以年齡升序排序
select * from student where name like 'z%' order by age;
- 查詢本表中姓名不以'w'開頭雕崩,并且不以'n'結(jié)尾的記錄
select * from student where name rlike '^[^w].*[^n]$';
- 查詢本表中性別信息為空的記錄魁索,輸出時以編號降序排序
select * from student where gender is null order by id desc;
- 查詢本表中姓名為"qian", "li", "zhou"的記錄
select * from student where name in ('qian', 'li', 'zhou');
- 查詢本表中字段id, name,age的信息,顯示時id字段顯示“編號”扒吁,name字段顯示“姓名”火鼻,age字段顯示“年齡”
(7)用戶賬號管理
格式:
'user'@'host'
user:用戶名
host:允許用戶通過哪些主機遠程連接mysqld服務,包含:
IP盼铁、網(wǎng)絡地址蛾默、主機名、通配符(%和_)創(chuàng)建用戶:
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
查看當前用戶:
SELECT user();
查看用戶:
SELECT user,host,password FROM user;
刪除用戶:
DROP USER 'username'@'host';
-
更改口令:
- 方法一:
SET PASSWORD FOR 'user'@'host' = PASSWORD('password');
- 方法二:
mysqladmin -u root -pold_password password 'new_password'’
- 方法一:
(8)授權(quán)
-
給用戶授權(quán):
GRANT priv_type,... ON [object_type] db_name.tb_name TO 'user'@'host' [IDENTIFIED BY 'password'];
- priv_type:ALL [INSERT, UPDATE, DELETE, SELECT...]
- db_name.tb_name:
*.*
:所有庫的所有表
db_name.*
:指定庫的所有表
db_name.tb_name
:指定庫的指定表
db_name.routine_name
:指定庫的存儲過程和函數(shù)
查看指定用戶獲得的授權(quán):
SHOW GRANTS FOR 'user'@'host';
回收授權(quán):
REVOKE priv_type, ... ON db_name.tb_name FROM 'user'@'host
FLUSH PRIVILEGES
:手動讓MariaDB的服務進程重讀授權(quán)表-
實驗7:用戶賬號管理捉貌、授權(quán)管理
創(chuàng)建賬號
hellopeiyang@192.168.136.130
并授權(quán)其可以查詢和添加hellodb數(shù)據(jù)庫中的所有表,密碼為'hello'
grant select, insert on hellodb.* to hellopeiyang@192.168.136.130 identified by 'hello';
查看賬號
hellopeiyang@192.168.136.130
獲得的授權(quán)
show grants for hellopeiyang@192.168.136.130
;回收賬號
hellopeiyang@192.168.136.130
在hellodb數(shù)據(jù)庫的所有表的全部授權(quán)
revoke all on hellodb.* from hellopeiyang@192.168.136.130;
刪除賬號
hellopeiyang@192.168.136.130
drop user hellopeiyang@192.168.136.130;