MySQL基本操做之DDL(數據定義語言),DML(數據操縱語言),DQL(數據查詢語言),DCL(數據控制語言)
1、DDL--數據定義語言
做用:數據定義語言主要用來定義數據庫中的各種對象,包括用戶、庫、表、視圖、索引、觸發器、事件、存儲過程和函數等。
常見的DDL操做的基本用法以下:html
CREATE USER #建立用戶 CREATE DATABASE #建立數據庫 CREATE TABLE #建立表 CREATE VIEW #建立視圖 CREATE INDEX #建立索引 CREATE TRIGGER #建立觸發器 CREATE EVENT #建立事件 CREATE PROCEDURE #建立存儲過程 CREATE FUNCTION #建立自定義函數 ...其餘不經常使用的DDL(如:TABLESPACE)操做可自行查閱資料...
一、建立用戶:
詳細用法:CREATE USER 'username'@'[ip/domain/netmask]'mysql
參數解釋: username:表示登錄MySQL實例的用戶名 [ip/domain/ip range]:表示數據庫實例容許的登錄ip,域名或者ip段
示例:建立一個名稱爲bingwang,登錄ip爲192.168.0.10的用戶:正則表達式
mysql> CREATE USER 'bingwang'@'192.168.0.10';
二、建立數據庫,示例以下:算法
詳細用法:sql
CREATE DATABASE db_name;
示例以下:數據庫
#建立一個名稱爲test_db,字符集爲utf8的數據庫 mysql> CREATE DATABASE test_db DEFAULT CHARSET UTF8;
三、建立表:網絡
詳細用法:CREATE TABLE table_name;
示例以下:框架
#建立一個名稱爲t_test,字符集爲utf8,存儲引擎爲InnoDB,字符校驗集爲utf8_general_ci的表: mysql> CREATE TABLE t_test ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY(id) ) ENGINE = InnoDB DEFAUL CHARSET = UTF8 COLLATE = utf8_general_ci;
四、建立視圖:dom
詳細用法:函數
CREATE VIEW view_name as <SELECT phrase>; 參數解釋: <SELECT phrase>:查詢語句
示例以下:
#建立一個視圖t_view,用來查詢t_test中的ID爲1或者2的數據: mysql> CREATE VIEW test_view AS SELECT * FROM t_test WHERE id IN (1,2); #查看建立視圖的過程: mysql> SHOW CREATE VIEW test_view;
五、建立索引,有兩種方法,CREATE和ALTER,下面先介紹一下CREATE:
詳細用法:
CREATE [UNIQUE] INDEX index_name ON table_name(field[num]) <OPTIONS>; 參數解釋: UNIQUE:表示建立的索引類型爲惟一索引,若是建立的爲通常索引能夠忽略該選項 table_name:表名稱 field:表中的某個字段。num爲可選參數,若是field爲字符創類型,表示給該字段的前num個字符建立索引 OPTIONS:表示可選選項,能夠指定索引使用的算法,好比:USING BTREE。不指定默認爲BTREE;
示例以下:
(1)給t_test表中的name字段添加一個惟一索引,使用BTREE做爲其索引算法:
mysql> CREATE UNIQUE INDEX name_ind ON t_test(name) USING BTREE; mysql> SHOW [INDEX/INDEXES] FROM t_test; #查看t_test表中的索引,[INDEX/INDEXES]兩個關鍵字均可以
(2)給t_test表中的name字段的前5個字符建立通常索引,使用BTREE做爲其索引算法:
mysql> CREATE INDEX name_index ON t_test(name(5));
關於索引的更多用法及優化在後面的文章中會詳細講解。
六、建立觸發器:
詳細用法:
CREATE TRIGGER trigger_name trigger_time trigger_event FOR EACH ROW BEGIN trigger_stmt END;
示例:建立觸發器內容稍多,此處先稍微提一下,後面專門章節介紹;
七、建立存儲過程:
詳細用法:
CREATE PROCEDURE procedure_name([proc_parameter[,...]]) BEGIN ...存儲過程體 END
示例:建立存儲過程內容稍多,此處先稍微提一下,後面專門章節介紹;
八、建立自定義函數:
詳細用法:
CREATE FUNCTION function_name([func_parameter[,...]]) RETURNS type BEGIN ...函數體 END
示例:建立自定義函數內容稍多,此處先稍微提一下,後面專門章節介紹;
至此,簡單的DDL操做介紹完成。
2、DML--數據操縱語言:
做用:用來操做數據庫中的表對象,主要包括的操做有:INSERT,UPDATE,DELETE
常見的DML的基本操做方法以下:
#給表中添加數據 INSERT INTO ... #修改表中的數據 UPDATE table_name SET ... #刪除表中的數據 DELETE FROM table_name WHERE <condition>; 注:<condition>:表示DML操做時的條件
一、向表中插入數據:
詳細用法:
mysql> INSERT INTO table_name(field1,field2,[,...]) values(value1,value2),(value3,value4),...;
示例:向學生表中插入一條數據,name:'xiaohong', age:24, gender:'M' ,以下:
(1)建立表:
mysql> CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL DEFAULT '', age TINYINT, gender ENUM('F','M') ) ENGINE = InnoDB DEFAULT CHARSET = UTF8;
(2)插入數據:
mysql> INSERT INTO student(name,age,gender) VALUES('xiaohong',24,'M'); Query OK, 1 row affected (0.09 sec) mysql> SELECT * FROM student; +----+----------+------+--------+ | id | name | age | gender | +----+----------+------+--------+ | 1 | xiaohong | 24 | M | +----+----------+------+--------+ 1 row in set (0.37 sec) 注:主鍵若是自動遞增,插入時可不用指定;
二、修改表中的數據:
詳細用法:
UPDATE table_name SET field1 = value1, field2 = value2, ... , WHERE <condition>;
示例:將student表中id爲1的記錄中的name值修改成:"xiaohua",以下:
mysql> UPDATE STUDENT SET name = 'xiaohua' WHERE id = 1; Query OK, 1 row affected (0.67 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM student; +----+---------+------+--------+ | id | name | age | gender | +----+---------+------+--------+ | 1 | xiaohua | 24 | M | +----+---------+------+--------+ 1 row in set (0.00 sec)
注意:此處修改的時候,必定得注意加條件,不然整個表都會被改。講個技巧:在MySQL的命令中執行操做的時候,能夠在登陸MySQL時添加-U選項,若是忘加條件,會被阻止執行sql語句。登陸命令以下:
[root@WB-BLOG ~]# mysql -uroot -proot -U -h127.0.0.1 -P3306 mysql> UPDATE STUDENT SET name = 'hong'; ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
可見:登陸以後若是不加條件執行UPDATE語句,會被阻止;
三、刪除表中的數據:
詳細用法:
mysql> DELETE FROM table_name WHERE <condition>;
示例:刪除student表中id爲1的記錄,以下:
mysql> DELETE FROM student WHERE id = 1; Query OK, 1 row affected (0.37 sec) mysql> SELECT * FROM student; Empty set (0.00 sec)
注意:注意!注意!!再注意!!!,該操做很是危險,命令行中操做時,須要萬分注意。可使用登陸時加-U參數的方式,防止忘加條件而刪除全部數據,加了-U參數以後,若是不加條件,會被阻止,執行結果以下:
mysql> DELETE FROM student; ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
至此,DML操做介紹完畢。
3、DQL--數據查詢語言
做用:主要用來查看錶中的數據,也是平時使用最多的操做,主要命令爲:SELECT
基本用法以下:
mysql> SELECT fields FROM table_name WHERE <condition>;
注意事項:
fields:表示要查詢的字段列表,可使用代替,可是在程序中最好別寫,由於使用*一方面會下降SQL的查詢效率,查詢到一些用不到的字段;另外一方面,使用一些ORM框架時,若是數據庫中字段有變更,可能會馬上致使程序報錯。
一、簡單不加條件的單表查詢:
用法:
mysql> SELECT * FROM table;
示例略。
二、單表中的條件查詢:
常見的條件:>,>=,<,<= ,=,<>,!=,IN,NOT IN,LIKE,NOT LIKE,REGEXP
示例:
#查詢年齡大於23的記錄 mysql> SELECT * FROM student WHERE age > 23; #查詢年齡大於等於24的記錄,和上面age>23結果相同 mysql> SELECT * FROM student WHERE age >= 24; #查詢年齡小於24的記錄 mysql> SELECT * FROM student WHERE age < 24; #查詢年齡小於等於24的記錄 mysql> SELECT * FROM student WHERE age <= 24; #查詢姓名等於xiaohong的記錄 mysql> SELECT * FROM student WHERE name = 'xiaohong'; #查詢姓名不等於xiaohong的記錄 mysql> SELECT * FROM student WHERE name <> 'xiaohong'; #查詢姓名不等於xiaohong的記錄 mysql> SELECT * FROM student WHERE name != 'xiaohong'; #查詢姓名爲xiaohong或者xiaohui的記錄 mysql> SELECT * FROM student WHERE name in ('xiaohong','xiaohui'); #查詢姓名不是xiaohong和xiaohui的記錄等價於:where name != xiaohong and name != xiaohui mysql> SELECT * FROM student WHERE name not in ('xiaohong','xiaohui'); #查詢姓名以xiao開頭的記錄 mysql> SELECT * FROM student WHERE name like 'xiao%'; #查詢姓名以xiaohon開頭的記錄,後面模糊匹配一位,如:xiaohong,xiaohoni mysql> SELECT * FROM student WHERE name like 'xiaohon_'; #查詢姓名中包含ao字符創的記錄 mysql> SELECT * FROM student WHERE name like '%ao%'; #查詢以hong結尾的記錄 mysql> SELECT * FROM student WHERE name not like '%hong'; #使用正則表達式查詢姓名以xiao開頭的記錄 mysql> SELECT * FROM student WHERE name REGEXP('^xiao'); #使用正則表達式查詢姓名以hong結尾的記錄 mysql> SELECT * FROM student WHERE name REGEXP('hong$'); #支持的其餘複雜的正則表達式,請參閱資料:
正則表達式教程:http://www.runoob.com/regexp/...
注意:
(1)當某個字段上有索引時,使用上述的反向查詢或者前模糊查詢,如:<>,!=,NOT LIKE,NOT IN,LIKE "%test",將會不走索引;
(2)查詢中的潛在問題:若是某個字段在建立表結構的時候未設置非空,則使用WHERE name!="BING"的時候,將不會包含name爲NULL的記錄;
示例:查詢student表中年齡大於"xiaohong"年齡的記錄的數量:
mysql> SELECT COUNT(*) FROM student WHERE age > (SELECT age FROM student WHERE name = 'xiaohong'); +----------+ | COUNT(*) | +----------+ | 2 | +----------+ 1 row in set (0.46 sec)
三、分頁查詢:
用法:
mysql> SELECT * FROM table_name LIMIT start,num;
參數解釋:
start:開始位置,默認從0開始;
num:偏移量,即:從開始位置向後查詢的數據條數;
示例:查詢test表中,第二頁的數據,每頁顯示10條,以下:
mysql> SELECT * FROM student LIMIT 1,10;
四、使用ORDER BY對查詢結果進行排序:
用法:
SELECT * FROM table_name <where condition> ORDER BY <field> ASC/DESC;
示例:從student表中查詢出全部年齡大於20的學生記錄,而且按照年齡age倒序排列,以下:
SELECT * FROM student WHERE age > 20 ORDER BY age DESC;
注意:若是在排序時ORDER BY <field>以後沒有添加DESC和ASC關鍵字,默認按照ASC升序排列;
五、使用GROUP BY對查詢結果集進行分組
基本用法:
mysql> SELECT res FROM table_name <where condition> GROUP BY <field>;
示例:查詢student表中男生和女生的數量:
mysql> SELECT gender,COUNT(*) FROM student GROUP BY gender;
六、使用GROUP BY以後,在使用HAVING完成分組以後的條件查詢
基本用法:
SELECT res FROM table_name <where condition> GROUP BY <field> <having condition>;
示例:查詢student_course表中有3門成績大於等於80的學生學號
(1)建立測試表結構:
mysql> CREATE TABLE student_course( sno INT(11) NOT NULL, cno INT(11) NOT NULL, grade SMALLINT NOT NULL DEFAULT 0 )ENGINE = InnoDB DEFAULT CHARSET = UTF8;
(2)插入測試數據:
INSERT INTO student_course(sno,cno,grade) VALUES(1,100,79); INSERT INTO student_course(sno,cno,grade) VALUES(1,101,89); INSERT INTO student_course(sno,cno,grade) VALUES(1,102,87); INSERT INTO student_course(sno,cno,grade) VALUES(1,103,99); INSERT INTO student_course(sno,cno,grade) VALUES(2,100,90); INSERT INTO student_course(sno,cno,grade) VALUES(2,101,80); INSERT INTO student_course(sno,cno,grade) VALUES(2,102,77); INSERT INTO student_course(sno,cno,grade) VALUES(2,103,79); INSERT INTO student_course(sno,cno,grade) VALUES(3,100,89); INSERT INTO student_course(sno,cno,grade) VALUES(3,101,90); INSERT INTO student_course(sno,cno,grade) VALUES(3,102,83); INSERT INTO student_course(sno,cno,grade) VALUES(3,103,91);
(3)查詢:
mysql> SELECT sno,SUM(CASE WHEN grade > 80 THEN 1 ELSE 0 END) num FROM student_course GROUP BY sno HAVING num >= 3; +-----+------+ | sno | num | +-----+------+ | 1 | 3 | | 3 | 4 | +-----+------+ 2 rows in set (0.45 sec)
4、DCL--數據控制語言
做用:用來授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果。
一、GRANT授予用戶權限:
基本用法:
mysql> GRANT priv_type ON <object_type> TO user <WITH {GRANT OPTION | resource_option} ...>;
示例:給用戶jerry授予對test_db數據庫的增刪改查權限,容許該用戶從IP爲'192.168.0.10'的網絡登陸
(1)方法一:
mysql> GRANT INSERT,SELECT,UPDATE,DELETE ON test_db.* TO 'jerry'@'192.168.0.10' IDENTIFIED BY 'password' WITH GRANT OPTION;
(2)方法二:
mysql> CREATE USER 'jerry'@'192.168.0.10' IDENTIFIED BY 'password'; mysql> GRANT INSERT,SELECT,UPDATE,DELETE ON test_db.* TO 'jerry'@'192.168.0.10';
二、REVOKE收回用戶權限:
基本用法:
mysql> REVOKE priv_type ON <object_type> FROM 'jerry'@'192.168.0.10';
示例:收回用戶對test_db庫的刪除權限:
mysql> REVOKE DELETE ON test_db.* FROM 'jerry'@'192.168.0.10';
三、查看給某個用戶所授予的權限:
基本用法:
mysql> SHOW GRANTS FOR user;
示例:查詢給'jerry'@'192.168.0.10'所授予的全部權限:
mysql> SHOW GRANTS FOR 'jerry'@'192.168.0.10';
四、查詢可授予的全部權限,使用技巧:
(1)首先將某個庫(如:test_db)的全部權限授予給用戶'jerry'@'localhost'
mysql> GRANT ALL ON test_db.* TO 'jerry'@'localhost' IDENTIFIED BY 'jerry';
(2)收回某個權限,如:查詢權限
mysql> REVOKE SELECT ON test_db.* FROM 'jerry'@'localhost';
(3)查看剩餘權限,就能夠查到除了查詢權限以外的權限,再加上查詢權限便可授予的全部權限
mysql> SHOW GRANTS FOR 'jerry'@'localhost';
至此,MySQL的基本操做DDL,DML,DQL,DCL介紹完畢。
下面幾回次章節專門介紹觸發器、存儲過程和函數,你們有什麼想法或者但願重點介紹MySQL的哪一個模塊能夠在下方留言,一塊學習數據庫,歡迎轉發~
後續文章將更新在我的小站上,歡迎查看。