--- title: SQLè¯æ³åºç¡ç¥è¯æ»ç» description: SQLè¯æ³åºç¡ç¥è¯æ»ç»ï¼ç³»ç»è®²è§£DDLæ°æ®å®ä¹ãDMLæ°æ®æä½ãDQLæ°æ®æ¥è¯¢ãDCLæ°æ®æ§å¶è¯è¨ï¼æ¶µç表æä½ã约æãç´¢å¼ãäºå¡ãè¿æ¥æ¥è¯¢çæ ¸å¿ç¥è¯ç¹ã category: æ°æ®åº tag: - æ°æ®åºåºç¡ - SQL head: - - meta - name: keywords content: SQLè¯æ³,DDL,DML,DQL,DCL,CREATE,SELECT,INSERT,UPDATE,DELETE,JOINè¿æ¥,åæ¥è¯¢ --- > æ¬ææ´çå®åèªä¸é¢è¿ä¸¤ä»½èµæï¼ > > - [SQL è¯æ³éææå](https://juejin.cn/post/6844903790571700231) > - [MySQL è¶ å ¨æç¨](https://www.begtut.com/mysql/mysql-tutorial.html) ## åºæ¬æ¦å¿µ ### æ°æ®åºæ¯è¯ - `æ°æ®åºï¼databaseï¼` - ä¿åæç»ç»çæ°æ®ç容å¨ï¼é常æ¯ä¸ä¸ªæä»¶æä¸ç»æä»¶ï¼ã - `æ°æ®è¡¨ï¼tableï¼` - æç§ç¹å®ç±»åæ°æ®çç»æåæ¸ åã - `模å¼ï¼schemaï¼` - å ³äºæ°æ®åºå表çå¸å±åç¹æ§çä¿¡æ¯ã模å¼å®ä¹äºæ°æ®å¨è¡¨ä¸å¦ä½åå¨ï¼å å«åå¨ä»ä¹æ ·çæ°æ®ï¼æ°æ®å¦ä½åè§£ï¼åé¨åä¿¡æ¯å¦ä½å½åçä¿¡æ¯ãæ°æ®åºåè¡¨é½ææ¨¡å¼ã - `åï¼columnï¼` - 表ä¸çä¸ä¸ªåæ®µãææè¡¨é½æ¯ç±ä¸ä¸ªæå¤ä¸ªåç»æçã - `è¡ï¼rowï¼` - 表ä¸çä¸ä¸ªè®°å½ã - `主é®ï¼primary keyï¼` - ä¸åï¼æä¸ç»åï¼ï¼å ¶å¼è½å¤å¯ä¸æ è¯è¡¨ä¸æ¯ä¸è¡ã ### SQL è¯æ³ SQLï¼Structured Query Language)ï¼æ å SQL ç± ANSI æ åå§åä¼ç®¡çï¼ä»è称为 ANSI SQLãå个 DBMS 齿èªå·±çå®ç°ï¼å¦ PL/SQLãTransact-SQL çã #### SQL è¯æ³ç»æ  SQL è¯æ³ç»æå æ¬ï¼ - **`åå¥`** - æ¯è¯å¥åæ¥è¯¢çç»ææåãï¼å¨æäºæ åµä¸ï¼è¿äºé½æ¯å¯éçãï¼ - **`表达å¼`** - å¯ä»¥äº§ç任使 éå¼ï¼æç±ååè¡çæ°æ®åºè¡¨ - **`è°è¯`** - ç»éè¦è¯ä¼°ç SQL ä¸å¼é»è¾ï¼3VLï¼ï¼true/false/unknownï¼æå¸å°ç弿宿¡ä»¶ï¼å¹¶éå¶è¯å¥åæ¥è¯¢çææï¼ææ¹åç¨åºæµç¨ã - **`æ¥è¯¢`** - åºäºç¹å®æ¡ä»¶æ£ç´¢æ°æ®ãè¿æ¯ SQL çä¸ä¸ªéè¦ç»æé¨åã - **`è¯å¥`** - å¯ä»¥æä¹ å°å½±å纲è¦åæ°æ®ï¼ä¹å¯ä»¥æ§å¶æ°æ®åºäºå¡ãç¨åºæµç¨ãè¿æ¥ãä¼è¯æè¯æã #### SQL è¯æ³è¦ç¹ - **SQL è¯å¥ä¸åºå大å°å**ï¼ä½æ¯æ°æ®åºè¡¨åãååå弿¯å¦åºåï¼ä¾èµäºå ·ä½ç DBMS 以åé ç½®ãä¾å¦ï¼`SELECT` ä¸ `select`ã`Select` æ¯ç¸åçã - **夿¡ SQL è¯å¥å¿ 须以åå·ï¼`;`ï¼åé**ã - å¤ç SQL è¯å¥æ¶ï¼**ææç©ºæ ¼é½è¢«å¿½ç¥**ã SQL è¯å¥å¯ä»¥åæä¸è¡ï¼ä¹å¯ä»¥åå为å¤è¡ã ```sql -- ä¸è¡ SQL è¯å¥ UPDATE user SET username='robot', password='robot' WHERE username = 'root'; -- å¤è¡ SQL è¯å¥ UPDATE user SET username='robot', password='robot' WHERE username = 'root'; ``` SQL æ¯æä¸ç§æ³¨éï¼ ```sql ## 注é1 -- 注é2 /* 注é3 */ ``` ### SQL åç±» #### æ°æ®å®ä¹è¯è¨ï¼DDLï¼ æ°æ®å®ä¹è¯è¨ï¼Data Definition Languageï¼DDLï¼æ¯ SQL è¯è¨éä¸è´è´£æ°æ®ç»æå®ä¹ä¸æ°æ®åºå¯¹è±¡å®ä¹çè¯è¨ã DDL ç主è¦åè½æ¯**å®ä¹æ°æ®åºå¯¹è±¡**ã DDL çæ ¸å¿æä»¤æ¯ `CREATE`ã`ALTER`ã`DROP`ã #### æ°æ®æçºµè¯è¨ï¼DMLï¼ æ°æ®æçºµè¯è¨ï¼Data Manipulation Language, DMLï¼æ¯ç¨äºæ°æ®åºæä½ï¼å¯¹æ°æ®åºå ¶ä¸çå¯¹è±¡åæ°æ®è¿è¡è®¿é®å·¥ä½çç¼ç¨è¯å¥ã DML ç主è¦åè½æ¯ **è®¿é®æ°æ®**ï¼å æ¤å ¶è¯æ³é½æ¯ä»¥**è¯»åæ°æ®åº**为主ã DML çæ ¸å¿æä»¤æ¯ `INSERT`ã`UPDATE`ã`DELETE`ã`SELECT`ãè¿å个æä»¤åç§° CRUD(Create, Read, Update, Delete)ï¼å³å¢å æ¹æ¥ã #### äºå¡æ§å¶è¯è¨ï¼TCLï¼ äºå¡æ§å¶è¯è¨ (Transaction Control Language, TCL) ç¨äº**ç®¡çæ°æ®åºä¸çäºå¡**ãè¿äºç¨äºç®¡çç± DML è¯å¥æåçæ´æ¹ãå®è¿å 许å°è¯å¥åç»ä¸ºé»è¾äºå¡ã TCL çæ ¸å¿æä»¤æ¯ `COMMIT`ã`ROLLBACK`ã #### æ°æ®æ§å¶è¯è¨ï¼DCLï¼ æ°æ®æ§å¶è¯è¨ (Data Control Language, DCL) æ¯ä¸ç§å¯å¯¹æ°æ®è®¿é®æè¿è¡æ§å¶çæä»¤ï¼å®å¯ä»¥æ§å¶ç¹å®ç¨æ·è´¦æ·å¯¹æ°æ®è¡¨ãæ¥ç表ãé¢åç¨åºãç¨æ·èªå®ä¹å½æ°çæ°æ®åºå¯¹è±¡çæ§å¶æã DCL çæ ¸å¿æä»¤æ¯ `GRANT`ã`REVOKE`ã DCL 以**æ§å¶ç¨æ·çè®¿é®æé**为主ï¼å æ¤å ¶æä»¤ä½æ³å¹¶ä¸å¤æï¼å¯å©ç¨ DCL æ§å¶çæéæï¼`CONNECT`ã`SELECT`ã`INSERT`ã`UPDATE`ã`DELETE`ã`EXECUTE`ã`USAGE`ã`REFERENCES`ã æ ¹æ®ä¸åç DBMS 以åä¸åçå®å ¨æ§å®ä½ï¼å ¶æ¯æçæéæ§å¶ä¹ææä¸åã **æä»¬å æ¥ä»ç» DML è¯å¥ç¨æ³ã DML ç主è¦åè½æ¯è¯»åæ°æ®åºå®ç°å¢å æ¹æ¥ã** ## å¢å æ¹æ¥ å¢å æ¹æ¥ï¼å称为 CRUDï¼æ°æ®åºåºæ¬æä½ä¸çåºæ¬æä½ã ### æå ¥æ°æ® `INSERT INTO` è¯å¥ç¨äºåè¡¨ä¸æå ¥æ°è®°å½ã **æå ¥å®æ´çè¡** ```sql # æå ¥ä¸è¡ INSERT INTO user VALUES (10, 'root', 'root', '[email protected]'); # æå ¥å¤è¡ INSERT INTO user VALUES (10, 'root', 'root', '[email protected]'), (12, 'user1', 'user1', '[email protected]'), (18, 'user2', 'user2', '[email protected]'); ``` **æå ¥è¡çä¸é¨å** ```sql INSERT INTO user(username, password, email) VALUES ('admin', 'admin', '[email protected]'); ``` **æå ¥æ¥è¯¢åºæ¥çæ°æ®** ```sql INSERT INTO user(username) SELECT name FROM account; ``` ### æ´æ°æ°æ® `UPDATE` è¯å¥ç¨äºæ´æ°è¡¨ä¸çè®°å½ã ```sql UPDATE user SET username='robot', password='robot' WHERE username = 'root'; ``` ### å 餿°æ® - `DELETE` è¯å¥ç¨äºå é¤è¡¨ä¸çè®°å½ã - `TRUNCATE TABLE` å¯ä»¥æ¸ 空表ï¼ä¹å°±æ¯å 餿æè¡ã说æï¼`TRUNCATE` è¯å¥ä¸å±äº DML è¯æ³èæ¯ DDL è¯æ³ã **å é¤è¡¨ä¸çæå®æ°æ®** ```sql DELETE FROM user WHERE username = 'robot'; ``` **æ¸ ç©ºè¡¨ä¸çæ°æ®** ```sql TRUNCATE TABLE user; ``` ### æ¥è¯¢æ°æ® `SELECT` è¯å¥ç¨äºä»æ°æ®åºä¸æ¥è¯¢æ°æ®ã `DISTINCT` ç¨äºè¿åå¯ä¸ä¸åçå¼ãå®ä½ç¨äºææåï¼ä¹å°±æ¯è¯´ææåçå¼é½ç¸åæç®ç¸åã `LIMIT` éå¶è¿åçè¡æ°ãå¯ä»¥æä¸¤ä¸ªåæ°ï¼ç¬¬ä¸ä¸ªåæ°ä¸ºèµ·å§è¡ï¼ä» 0 å¼å§ï¼ç¬¬äºä¸ªåæ°ä¸ºè¿åçæ»è¡æ°ã - `ASC`ï¼ååºï¼é»è®¤ï¼ - `DESC`ï¼éåº **æ¥è¯¢åå** ```sql SELECT prod_name FROM products; ``` **æ¥è¯¢å¤å** ```sql SELECT prod_id, prod_name, prod_price FROM products; ``` **æ¥è¯¢ææå** ```sql SELECT * FROM products; ``` **æ¥è¯¢ä¸åçå¼** ```sql SELECT DISTINCT vend_id FROM products; ``` **éå¶æ¥è¯¢ç»æ** ```sql -- è¿åå 5 è¡ SELECT * FROM mytable LIMIT 5; SELECT * FROM mytable LIMIT 0, 5; -- è¿å第 3 ~ 5 è¡ SELECT * FROM mytable LIMIT 2, 3; ``` ## æåº `order by` ç¨äºå¯¹ç»æéæç §ä¸ä¸ªåæè å¤ä¸ªåè¿è¡æåºãé»è®¤æç §ååºå¯¹è®°å½è¿è¡æåºï¼å¦æéè¦æç §éåºå¯¹è®°å½è¿è¡æåºï¼å¯ä»¥ä½¿ç¨ `desc` å ³é®åã `order by` 对å¤åæåºçæ¶åï¼å æåºçåæ¾åé¢ï¼åæåºçåæ¾åé¢ãå¹¶ä¸ï¼ä¸åçåå¯ä»¥æä¸åçæåºè§åã ```sql SELECT * FROM products ORDER BY prod_price DESC, prod_name ASC; ``` ## åç» **`group by`**ï¼ - `group by` åå¥å°è®°å½åç»å°æ±æ»è¡ä¸ã - `group by` 为æ¯ä¸ªç»è¿åä¸ä¸ªè®°å½ã - `group by` éå¸¸è¿æ¶åèå`count`ï¼`max`ï¼`sum`ï¼`avg` çã - `group by` å¯ä»¥æä¸åæå¤åè¿è¡åç»ã - `group by` æåç»å段è¿è¡æåºåï¼`order by` å¯ä»¥ä»¥æ±æ»å段æ¥è¿è¡æåºã **åç»** ```sql SELECT cust_name, COUNT(cust_address) AS addr_num FROM Customers GROUP BY cust_name; ``` **åç»åæåº** ```sql SELECT cust_name, COUNT(cust_address) AS addr_num FROM Customers GROUP BY cust_name ORDER BY cust_name DESC; ``` **`having`**ï¼ - `having` ç¨äºå¯¹æ±æ»ç `group by` ç»æè¿è¡è¿æ»¤ã - `having` ä¸è¬é½æ¯å `group by` è¿ç¨ã - `where` å `having` å¯ä»¥å¨ç¸åçæ¥è¯¢ä¸ã **ä½¿ç¨ WHERE å HAVING è¿æ»¤æ°æ®** ```sql SELECT cust_name, COUNT(*) AS NumberOfOrders FROM Customers WHERE cust_email IS NOT NULL GROUP BY cust_name HAVING COUNT(*) > 1; ``` **`having` vs `where`**ï¼ - `where`ï¼è¿æ»¤è¿æ»¤æå®çè¡ï¼åé¢ä¸è½å èå彿°ï¼åç»å½æ°ï¼ã`where` å¨`group by` åã - `having`ï¼è¿æ»¤åç»ï¼ä¸è¬é½æ¯å `group by` è¿ç¨ï¼ä¸è½åç¬ä½¿ç¨ã`having` å¨ `group by` ä¹åã ## åæ¥è¯¢ åæ¥è¯¢æ¯åµå¥å¨è¾å¤§æ¥è¯¢ä¸ç SQL æ¥è¯¢ï¼ä¹ç§°å 鍿¥è¯¢æå é¨éæ©ï¼å å«åæ¥è¯¢çè¯å¥ä¹ç§°ä¸ºå¤é¨æ¥è¯¢æå¤é¨éæ©ãç®åæ¥è¯´ï¼åæ¥è¯¢å°±æ¯æå°ä¸ä¸ª `select` æ¥è¯¢ï¼åæ¥è¯¢ï¼çç»æä½ä¸ºå¦ä¸ä¸ª SQL è¯å¥ï¼ä¸»æ¥è¯¢ï¼çæ°æ®æ¥æºæè 夿æ¡ä»¶ã åæ¥è¯¢å¯ä»¥åµå ¥ `SELECT`ã`INSERT`ã`UPDATE` å `DELETE` è¯å¥ä¸ï¼ä¹å¯ä»¥å `=`ã`<`ã`>`ã`IN`ã`BETWEEN`ã`EXISTS` çè¿ç®ç¬¦ä¸èµ·ä½¿ç¨ã åæ¥è¯¢å¸¸ç¨å¨ `WHERE` åå¥å `FROM` åå¥åè¾¹ï¼ - å½ç¨äº `WHERE` å奿¶ï¼æ ¹æ®ä¸åçè¿ç®ç¬¦ï¼åæ¥è¯¢å¯ä»¥è¿ååè¡ååãå¤è¡ååãåè¡å¤åæ°æ®ãåæ¥è¯¢å°±æ¯è¦è¿åè½å¤ä½ä¸º `WHERE` å奿¥è¯¢æ¡ä»¶çå¼ã - å½ç¨äº `FROM` å奿¶ï¼ä¸è¬è¿åå¤è¡å¤åæ°æ®ï¼ç¸å½äºè¿åä¸å¼ 临æ¶è¡¨ï¼è¿æ ·æç¬¦å `FROM` å颿¯è¡¨çè§åãè¿ç§åæ³è½å¤å®ç°å¤è¡¨èåæ¥è¯¢ã > 注æï¼MYSQL æ°æ®åºä» 4.1 çæ¬æå¼å§æ¯æåæ¥è¯¢ï¼æ©æçæ¬æ¯ä¸æ¯æçã ç¨äº `WHERE` åå¥çåæ¥è¯¢çåºæ¬è¯æ³å¦ä¸ï¼ ```sql select column_name [, column_name ] from table1 [, table2 ] where column_name operator (select column_name [, column_name ] from table1 [, table2 ] [where]) ``` - åæ¥è¯¢éè¦æ¾å¨æ¬å·`( )`å ã - `operator` 表示ç¨äº where åå¥çè¿ç®ç¬¦ã ç¨äº `FROM` åå¥çåæ¥è¯¢çåºæ¬è¯æ³å¦ä¸ï¼ ```sql select column_name [, column_name ] from (select column_name [, column_name ] from table1 [, table2 ] [where]) as temp_table_name where condition ``` ç¨äº `FROM` çåæ¥è¯¢è¿åçç»æç¸å½äºä¸å¼ 临æ¶è¡¨ï¼æä»¥éè¦ä½¿ç¨ AS å ³é®å为该临æ¶è¡¨èµ·ä¸ä¸ªååã **åæ¥è¯¢çåæ¥è¯¢** ```sql SELECT cust_name, cust_contact FROM customers WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'RGAN01')); ``` å 鍿¥è¯¢é¦å å¨å ¶ç¶æ¥è¯¢ä¹åæ§è¡ï¼ä»¥ä¾¿å¯ä»¥å°å 鍿¥è¯¢çç»æä¼ éç»å¤é¨æ¥è¯¢ãæ§è¡è¿ç¨å¯ä»¥åèä¸å¾ï¼  ### WHERE - `WHERE` åå¥ç¨äºè¿æ»¤è®°å½ï¼å³ç¼©å°è®¿é®æ°æ®çèå´ã - `WHERE` åè·ä¸ä¸ªè¿å `true` æ `false` çæ¡ä»¶ã - `WHERE` å¯ä»¥ä¸ `SELECT`ï¼`UPDATE` å `DELETE` ä¸èµ·ä½¿ç¨ã - å¯ä»¥å¨ `WHERE` åå¥ä¸ä½¿ç¨çæä½ç¬¦ã | è¿ç®ç¬¦ | æè¿° | | ------- | ------------------------------------------------------ | | = | çäº | | <> | ä¸çäºã注éï¼å¨ SQL çä¸äºçæ¬ä¸ï¼è¯¥æä½ç¬¦å¯è¢«åæ != | | > | å¤§äº | | < | å°äº | | >= | 大äºçäº | | <= | å°äºçäº | | BETWEEN | å¨æä¸ªèå´å | | LIKE | æç´¢æç§æ¨¡å¼ | | IN | æå®é对æä¸ªåçå¤ä¸ªå¯è½å¼ | **`SELECT` è¯å¥ä¸ç `WHERE` åå¥** ```ini SELECT * FROM Customers WHERE cust_name = 'Kids Place'; ``` **`UPDATE` è¯å¥ä¸ç `WHERE` åå¥** ```ini UPDATE Customers SET cust_name = 'Jack Jones' WHERE cust_name = 'Kids Place'; ``` **`DELETE` è¯å¥ä¸ç `WHERE` åå¥** ```ini DELETE FROM Customers WHERE cust_name = 'Kids Place'; ``` ### IN å BETWEEN - `IN` æä½ç¬¦å¨ `WHERE` åå¥ä¸ä½¿ç¨ï¼ä½ç¨æ¯å¨æå®çå 个ç¹å®å¼ä¸ä»»éä¸ä¸ªå¼ã - `BETWEEN` æä½ç¬¦å¨ `WHERE` åå¥ä¸ä½¿ç¨ï¼ä½ç¨æ¯éåä»äºæä¸ªèå´å çå¼ã **IN 示ä¾** ```sql SELECT * FROM products WHERE vend_id IN ('DLL01', 'BRS01'); ``` **BETWEEN 示ä¾** ```sql SELECT * FROM products WHERE prod_price BETWEEN 3 AND 5; ``` ### ANDãORãNOT - `AND`ã`OR`ã`NOT` æ¯ç¨äºå¯¹è¿æ»¤æ¡ä»¶çé»è¾å¤çæä»¤ã - `AND` ä¼å 级é«äº `OR`ï¼ä¸ºäºæç¡®å¤ç顺åºï¼å¯ä»¥ä½¿ç¨ `()`ã - `AND` æä½ç¬¦è¡¨ç¤ºå·¦å³æ¡ä»¶é½è¦æ»¡è¶³ã - `OR` æä½ç¬¦è¡¨ç¤ºå·¦å³æ¡ä»¶æ»¡è¶³ä»»æä¸ä¸ªå³å¯ã - `NOT` æä½ç¬¦ç¨äºå¦å®ä¸ä¸ªæ¡ä»¶ã **AND 示ä¾** ```sql SELECT prod_id, prod_name, prod_price FROM products WHERE vend_id = 'DLL01' AND prod_price <= 4; ``` **OR 示ä¾** ```ini SELECT prod_id, prod_name, prod_price FROM products WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'; ``` **NOT 示ä¾** ```sql SELECT * FROM products WHERE prod_price NOT BETWEEN 3 AND 5; ``` ### LIKE - `LIKE` æä½ç¬¦å¨ `WHERE` åå¥ä¸ä½¿ç¨ï¼ä½ç¨æ¯ç¡®å®å符串æ¯å¦å¹é 模å¼ã - åªæåæ®µæ¯ææ¬å¼æ¶æä½¿ç¨ `LIKE`ã - `LIKE` æ¯æä¸¤ä¸ªéé 符å¹é é项ï¼`%` å `_`ã - ä¸è¦æ»¥ç¨éé 符ï¼éé 符ä½äºå¼å¤´å¤å¹é ä¼éå¸¸æ ¢ã - `%` 表示任ä½å符åºç°ä»»ææ¬¡æ°ã - `_` 表示任ä½å符åºç°ä¸æ¬¡ã **% 示ä¾** ```sql SELECT prod_id, prod_name, prod_price FROM products WHERE prod_name LIKE '%bean bag%'; ``` **\_ 示ä¾** ```sql SELECT prod_id, prod_name, prod_price FROM products WHERE prod_name LIKE '__ inch teddy bear'; ``` ## è¿æ¥ JOIN æ¯âè¿æ¥âçææï¼é¡¾åæä¹ï¼SQL JOIN åå¥ç¨äºå°ä¸¤ä¸ªæè å¤ä¸ªè¡¨èåèµ·æ¥è¿è¡æ¥è¯¢ã è¿æ¥è¡¨æ¶éè¦å¨æ¯ä¸ªè¡¨ä¸éæ©ä¸ä¸ªå段ï¼å¹¶å¯¹è¿äºå段çå¼è¿è¡æ¯è¾ï¼å¼ç¸åç两æ¡è®°å½å°åå¹¶ä¸ºä¸æ¡ã**è¿æ¥è¡¨çæ¬è´¨å°±æ¯å°ä¸å表çè®°å½åå¹¶èµ·æ¥ï¼å½¢æä¸å¼ æ°è¡¨ãå½ç¶ï¼è¿å¼ æ°è¡¨åªæ¯ä¸´æ¶çï¼å®ä» åå¨äºæ¬æ¬¡æ¥è¯¢æé´**ã ä½¿ç¨ `JOIN` è¿æ¥ä¸¤ä¸ªè¡¨çåºæ¬è¯æ³å¦ä¸ï¼ ```sql select table1.column1, table2.column2... from table1 join table2 on table1.common_column1 = table2.common_column2; ``` `table1.common_column1 = table2.common_column2` æ¯è¿æ¥æ¡ä»¶ï¼åªææ»¡è¶³æ¤æ¡ä»¶çè®°å½æä¼å并为ä¸è¡ãæ¨å¯ä»¥ä½¿ç¨å¤ä¸ªè¿ç®ç¬¦æ¥è¿æ¥è¡¨ï¼ä¾å¦ =ã>ã<ã<>ã<=ã>=ã!=ã`between`ã`like` æè `not`ï¼ä½æ¯æå¸¸è§çæ¯ä½¿ç¨ =ã å½ä¸¤ä¸ªè¡¨ä¸æååçåæ®µæ¶ï¼ä¸ºäºå¸®å©æ°æ®åºå¼æåºåæ¯åªä¸ªè¡¨çåæ®µï¼å¨ä¹¦ååååæ®µåæ¶éè¦å ä¸è¡¨åãå½ç¶ï¼å¦æä¹¦åçåæ®µåå¨ä¸¤ä¸ªè¡¨ä¸æ¯å¯ä¸çï¼ä¹å¯ä»¥ä¸ä½¿ç¨ä»¥ä¸æ ¼å¼ï¼åªååæ®µåå³å¯ã å¦å¤ï¼å¦æä¸¤å¼ 表çå ³èåæ®µåç¸åï¼ä¹å¯ä»¥ä½¿ç¨ `USING`å奿¥ä»£æ¿ `ON`ï¼ä¸¾ä¸ªä¾åï¼ ```sql # join....on select c.cust_name, o.order_num from Customers c inner join Orders o on c.cust_id = o.cust_id order by c.cust_name; # å¦æä¸¤å¼ è¡¨çå ³èåæ®µåç¸åï¼ä¹å¯ä»¥ä½¿ç¨USINGåå¥ï¼join....using() select c.cust_name, o.order_num from Customers c inner join Orders o using(cust_id) order by c.cust_name; ``` **`ON` å `WHERE` çåºå«**ï¼ - è¿æ¥è¡¨æ¶ï¼SQL 伿 ¹æ®è¿æ¥æ¡ä»¶çæä¸å¼ æ°ç临æ¶è¡¨ã`ON` å°±æ¯è¿æ¥æ¡ä»¶ï¼å®å³å®ä¸´æ¶è¡¨ççæã - `WHERE` æ¯å¨ä¸´æ¶è¡¨çæä»¥åï¼å对临æ¶è¡¨ä¸çæ°æ®è¿è¡è¿æ»¤ï¼çææç»çç»æéï¼è¿ä¸ªæ¶åå·²ç»æ²¡æ JOIN-ON äºã æä»¥æ»ç»æ¥è¯´å°±æ¯ï¼**SQL å æ ¹æ® ON çæä¸å¼ 临æ¶è¡¨ï¼ç¶ååæ ¹æ® WHERE 对临æ¶è¡¨è¿è¡çé**ã SQL å è®¸å¨ `JOIN` 左边å ä¸ä¸äºä¿®é¥°æ§çå ³é®è¯ï¼ä»èå½¢æä¸åç±»åçè¿æ¥ï¼å¦ä¸è¡¨æç¤ºï¼ | è¿æ¥ç±»å | 说æ | | ---------------------------------------- | --------------------------------------------------------------------------------------------- | | INNER JOIN å è¿æ¥ | ï¼é»è®¤è¿æ¥æ¹å¼ï¼åªæå½ä¸¤ä¸ªè¡¨é½å卿»¡è¶³æ¡ä»¶çè®°å½æ¶æä¼è¿åè¡ã | | LEFT JOIN / LEFT OUTER JOIN å·¦(å¤)è¿æ¥ | è¿å左表ä¸çææè¡ï¼å³ä½¿å³è¡¨ä¸æ²¡ææ»¡è¶³æ¡ä»¶çè¡ä¹æ¯å¦æ¤ã | | RIGHT JOIN / RIGHT OUTER JOIN å³(å¤)è¿æ¥ | è¿åå³è¡¨ä¸çææè¡ï¼å³ä½¿å·¦è¡¨ä¸æ²¡ææ»¡è¶³æ¡ä»¶çè¡ä¹æ¯å¦æ¤ã | | FULL JOIN / FULL OUTER JOIN å ¨(å¤)è¿æ¥ | åªè¦å ¶ä¸æä¸ä¸ªè¡¨å卿»¡è¶³æ¡ä»¶çè®°å½ï¼å°±è¿åè¡ã | | SELF JOIN | å°ä¸ä¸ªè¡¨è¿æ¥å°èªèº«ï¼å°±å该表æ¯ä¸¤ä¸ªè¡¨ä¸æ ·ã为äºåºå两个表ï¼å¨ SQL è¯å¥ä¸éè¦è³å°éå½åä¸ä¸ªè¡¨ã | | CROSS JOIN | 交åè¿æ¥ï¼ä»ä¸¤ä¸ªæè å¤ä¸ªè¿æ¥è¡¨ä¸è¿åè®°å½éçç¬å¡å°ç§¯ã | ä¸å¾å±ç¤ºäº LEFT JOINãRIGHT JOINãINNER JOINãOUTER JOIN ç¸å ³ç 7 ç§ç¨æ³ã  妿ä¸å ä»»ä½ä¿®é¥°è¯ï¼åªå `JOIN`ï¼é£ä¹é»è®¤ä¸º `INNER JOIN` å¯¹äº `INNER JOIN` æ¥è¯´ï¼è¿æä¸ç§éå¼çåæ³ï¼ç§°ä¸º â**éå¼å è¿æ¥**âï¼ä¹å°±æ¯æ²¡æ `INNER JOIN` å ³é®åï¼ä½¿ç¨ `WHERE` è¯å¥å®ç°å è¿æ¥çåè½ ```sql # éå¼å è¿æ¥ select c.cust_name, o.order_num from Customers c, Orders o where c.cust_id = o.cust_id order by c.cust_name; # æ¾å¼å è¿æ¥ select c.cust_name, o.order_num from Customers c inner join Orders o using(cust_id) order by c.cust_name; ``` ## ç»å `UNION` è¿ç®ç¬¦å°ä¸¤ä¸ªææ´å¤æ¥è¯¢çç»æç»åèµ·æ¥ï¼å¹¶çæä¸ä¸ªç»æéï¼å ¶ä¸å 嫿¥èª `UNION` ä¸å䏿¥è¯¢çæåè¡ã `UNION` åºæ¬è§åï¼ - æææ¥è¯¢çåæ°åå顺åºå¿ é¡»ç¸åã - æ¯ä¸ªæ¥è¯¢ä¸æ¶å表çåçæ°æ®ç±»åå¿ é¡»ç¸åæå ¼å®¹ã - é常è¿åçåååèªç¬¬ä¸ä¸ªæ¥è¯¢ã é»è®¤å°ï¼`UNION` æä½ç¬¦éåä¸åçå¼ã妿å 许éå¤çå¼ï¼è¯·ä½¿ç¨ `UNION ALL`ã ```sql SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2; ``` `UNION` ç»æéä¸çååæ»æ¯çäº `UNION` ä¸ç¬¬ä¸ä¸ª `SELECT` è¯å¥ä¸çååã `JOIN` vs `UNION`ï¼ - `JOIN` ä¸è¿æ¥è¡¨çåå¯è½ä¸åï¼ä½å¨ `UNION` ä¸ï¼æææ¥è¯¢çåæ°åå顺åºå¿ é¡»ç¸åã - `UNION` å°æ¥è¯¢ä¹åçè¡æ¾å¨ä¸èµ·ï¼åç´æ¾ç½®ï¼ï¼ä½ `JOIN` å°æ¥è¯¢ä¹åçåæ¾å¨ä¸èµ·ï¼æ°´å¹³æ¾ç½®ï¼ï¼å³å®ææä¸ä¸ªç¬å¡å°ç§¯ã ## 彿° ä¸åæ°æ®åºç彿°å¾å¾åä¸ç¸åï¼å æ¤ä¸å¯ç§»æ¤ãæ¬è主è¦ä»¥ MySQL ç彿°ä¸ºä¾ã ### ææ¬å¤ç | 彿° | 说æ | | -------------------- | ---------------------- | | `LEFT()`ã`RIGHT()` | 左边æè å³è¾¹çå符 | | `LOWER()`ã`UPPER()` | 转æ¢ä¸ºå°åæè 大å | | `LTRIM()`ã`RTRIM()` | å»é¤å·¦è¾¹æè å³è¾¹çç©ºæ ¼ | | `LENGTH()` | é¿åº¦ï¼ä»¥åè为åä½ | | `SOUNDEX()` | 转æ¢ä¸ºè¯é³å¼ | å ¶ä¸ï¼ **`SOUNDEX()`** å¯ä»¥å°ä¸ä¸ªå符串转æ¢ä¸ºæè¿°å ¶è¯é³è¡¨ç¤ºç忝æ°å模å¼ã ```sql SELECT * FROM mytable WHERE SOUNDEX(col1) = SOUNDEX('apple') ``` ### æ¥æåæ¶é´å¤ç - æ¥ææ ¼å¼ï¼`YYYY-MM-DD` - æ¶é´æ ¼å¼ï¼`HH:MM:SS` | å½ æ° | 说 æ | | --------------- | ------------------------------ | | `AddDate()` | å¢å ä¸ä¸ªæ¥æï¼å¤©ãå¨çï¼ | | `AddTime()` | å¢å ä¸ä¸ªæ¶é´ï¼æ¶ãåçï¼ | | `CurDate()` | è¿åå½åæ¥æ | | `CurTime()` | è¿åå½åæ¶é´ | | `Date()` | è¿åæ¥ææ¶é´çæ¥æé¨å | | `DateDiff()` | 计ç®ä¸¤ä¸ªæ¥æä¹å·® | | `Date_Add()` | é«åº¦çµæ´»çæ¥æè¿ç®å½æ° | | `Date_Format()` | è¿åä¸ä¸ªæ ¼å¼åçæ¥æææ¶é´ä¸² | | `Day()` | è¿åä¸ä¸ªæ¥æç天æ°é¨å | | `DayOfWeek()` | 对äºä¸ä¸ªæ¥æï¼è¿å对åºçææå | | `Hour()` | è¿åä¸ä¸ªæ¶é´çå°æ¶é¨å | | `Minute()` | è¿åä¸ä¸ªæ¶é´çåéé¨å | | `Month()` | è¿åä¸ä¸ªæ¥æçæä»½é¨å | | `Now()` | è¿åå½åæ¥æåæ¶é´ | | `Second()` | è¿åä¸ä¸ªæ¶é´çç§é¨å | | `Time()` | è¿åä¸ä¸ªæ¥ææ¶é´çæ¶é´é¨å | | `Year()` | è¿åä¸ä¸ªæ¥æç年份é¨å | ### æ°å¼å¤ç | 彿° | 说æ | | ------ | ------ | | SIN() | æ£å¼¦ | | COS() | ä½å¼¦ | | TAN() | æ£å | | ABS() | ç»å¯¹å¼ | | SQRT() | å¹³æ¹æ ¹ | | MOD() | 使° | | EXP() | ææ° | | PI() | åå¨ç | | RAND() | éæºæ° | ### æ±æ» | å½ æ° | 说 æ | | --------- | ---------------- | | `AVG()` | è¿åæåçå¹³åå¼ | | `COUNT()` | è¿åæåçè¡æ° | | `MAX()` | è¿åæåçæå¤§å¼ | | `MIN()` | è¿åæåçæå°å¼ | | `SUM()` | è¿åæåå¼ä¹å | `AVG()` ä¼å¿½ç¥ NULL è¡ã ä½¿ç¨ `DISTINCT` å¯ä»¥è®©æ±æ»å½æ°å¼æ±æ»ä¸åçå¼ã ```sql SELECT AVG(DISTINCT col1) AS avg_col FROM mytable ``` **æ¥ä¸æ¥ï¼æä»¬æ¥ä»ç» DDL è¯å¥ç¨æ³ãDDL ç主è¦åè½æ¯å®ä¹æ°æ®åºå¯¹è±¡ï¼å¦ï¼æ°æ®åºãæ°æ®è¡¨ãè§å¾ãç´¢å¼çï¼** ## æ°æ®å®ä¹ ### æ°æ®åºï¼DATABASEï¼ #### åå»ºæ°æ®åº ```sql CREATE DATABASE test; ``` #### å 餿°æ®åº ```sql DROP DATABASE test; ``` #### éæ©æ°æ®åº ```sql USE test; ``` ### æ°æ®è¡¨ï¼TABLEï¼ #### åå»ºæ°æ®è¡¨ **æ®éå建** ```sql CREATE TABLE user ( id int(10) unsigned NOT NULL COMMENT 'Id', username varchar(64) NOT NULL DEFAULT 'default' COMMENT 'ç¨æ·å', password varchar(64) NOT NULL DEFAULT 'default' COMMENT 'å¯ç ', email varchar(64) NOT NULL DEFAULT 'default' COMMENT 'é®ç®±' ) COMMENT='ç¨æ·è¡¨'; ``` **æ ¹æ®å·²æç表å建æ°è¡¨** ```sql CREATE TABLE vip_user AS SELECT * FROM user; ``` #### å 餿°æ®è¡¨ ```sql DROP TABLE user; ``` #### ä¿®æ¹æ°æ®è¡¨ **æ·»å å** ```sql ALTER TABLE user ADD age int(3); ``` **å é¤å** ```sql ALTER TABLE user DROP COLUMN age; ``` **ä¿®æ¹å** ```sql ALTER TABLE `user` MODIFY COLUMN age tinyint; ``` **æ·»å 主é®** ```sql ALTER TABLE user ADD PRIMARY KEY (id); ``` **å é¤ä¸»é®** ```sql ALTER TABLE user DROP PRIMARY KEY; ``` ### è§å¾ï¼VIEWï¼ å®ä¹ï¼ - è§å¾æ¯åºäº SQL è¯å¥çç»æéçå¯è§åç表ã - è§å¾æ¯èæçè¡¨ï¼æ¬èº«ä¸å 嫿°æ®ï¼ä¹å°±ä¸è½å¯¹å ¶è¿è¡ç´¢å¼æä½ã对è§å¾çæä½å对æ®é表çæä½ä¸æ ·ã ä½ç¨ï¼ - ç®å夿ç SQL æä½ï¼æ¯å¦å¤æçèç»ï¼ - åªä½¿ç¨å®é 表çä¸é¨åæ°æ®ï¼ - éè¿åªç»ç¨æ·è®¿é®è§å¾çæéï¼ä¿è¯æ°æ®çå®å ¨æ§ï¼ - æ´æ¹æ°æ®æ ¼å¼å表示ã  #### å建è§å¾ ```sql CREATE VIEW top_10_user_view AS SELECT id, username FROM user WHERE id < 10; ``` #### å é¤è§å¾ ```sql DROP VIEW top_10_user_view; ``` ### ç´¢å¼ï¼INDEXï¼ **ç´¢å¼æ¯ä¸ç§ç¨äºå¿«éæ¥è¯¢åæ£ç´¢æ°æ®çæ°æ®ç»æï¼å ¶æ¬è´¨å¯ä»¥çææ¯ä¸ç§æåºå¥½çæ°æ®ç»æã** ç´¢å¼çä½ç¨å°±ç¸å½äºä¹¦çç®å½ãæä¸ªæ¯æ¹: æä»¬å¨æ¥åå ¸çæ¶åï¼å¦ææ²¡æç®å½ï¼é£æä»¬å°±åªè½ä¸é¡µä¸é¡µç廿¾æä»¬éè¦æ¥çé£ä¸ªåï¼éåº¦å¾æ ¢ã妿æç®å½äºï¼æä»¬åªéè¦å å»ç®å½éæ¥æ¾åçä½ç½®ï¼ç¶åç´æ¥ç¿»å°é£ä¸é¡µå°±è¡äºã **ä¼ç¹**ï¼ - 使ç¨ç´¢å¼å¯ä»¥å¤§å¤§å å¿« æ°æ®çæ£ç´¢é度ï¼å¤§å¤§åå°æ£ç´¢çæ°æ®éï¼, è¿ä¹æ¯å建索å¼çæä¸»è¦çåå ã - éè¿å建å¯ä¸æ§ç´¢å¼ï¼å¯ä»¥ä¿è¯æ°æ®åºè¡¨ä¸æ¯ä¸è¡æ°æ®çå¯ä¸æ§ã **缺ç¹**ï¼ - å建索å¼åç»´æ¤ç´¢å¼éè¦èè´¹è®¸å¤æ¶é´ãå½å¯¹è¡¨ä¸çæ°æ®è¿è¡å¢å æ¹çæ¶åï¼å¦ææ°æ®æç´¢å¼ï¼é£ä¹ç´¢å¼ä¹éè¦å¨æçä¿®æ¹ï¼ä¼éä½ SQL æ§è¡æçã - ç´¢å¼éè¦ä½¿ç¨ç©çæä»¶åå¨ï¼ä¹ä¼èè´¹ä¸å®ç©ºé´ã 使¯ï¼**使ç¨ç´¢å¼ä¸å®è½æé«æ¥è¯¢æ§è½å?** 大夿°æ åµä¸ï¼ç´¢å¼æ¥è¯¢é½æ¯æ¯å ¨è¡¨æ«æè¦å¿«çã使¯å¦ææ°æ®åºçæ°æ®éä¸å¤§ï¼é£ä¹ä½¿ç¨ç´¢å¼ä¹ä¸ä¸å®è½å¤å¸¦æ¥å¾å¤§æåã å ³äºç´¢å¼ç详ç»ä»ç»ï¼è¯·çæåç [MySQL ç´¢å¼è¯¦è§£](https://javaguide.cn/database/mysql/mysql-index.html) è¿ç¯æç« ã #### åå»ºç´¢å¼ ```sql CREATE INDEX user_index ON user (id); ``` #### æ·»å ç´¢å¼ ```sql ALTER table user ADD INDEX user_index(id) ``` #### å建å¯ä¸ç´¢å¼ ```sql CREATE UNIQUE INDEX user_index ON user (id); ``` #### å é¤ç´¢å¼ ```sql ALTER TABLE user DROP INDEX user_index; ``` ### 约æ SQL 约æç¨äºè§å®è¡¨ä¸çæ°æ®è§åã 妿åå¨è¿å约æçæ°æ®è¡ä¸ºï¼è¡ä¸ºä¼è¢«çº¦æç»æ¢ã 约æå¯ä»¥å¨å建表æ¶è§å®ï¼éè¿ CREATE TABLE è¯å¥ï¼ï¼æè å¨è¡¨å建ä¹åè§å®ï¼éè¿ ALTER TABLE è¯å¥ï¼ã 约æç±»åï¼ - `NOT NULL` - æç¤ºæåä¸è½åå¨ NULL å¼ã - `UNIQUE` - ä¿è¯æåçæ¯è¡å¿ é¡»æå¯ä¸çå¼ã - `PRIMARY KEY` - NOT NULL å UNIQUE çç»åãç¡®ä¿æåï¼æä¸¤ä¸ªåå¤ä¸ªåçç»åï¼æå¯ä¸æ è¯ï¼æå©äºæ´å®¹ææ´å¿«éå°æ¾å°è¡¨ä¸çä¸ä¸ªç¹å®çè®°å½ã - `FOREIGN KEY` - ä¿è¯ä¸ä¸ªè¡¨ä¸çæ°æ®å¹é å¦ä¸ä¸ªè¡¨ä¸çå¼çåç §å®æ´æ§ã - `CHECK` - ä¿è¯åä¸çå¼ç¬¦åæå®çæ¡ä»¶ã - `DEFAULT` - è§å®æ²¡æç»åèµå¼æ¶çé»è®¤å¼ã å建表æ¶ä½¿ç¨çº¦ææ¡ä»¶ï¼ ```sql CREATE TABLE Users ( Id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'èªå¢Id', Username VARCHAR(64) NOT NULL UNIQUE DEFAULT 'default' COMMENT 'ç¨æ·å', Password VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT 'å¯ç ', Email VARCHAR(64) NOT NULL DEFAULT 'default' COMMENT 'é®ç®±å°å', Enabled TINYINT(4) DEFAULT NULL COMMENT 'æ¯å¦ææ', PRIMARY KEY (Id) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='ç¨æ·è¡¨'; ``` **æ¥ä¸æ¥ï¼æä»¬æ¥ä»ç» TCL è¯å¥ç¨æ³ãTCL ç主è¦åè½æ¯ç®¡çæ°æ®åºä¸çäºå¡ã** ## äºå¡å¤ç ä¸è½åé `SELECT` è¯å¥ï¼åé `SELECT` è¯å¥ä¹æ²¡æä¹ï¼ä¹ä¸è½åé `CREATE` å `DROP` è¯å¥ã **MySQL é»è®¤æ¯éå¼æäº¤**ï¼æ¯æ§è¡ä¸æ¡è¯å¥å°±æè¿æ¡è¯å¥å½æä¸ä¸ªäºå¡ç¶åè¿è¡æäº¤ãå½åºç° `START TRANSACTION` è¯å¥æ¶ï¼ä¼å ³ééå¼æäº¤ï¼å½ `COMMIT` æ `ROLLBACK` è¯å¥æ§è¡åï¼äºå¡ä¼èªå¨å ³éï¼éæ°æ¢å¤éå¼æäº¤ã éè¿ `set autocommit=0` å¯ä»¥åæ¶èªå¨æäº¤ï¼ç´å° `set autocommit=1` æä¼æäº¤ï¼`autocommit` æ è®°æ¯é对æ¯ä¸ªè¿æ¥è䏿¯é对æå¡å¨çã æä»¤ï¼ - `START TRANSACTION` - æä»¤ç¨äºæ è®°äºå¡çèµ·å§ç¹ã - `SAVEPOINT` - æä»¤ç¨äºå建ä¿çç¹ã - `ROLLBACK TO` - æä»¤ç¨äºåæ»å°æå®çä¿çç¹ï¼å¦ææ²¡æè®¾ç½®ä¿çç¹ï¼ååéå° `START TRANSACTION` è¯å¥å¤ã - `COMMIT` - æäº¤äºå¡ã ```sql -- å¼å§äºå¡ START TRANSACTION; -- æå ¥æä½ A INSERT INTO `user` VALUES (1, 'root1', 'root1', '[email protected]'); -- å建ä¿çç¹ updateA SAVEPOINT updateA; -- æå ¥æä½ B INSERT INTO `user` VALUES (2, 'root2', 'root2', '[email protected]'); -- åæ»å°ä¿çç¹ updateA ROLLBACK TO updateA; -- æäº¤äºå¡ï¼åªææä½ A çæ COMMIT; ``` **æ¥ä¸æ¥ï¼æä»¬æ¥ä»ç» DCL è¯å¥ç¨æ³ãDCL ç主è¦åè½æ¯æ§å¶ç¨æ·çè®¿é®æéã** ## æéæ§å¶ è¦æäºç¨æ·å¸æ·æéï¼å¯ä»¥ç¨`GRANT`å½ä»¤ãè¦æ¤éç¨æ·çæéï¼å¯ä»¥ç¨`REVOKE`å½ä»¤ãè¿é以 MySQL 为ä¾ï¼ä»ç»æéæ§å¶å®é åºç¨ã `GRANT`æäºæéè¯æ³ï¼ ```sql GRANT privilege,[privilege],.. ON privilege_level TO user [IDENTIFIED BY password] [REQUIRE tsl_option] [WITH [GRANT_OPTION | resource_option]]; ``` ç®åè§£éä¸ä¸ï¼ 1. å¨`GRANT`å ³é®ååæå®ä¸ä¸ªæå¤ä¸ªæéã妿æäºç¨æ·å¤ä¸ªæéï¼åæ¯ä¸ªæéç±éå·åéã 2. `ON privilege_level` ç¡®å®æéåºç¨çº§å«ãMySQL æ¯æ globalï¼`*.*`ï¼ï¼databaseï¼`database.*`ï¼ï¼tableï¼`database.table`ï¼åå级å«ãå¦æä½¿ç¨åæé级å«ï¼åå¿ é¡»å¨æ¯ä¸ªæéä¹åæå®ä¸ä¸ªæéå·åéåçå表ã 3. `user` æ¯è¦æäºæéçç¨æ·ãå¦æç¨æ·å·²åå¨ï¼å`GRANT`è¯å¥å°ä¿®æ¹å ¶æéãå¦åï¼`GRANT`è¯å¥å°å建ä¸ä¸ªæ°ç¨æ·ãå¯éåå¥`IDENTIFIED BY`å 许æ¨ä¸ºç¨æ·è®¾ç½®æ°çå¯ç ã 4. `REQUIRE tsl_option`æå®ç¨æ·æ¯å¦å¿ é¡»éè¿ SSLï¼X059 çå®å ¨è¿æ¥è¿æ¥å°æ°æ®åºæå¡å¨ã 5. å¯é `WITH GRANT OPTION` åå¥å è®¸æ¨æäºå ¶ä»ç¨æ·æä»å ¶ä»ç¨æ·ä¸å 餿¨æ¥æçæéãæ¤å¤ï¼æ¨å¯ä»¥ä½¿ç¨`WITH`åå¥åé MySQL æ°æ®åºæå¡å¨çèµæºï¼ä¾å¦ï¼è®¾ç½®ç¨æ·æ¯å°æ¶å¯ä»¥ä½¿ç¨çè¿æ¥æ°æè¯å¥æ°ãè¿å¨ MySQL å ±äº«æç®¡çå ±äº«ç¯å¢ä¸é常æç¨ã `REVOKE` æ¤éæéè¯æ³ï¼ ```sql REVOKE privilege_type [(column_list)] [, priv_type [(column_list)]]... ON [object_type] privilege_level FROM user [, user]... ``` ç®åè§£éä¸ä¸ï¼ 1. å¨ `REVOKE` å ³é®åå颿å®è¦ä»ç¨æ·æ¤æ¶çæéåè¡¨ãæ¨éè¦ç¨éå·åéæéã 2. æå®å¨ `ON` åå¥ä¸æ¤éç¹æçç¹æçº§å«ã 3. æå®è¦æ¤æ¶ `FROM` åå¥ä¸çæéçç¨æ·å¸æ·ã `GRANT` å `REVOKE` å¯å¨å ä¸ªå±æ¬¡ä¸æ§å¶è®¿é®æéï¼ - æ´ä¸ªæå¡å¨ï¼ä½¿ç¨ `GRANT ALL` å `REVOKE ALL`ï¼ - æ´ä¸ªæ°æ®åºï¼ä½¿ç¨ `ON database.*`ï¼ - ç¹å®ç表ï¼ä½¿ç¨ `ON database.table`ï¼ - ç¹å®çåï¼ - ç¹å®çåå¨è¿ç¨ã æ°å建çè´¦æ·æ²¡æä»»ä½æéãè´¦æ·ç¨ `username@host` çå½¢å¼å®ä¹ï¼`username@%` 使ç¨çæ¯é»è®¤ä¸»æºåãMySQL çè´¦æ·ä¿¡æ¯ä¿åå¨ mysql è¿ä¸ªæ°æ®åºä¸ã ```sql USE mysql; SELECT user FROM user; ``` ä¸è¡¨è¯´æäºå¯ç¨äº`GRANT`å`REVOKE`è¯å¥çææå 许æéï¼ | **ç¹æ** | **说æ** | **级å«** | | | | | | | ----------------------- | ------------------------------------------------------------------------------------------------------- | -------- | ------ | -------- | -------- | --- | --- | | **å ¨å±** | æ°æ®åº | **表** | **å** | **ç¨åº** | **代ç** | | | | ALL [PRIVILEGES] | æäºé¤ GRANT OPTION ä¹å¤çæå®è®¿é®çº§å«çæææé | | | | | | | | ALTER | å è®¸ç¨æ·ä½¿ç¨ ALTER TABLE è¯å¥ | X | X | X | | | | | ALTER ROUTINE | å è®¸ç¨æ·æ´æ¹æå é¤åå¨çä¾ç¨ | X | X | | | X | | | CREATE | å è®¸ç¨æ·åå»ºæ°æ®åºå表 | X | X | X | | | | | CREATE ROUTINE | å è®¸ç¨æ·å建åå¨çä¾ç¨ | X | X | | | | | | CREATE TABLESPACE | å è®¸ç¨æ·åå»ºï¼æ´æ¹æå é¤è¡¨ç©ºé´åæ¥å¿æä»¶ç» | X | | | | | | | CREATE TEMPORARY TABLES | å è®¸ç¨æ·ä½¿ç¨ CREATE TEMPORARY TABLE å建临æ¶è¡¨ | X | X | | | | | | CREATE USER | å è®¸ç¨æ·ä½¿ç¨ CREATE USERï¼DROP USERï¼RENAME USER å REVOKE ALL PRIVILEGES è¯å¥ã | X | | | | | | | CREATE VIEW | å è®¸ç¨æ·å建æä¿®æ¹è§å¾ã | X | X | X | | | | | DELETE | å è®¸ç¨æ·ä½¿ç¨ DELETE | X | X | X | | | | | DROP | å è®¸ç¨æ·å 餿°æ®åºï¼è¡¨åè§å¾ | X | X | X | | | | | EVENT | å¯ç¨äºä»¶è®¡åç¨åºçäºä»¶ä½¿ç¨ã | X | X | | | | | | EXECUTE | å è®¸ç¨æ·æ§è¡åå¨çä¾ç¨ | X | X | X | | | | | FILE | å è®¸ç¨æ·è¯»åæ°æ®åºç®å½ä¸ç任使件ã | X | | | | | | | GRANT OPTION | å è®¸ç¨æ·æ¥ææäºææ¤æ¶å ¶ä»å¸æ·æéçæéã | X | X | X | | X | X | | INDEX | å è®¸ç¨æ·å建æå é¤ç´¢å¼ã | X | X | X | | | | | INSERT | å è®¸ç¨æ·ä½¿ç¨ INSERT è¯å¥ | X | X | X | X | | | | LOCK TABLES | å è®¸ç¨æ·å¯¹å ·æ SELECT æéçè¡¨ä½¿ç¨ LOCK TABLES | X | X | | | | | | PROCESS | å è®¸ç¨æ·ä½¿ç¨ SHOW PROCESSLIST è¯å¥æ¥çææè¿ç¨ã | X | | | | | | | PROXY | å¯ç¨ç¨æ·ä»£çã | | | | | | | | REFERENCES | å è®¸ç¨æ·å建å¤é® | X | X | X | X | | | | RELOAD | å è®¸ç¨æ·ä½¿ç¨ FLUSH æä½ | X | | | | | | | REPLICATION CLIENT | å è®¸ç¨æ·æ¥è¯¢ä»¥æ¥ç主æå¡å¨æä»å±æå¡å¨çä½ç½® | X | | | | | | | REPLICATION SLAVE | å è®¸ç¨æ·ä½¿ç¨å¤å¶ä»å±ä»ä¸»æå¡å¨è¯»åäºè¿å¶æ¥å¿äºä»¶ã | X | | | | | | | SELECT | å è®¸ç¨æ·ä½¿ç¨ SELECT è¯å¥ | X | X | X | X | | | | SHOW DATABASES | å è®¸ç¨æ·æ¾ç¤ºæææ°æ®åº | X | | | | | | | SHOW VIEW | å è®¸ç¨æ·ä½¿ç¨ SHOW CREATE VIEW è¯å¥ | X | X | X | | | | | SHUTDOWN | å è®¸ç¨æ·ä½¿ç¨ mysqladmin shutdown å½ä»¤ | X | | | | | | | SUPER | å è®¸ç¨æ·ä½¿ç¨å ¶ä»ç®¡çæä½ï¼ä¾å¦ CHANGE MASTER TOï¼KILLï¼PURGE BINARY LOGSï¼SET GLOBAL å mysqladmin å½ä»¤ | X | | | | | | | TRIGGER | å è®¸ç¨æ·ä½¿ç¨ TRIGGER æä½ã | X | X | X | | | | | UPDATE | å è®¸ç¨æ·ä½¿ç¨ UPDATE è¯å¥ | X | X | X | X | | | | USAGE | ç¸å½äºâ没æç¹æâ | | | | | | | ### åå»ºè´¦æ· ```sql CREATE USER myuser IDENTIFIED BY 'mypassword'; ``` ### ä¿®æ¹è´¦æ·å ```sql UPDATE user SET user='newuser' WHERE user='myuser'; FLUSH PRIVILEGES; ``` ### å é¤è´¦æ· ```sql DROP USER myuser; ``` ### æ¥çæé ```sql SHOW GRANTS FOR myuser; ``` ### æäºæé ```sql GRANT SELECT, INSERT ON *.* TO myuser; ``` ### å 餿é ```sql REVOKE SELECT, INSERT ON *.* FROM myuser; ``` ### æ´æ¹å¯ç ```sql SET PASSWORD FOR myuser = 'mypass'; ``` ## åå¨è¿ç¨ åå¨è¿ç¨å¯ä»¥çææ¯å¯¹ä¸ç³»å SQL æä½çæ¹å¤çãåå¨è¿ç¨å¯ä»¥ç±è§¦åå¨ï¼å ¶ä»åå¨è¿ç¨ä»¥å Javaï¼ Pythonï¼PHP çåºç¨ç¨åºè°ç¨ã  使ç¨åå¨è¿ç¨ç好å¤ï¼ - 代ç å°è£ ï¼ä¿è¯äºä¸å®çå®å ¨æ§ï¼ - 代ç å¤ç¨ï¼ - ç±äºæ¯é¢å ç¼è¯ï¼å æ¤å ·æå¾é«çæ§è½ã å建åå¨è¿ç¨ï¼ - å½ä»¤è¡ä¸å建åå¨è¿ç¨éè¦èªå®ä¹åé符ï¼å 为å½ä»¤è¡æ¯ä»¥ `;` ä¸ºç»æç¬¦ï¼èåå¨è¿ç¨ä¸ä¹å å«äºåå·ï¼å æ¤ä¼é误æè¿é¨ååå·å½ææ¯ç»æç¬¦ï¼é æè¯æ³é误ã - å å« `in`ã`out` å `inout` ä¸ç§åæ°ã - ç»åéèµå¼é½éè¦ç¨ `select into` è¯å¥ã - æ¯æ¬¡åªè½ç»ä¸ä¸ªåéèµå¼ï¼ä¸æ¯æéåçæä½ã éè¦æ³¨æçæ¯ï¼**é¿éå·´å·´ãJava å¼åæåã强å¶ç¦æ¢ä½¿ç¨åå¨è¿ç¨ãå 为åå¨è¿ç¨é¾ä»¥è°è¯åæ©å±ï¼æ´æ²¡æç§»æ¤æ§ã**  è³äºå°åºè¦ä¸è¦å¨é¡¹ç®ä¸ä½¿ç¨ï¼è¿æ¯è¦ç项ç®å®é éæ±ï¼æè¡¡å¥½å©å¼å³å¯ï¼ ### å建åå¨è¿ç¨ ```sql DROP PROCEDURE IF EXISTS `proc_adder`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int) BEGIN DECLARE c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set sum = a + b; END ;; DELIMITER ; ``` ### 使ç¨åå¨è¿ç¨ ```less set @b=5; call proc_adder(2,@b,@s); select @s as sum; ``` ## æ¸¸æ æ¸¸æ ï¼cursorï¼æ¯ä¸ä¸ªåå¨å¨ DBMS æå¡å¨ä¸çæ°æ®åºæ¥è¯¢ï¼å®ä¸æ¯ä¸æ¡ `SELECT` è¯å¥ï¼èæ¯è¢«è¯¥è¯å¥æ£ç´¢åºæ¥çç»æéã å¨åå¨è¿ç¨ä¸ä½¿ç¨æ¸¸æ å¯ä»¥å¯¹ä¸ä¸ªç»æéè¿è¡ç§»å¨éåã æ¸¸æ 主è¦ç¨äºäº¤äºå¼åºç¨ï¼å ¶ä¸ç¨æ·éè¦æ»å¨å±å¹ä¸çæ°æ®ï¼å¹¶å¯¹æ°æ®è¿è¡æµè§æååºæ´æ¹ã ä½¿ç¨æ¸¸æ çå 个æç¡®æ¥éª¤ï¼ - å¨ä½¿ç¨æ¸¸æ åï¼å¿ 须声æ(å®ä¹)å®ãè¿ä¸ªè¿ç¨å®é 䏿²¡ææ£ç´¢æ°æ®ï¼ å®åªæ¯å®ä¹è¦ä½¿ç¨ç `SELECT` è¯å¥å游æ é项ã - 䏿¦å£°æï¼å°±å¿ é¡»æå¼æ¸¸æ 以ä¾ä½¿ç¨ãè¿ä¸ªè¿ç¨ç¨åé¢å®ä¹ç SELECT è¯å¥ææ°æ®å®é æ£ç´¢åºæ¥ã - 对äºå¡«ææ°æ®ç游æ ï¼æ ¹æ®éè¦ååº(æ£ç´¢)åè¡ã - å¨ç»ææ¸¸æ ä½¿ç¨æ¶ï¼å¿ é¡»å ³éæ¸¸æ ï¼å¯è½çè¯ï¼éæ¾æ¸¸æ (æèµäºå · ä½ç DBMS)ã ```sql DELIMITER $ CREATE PROCEDURE getTotal() BEGIN DECLARE total INT; -- åå»ºæ¥æ¶æ¸¸æ æ°æ®çåé DECLARE sid INT; DECLARE sname VARCHAR(10); -- åå»ºæ»æ°åé DECLARE sage INT; -- åå»ºç»ææ å¿åé DECLARE done INT DEFAULT false; -- å建游æ DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30; -- æå®æ¸¸æ 循ç¯ç»ææ¶çè¿åå¼ DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; SET total = 0; OPEN cur; FETCH cur INTO sid, sname, sage; WHILE(NOT done) DO SET total = total + 1; FETCH cur INTO sid, sname, sage; END WHILE; CLOSE cur; SELECT total; END $ DELIMITER ; -- è°ç¨åå¨è¿ç¨ call getTotal(); ``` ## 触åå¨ è§¦å卿¯ä¸ç§ä¸è¡¨æä½æå ³çæ°æ®åºå¯¹è±¡ï¼å½è§¦å卿å¨è¡¨ä¸åºç°æå®äºä»¶æ¶ï¼å°è°ç¨è¯¥å¯¹è±¡ï¼å³è¡¨çæä½äºä»¶è§¦å表ä¸ç触åå¨çæ§è¡ã æä»¬å¯ä»¥ä½¿ç¨è§¦å卿¥è¿è¡å®¡è®¡è·è¸ªï¼æä¿®æ¹è®°å½å°å¦å¤ä¸å¼ 表ä¸ã 使ç¨è§¦åå¨çä¼ç¹ï¼ - SQL 触å卿ä¾äºå¦ä¸ç§æ£æ¥æ°æ®å®æ´æ§çæ¹æ³ã - SQL 触åå¨å¯ä»¥æè·æ°æ®åºå±ä¸ä¸å¡é»è¾ä¸çé误ã - SQL 触å卿ä¾äºå¦ä¸ç§è¿è¡è®¡åä»»å¡çæ¹æ³ãéè¿ä½¿ç¨ SQL 触åå¨ï¼æ¨ä¸å¿ çå¾ è¿è¡è®¡åä»»å¡ï¼å 为å¨å¯¹è¡¨ä¸çæ°æ®è¿è¡æ´æ¹ä¹åæä¹åä¼èªå¨è°ç¨è§¦åå¨ã - SQL 触åå¨å¯¹äºå®¡è®¡è¡¨ä¸æ°æ®çæ´æ¹é常æç¨ã 使ç¨è§¦åå¨ç缺ç¹ï¼ - SQL 触åå¨åªè½æä¾æ©å±éªè¯ï¼å¹¶ä¸ä¸è½æ¿æ¢ææéªè¯ãå¿ é¡»å¨åºç¨ç¨åºå±ä¸å®æä¸äºç®åçéªè¯ãä¾å¦ï¼æ¨å¯ä»¥ä½¿ç¨ JavaScript å¨å®¢æ·ç«¯éªè¯ç¨æ·çè¾å ¥ï¼æè ä½¿ç¨æå¡å¨ç«¯èæ¬è¯è¨ï¼å¦ JSPï¼PHPï¼ASP.NETï¼Perlï¼å¨æå¡å¨ç«¯éªè¯ç¨æ·çè¾å ¥ã - ä»å®¢æ·ç«¯åºç¨ç¨åºè°ç¨åæ§è¡ SQL 触å卿¯ä¸å¯è§çï¼å æ¤å¾é¾å¼æ¸ æ¥æ°æ®åºå±ä¸åçäºä»ä¹ã - SQL 触åå¨å¯è½ä¼å¢å æ°æ®åºæå¡å¨çå¼éã MySQL ä¸å 许å¨è§¦åå¨ä¸ä½¿ç¨ CALL è¯å¥ ï¼ä¹å°±æ¯ä¸è½è°ç¨åå¨è¿ç¨ã > 注æï¼å¨ MySQL ä¸ï¼åå· `;` æ¯è¯å¥ç»æçæ è¯ç¬¦ï¼éå°åå·è¡¨ç¤ºè¯¥æ®µè¯å¥å·²ç»ç»æï¼MySQL å¯ä»¥å¼å§æ§è¡äºãå æ¤ï¼è§£éå¨éå°è§¦å卿§è¡å¨ä½ä¸çåå·åå°±å¼å§æ§è¡ï¼ç¶å伿¥éï¼å ä¸ºæ²¡ææ¾å°å BEGIN å¹é ç ENDã > > è¿æ¶å°±ä¼ç¨å° `DELIMITER` å½ä»¤ï¼DELIMITER æ¯å®ç符ï¼åéç¬¦çææï¼ã宿¯ä¸æ¡å½ä»¤ï¼ä¸éè¦è¯å¥ç»ææ è¯ï¼è¯æ³ä¸ºï¼`DELIMITER new_delimiter`ã`new_delimiter` å¯ä»¥è®¾ä¸º 1 个æå¤ä¸ªé¿åº¦ç符å·ï¼é»è®¤çæ¯åå· `;`ï¼æä»¬å¯ä»¥æå®ä¿®æ¹ä¸ºå ¶ä»ç¬¦å·ï¼å¦ `$` - `DELIMITER $` ãå¨è¿ä¹åçè¯å¥ï¼ä»¥åå·ç»æï¼è§£éå¨ä¸ä¼æä»ä¹ååºï¼åªæéå°äº `$`ï¼æè®¤ä¸ºæ¯è¯å¥ç»æã注æï¼ä½¿ç¨å®ä¹åï¼æä»¬è¿åºè¯¥è®°å¾æå®ç»ä¿®æ¹åæ¥ã å¨ MySQL 5.7.2 çä¹åï¼å¯ä»¥ä¸ºæ¯ä¸ªè¡¨å®ä¹æå¤å 个触åå¨ã - `BEFORE INSERT` - å¨å°æ°æ®æå ¥è¡¨æ ¼ä¹åæ¿æ´»ã - `AFTER INSERT` - å°æ°æ®æå ¥è¡¨æ ¼åæ¿æ´»ã - `BEFORE UPDATE` - 卿´æ°è¡¨ä¸çæ°æ®ä¹åæ¿æ´»ã - `AFTER UPDATE` - æ´æ°è¡¨ä¸çæ°æ®åæ¿æ´»ã - `BEFORE DELETE` - å¨ä»è¡¨ä¸å 餿°æ®ä¹åæ¿æ´»ã - `AFTER DELETE` - ä»è¡¨ä¸å 餿°æ®åæ¿æ´»ã 使¯ï¼ä» MySQL çæ¬ 5.7.2+å¼å§ï¼å¯ä»¥ä¸ºåä¸è§¦åäºä»¶åæä½æ¶é´å®ä¹å¤ä¸ªè§¦åå¨ã **`NEW` å `OLD`**ï¼ - MySQL ä¸å®ä¹äº `NEW` å `OLD` å ³é®åï¼ç¨æ¥è¡¨ç¤ºè§¦åå¨çæå¨è¡¨ä¸ï¼è§¦åäºè§¦åå¨çé£ä¸è¡æ°æ®ã - å¨ `INSERT` å触åå¨ä¸ï¼`NEW` ç¨æ¥è¡¨ç¤ºå°è¦ï¼`BEFORE`ï¼æå·²ç»ï¼`AFTER`ï¼æå ¥çæ°æ°æ®ï¼ - å¨ `UPDATE` å触åå¨ä¸ï¼`OLD` ç¨æ¥è¡¨ç¤ºå°è¦æå·²ç»è¢«ä¿®æ¹çåæ°æ®ï¼`NEW` ç¨æ¥è¡¨ç¤ºå°è¦æå·²ç»ä¿®æ¹ä¸ºçæ°æ°æ®ï¼ - å¨ `DELETE` å触åå¨ä¸ï¼`OLD` ç¨æ¥è¡¨ç¤ºå°è¦æå·²ç»è¢«å é¤çåæ°æ®ï¼ - ä½¿ç¨æ¹æ³ï¼`NEW.columnName` ï¼columnName 为ç¸åºæ°æ®è¡¨æä¸ååï¼ ### å建触åå¨ > æç¤ºï¼ä¸ºäºç解触åå¨çè¦ç¹ï¼æå¿ è¦å äºè§£ä¸ä¸å建触åå¨çæä»¤ã `CREATE TRIGGER` æä»¤ç¨äºå建触åå¨ã è¯æ³ï¼ ```sql CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN trigger_statements END; ``` 说æï¼ - `trigger_name`ï¼è§¦åå¨å - `trigger_time` : 触åå¨çè§¦åæ¶æºãåå¼ä¸º `BEFORE` æ `AFTER`ã - `trigger_event` : 触åå¨ççå¬äºä»¶ãåå¼ä¸º `INSERT`ã`UPDATE` æ `DELETE`ã - `table_name` : 触åå¨ççå¬ç®æ ãæå®å¨åªå¼ 表ä¸å»ºç«è§¦åå¨ã - `FOR EACH ROW`: è¡çº§çè§ï¼Mysql åºå®åæ³ï¼å ¶ä» DBMS ä¸åã - `trigger_statements`: 触å卿§è¡å¨ä½ãæ¯ä¸æ¡æå¤æ¡ SQL è¯å¥çå表ï¼å表å çæ¯æ¡è¯å¥é½å¿ é¡»ç¨åå· `;` æ¥ç»å°¾ã å½è§¦åå¨çè§¦åæ¡ä»¶æ»¡è¶³æ¶ï¼å°ä¼æ§è¡ `BEGIN` å `END` ä¹é´ç触å卿§è¡å¨ä½ã 示ä¾ï¼ ```sql DELIMITER $ CREATE TRIGGER `trigger_insert_user` AFTER INSERT ON `user` FOR EACH ROW BEGIN INSERT INTO `user_history`(user_id, operate_type, operate_time) VALUES (NEW.id, 'add a user', now()); END $ DELIMITER ; ``` ### æ¥ç触åå¨ ```sql SHOW TRIGGERS; ``` ### å é¤è§¦åå¨ ```sql DROP TRIGGER IF EXISTS trigger_insert_user; ``` ## æç« æ¨è - [å端ç¨åºåå¿ å¤ï¼SQL 髿§è½ä¼åæåï¼35+æ¡ä¼å建议ç«é©¬ GET!](https://mp.weixin.qq.com/s/I-ZT3zGTNBZ6egS7T09jyQ) - [å端ç¨åºåå¿ å¤ï¼ä¹¦åé«è´¨é SQL ç 30 æ¡å»ºè®®](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486461&idx=1&sn=60a22279196d084cc398936fe3b37772&chksm=cea24436f9d5cd20a4fa0e907590f3e700d7378b3f608d7b33bb52cfb96f503b7ccb65a1deed&token=1987003517&lang=zh_CN#rd)