MySQL基本操做之-DDL,DML,DQL,DCL

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的哪一個模塊能夠在下方留言,一塊學習數據庫,歡迎轉發~
後續文章將更新在我的小站上,歡迎查看。

相關文章
相關標籤/搜索