--- title: SQL常è§é¢è¯é¢æ»ç» category: æ°æ®åº tag: - æ°æ®åºåºç¡ - SQL --- > é¢ç®æ¥æºäºï¼[ç客é¢é¸ - SQL å¿ ç¥å¿ ä¼](https://www.nowcoder.com/exam/oj?page=1&tab=SQL%E7%AF%87&topicId=298) ## æ£ç´¢æ°æ® `select` ç¨äºä»æ°æ®åºä¸æ¥è¯¢æ°æ®ã ### ä» Customers è¡¨ä¸æ£ç´¢ææç ID ç°æè¡¨ `Customers` å¦ä¸ï¼ | cust_id | | ------- | | A | | B | | C | ç¼å SQL è¯å¥ï¼ä» `Customers` è¡¨ä¸æ£ç´¢ææç `cust_id`ã çæ¡ï¼ ```sql select cust_id from Customers; ``` ### æ£ç´¢å¹¶ååºå·²è®¢è´äº§åçæ¸ å 表 `OrderItems` 嫿é空çå `prod_id` 代表åå idï¼å å«äºææå·²è®¢è´çååï¼æäºå·²è¢«è®¢è´å¤æ¬¡ï¼ã | prod_id | | ------- | | a1 | | a2 | | a3 | | a4 | | a5 | | a6 | | a7 | ç¼å SQL è¯å¥ï¼æ£ç´¢å¹¶ååºææå·²è®¢è´ååï¼`prod_id`ï¼çå»éåçæ¸ åã çæ¡ï¼ ```sql select distinct prod_id from OrderItems; ``` ç¥è¯ç¹ï¼`distinct` ç¨äºè¿ååä¸çå¯ä¸ä¸åå¼ã ### æ£ç´¢ææå ç°å¨æ `Customers` 表ï¼è¡¨ä¸å«æå `cust_id` ä»£è¡¨å®¢æ· idï¼`cust_name` 代表客æ·å§åï¼ | cust_id | cust_name | | ------- | --------- | | a1 | andy | | a2 | ben | | a3 | tony | | a4 | tom | | a5 | an | | a6 | lee | | a7 | hex | éè¦ç¼å SQL è¯å¥ï¼æ£ç´¢ææåã çæ¡ï¼ ```sql select cust_id, cust_name from Customers; ``` ## æåºæ£ç´¢æ°æ® `order by` ç¨äºå¯¹ç»æéæç §ä¸ä¸ªåæè å¤ä¸ªåè¿è¡æåºãé»è®¤æç §ååºå¯¹è®°å½è¿è¡æåºï¼å¦æéè¦æç §éåºå¯¹è®°å½è¿è¡æåºï¼å¯ä»¥ä½¿ç¨ `desc` å ³é®åã ### æ£ç´¢é¡¾å®¢åç§°å¹¶ä¸æåº æè¡¨ `Customers`ï¼`cust_id` ä»£è¡¨å®¢æ· idï¼`cust_name` 代表客æ·å§åã | cust_id | cust_name | | ------- | --------- | | a1 | andy | | a2 | ben | | a3 | tony | | a4 | tom | | a5 | an | | a6 | lee | | a7 | hex | ä» `Customers` 䏿£ç´¢ææç顾客åç§°ï¼`cust_name`ï¼ï¼å¹¶æä» Z å° A çé¡ºåºæ¾ç¤ºç»æã çæ¡ï¼ ```sql select cust_name from Customers order by cust_name desc ``` ### 对顾客 ID 忥ææåº æ `Orders` è¡¨ï¼ | cust_id | order_num | order_date | | ------- | --------- | ------------------- | | andy | aaaa | 2021-01-01 00:00:00 | | andy | bbbb | 2021-01-01 12:00:00 | | bob | cccc | 2021-01-10 12:00:00 | | dick | dddd | 2021-01-11 00:00:00 | ç¼å SQL è¯å¥ï¼ä» `Orders` è¡¨ä¸æ£ç´¢é¡¾å®¢ IDï¼`cust_id`ï¼å订åå·ï¼`order_num`ï¼ï¼å¹¶å æé¡¾å®¢ ID å¯¹ç»æè¿è¡æåºï¼åæè®¢åæ¥æååºæåã çæ¡ï¼ ```sql # æ ¹æ®ååæåº # 注æï¼æ¯ order_date éåºï¼è䏿¯ order_num select cust_id, order_num from Orders order by cust_id, order_date desc; ``` ç¥è¯ç¹ï¼`order by` 对å¤åæåºçæ¶åï¼å æåºçåæ¾åé¢ï¼åæåºçåæ¾åé¢ãå¹¶ä¸ï¼ä¸åçåå¯ä»¥æä¸åçæåºè§åã ### æç §æ°éåä»·æ ¼æåº å设æä¸ä¸ª `OrderItems` è¡¨ï¼ | quantity | item_price | | -------- | ---------- | | 1 | 100 | | 10 | 1003 | | 2 | 500 | ç¼å SQL è¯å¥ï¼æ¾ç¤º `OrderItems` 表ä¸çæ°éï¼`quantity`ï¼åä»·æ ¼ï¼`item_price`ï¼ï¼å¹¶ææ°éç±å¤å°å°ãä»·æ ¼ç±é«å°ä½æåºã çæ¡ï¼ ```sql select quantity, item_price from OrderItems order by quantity desc, item_price desc; ``` ### æ£æ¥ SQL è¯å¥ æ `Vendors` è¡¨ï¼ | vend_name | | --------- | | æµ·åºæ | | å°é¾å | | 大é¾ç | ä¸é¢ç SQL è¯å¥æé®é¢åï¼å°è¯å°å®æ¹æ£ç¡®ï¼ä½¿ä¹è½å¤æ£ç¡®è¿è¡ï¼å¹¶ä¸è¿åç»ææ ¹æ®`vend_name` éåºæåã ```sql SELECT vend_name, FROM Vendors ORDER vend_name DESC; ``` æ¹æ£åï¼ ```sql select vend_name from Vendors order by vend_name desc; ``` ç¥è¯ç¹ï¼ - éå·ä½ç¨æ¯ç¨æ¥éå¼åä¸åä¹é´çã - order by æ¯æ by çï¼éè¦æ°å宿´ï¼ä¸ä½ç½®æ£ç¡®ã ## è¿æ»¤æ°æ® `where` å¯ä»¥è¿æ»¤è¿åçæ°æ®ã ä¸é¢çè¿ç®ç¬¦å¯ä»¥å¨ `where` åå¥ä¸ä½¿ç¨ï¼ | è¿ç®ç¬¦ | æè¿° | | :------ | :--------------------------------------------------------- | | = | çäº | | <> | ä¸çäºã**注éï¼**å¨ SQL çä¸äºçæ¬ä¸ï¼è¯¥æä½ç¬¦å¯è¢«åæ != | | > | å¤§äº | | < | å°äº | | >= | 大äºçäº | | <= | å°äºçäº | | BETWEEN | å¨æä¸ªèå´å | | LIKE | æç´¢æç§æ¨¡å¼ | | IN | æå®é对æä¸ªåçå¤ä¸ªå¯è½å¼ | ### è¿ååºå®ä»·æ ¼çäº§å æè¡¨ `Products` ï¼ | prod_id | prod_name | prod_price | | ------- | -------------- | ---------- | | a0018 | sockets | 9.49 | | a0019 | iphone13 | 600 | | b0018 | gucci t-shirts | 1000 | ãé®é¢ãä» `Products` è¡¨ä¸æ£ç´¢äº§å IDï¼`prod_id`ï¼å产ååç§°ï¼`prod_name`ï¼ï¼åªè¿åä»·æ ¼ä¸º 9.49 ç¾å ç产åã çæ¡ï¼ ```sql select prod_id, prod_name from Products where prod_price = 9.49; ``` ### è¿åæ´é«ä»·æ ¼çäº§å æè¡¨ `Products` ï¼ | prod_id | prod_name | prod_price | | ------- | -------------- | ---------- | | a0018 | sockets | 9.49 | | a0019 | iphone13 | 600 | | b0019 | gucci t-shirts | 1000 | ãé®é¢ãç¼å SQL è¯å¥ï¼ä» `Products` è¡¨ä¸æ£ç´¢äº§å IDï¼`prod_id`ï¼å产ååç§°ï¼`prod_name`ï¼ï¼åªè¿åä»·æ ¼ä¸º 9 ç¾å ææ´é«ç产åã çæ¡ï¼ ```sql select prod_id, prod_name from Products where prod_price >= 9; ``` ### è¿å产åå¹¶ä¸æç §ä»·æ ¼æåº æè¡¨ `Products` ï¼ | prod_id | prod_name | prod_price | | ------- | --------- | ---------- | | a0011 | egg | 3 | | a0019 | sockets | 4 | | b0019 | coffee | 15 | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿å `Products` è¡¨ä¸ææä»·æ ¼å¨ 3 ç¾å å° 6 ç¾å ä¹é´ç产åçåç§°ï¼`prod_name`ï¼åä»·æ ¼ï¼`prod_price`ï¼ï¼ç¶åæä»·æ ¼å¯¹ç»æè¿è¡æåºã çæ¡ï¼ ```sql select prod_name, prod_price from Products where prod_price between 3 and 6 order by prod_price; # æè select prod_name, prod_price from Products where prod_price >= 3 and prod_price <= 6 order by prod_price; ``` ### è¿åæ´å¤ç产å `OrderItems` è¡¨å«æï¼è®¢åå· `order_num`ï¼`quantity`äº§åæ°é | order_num | quantity | | --------- | -------- | | a1 | 105 | | a2 | 1100 | | a2 | 200 | | a4 | 1121 | | a5 | 10 | | a2 | 19 | | a7 | 5 | ãé®é¢ãä» `OrderItems` è¡¨ä¸æ£ç´¢åºææä¸åä¸ä¸éå¤ç订åå·ï¼`order_num`ï¼ï¼å ¶ä¸æ¯ä¸ªè®¢åé½è¦å å« 100 ä¸ªææ´å¤ç产åã çæ¡ï¼ ```sql select distinct order_num from OrderItems where quantity >= 100; ``` ## é«çº§æ°æ®è¿æ»¤ `and` å `or` è¿ç®ç¬¦ç¨äºåºäºä¸ä¸ªä»¥ä¸çæ¡ä»¶å¯¹è®°å½è¿è¡è¿æ»¤ï¼ä¸¤è å¯ä»¥ç»å使ç¨ã`and` å¿ é¡» 2 个æ¡ä»¶é½æç«ï¼`or`åªè¦ 2 个æ¡ä»¶ä¸çä¸ä¸ªæç«å³å¯ã ### æ£ç´¢ä¾åºååç§° `Vendors` 表æå段ä¾åºååç§°ï¼`vend_name`ï¼ãä¾åºåå½å®¶ï¼`vend_country`ï¼ãä¾åºåå·ï¼`vend_state`ï¼ | vend_name | vend_country | vend_state | | --------- | ------------ | ---------- | | apple | USA | CA | | vivo | CNA | shenzhen | | huawei | CNA | xian | ãé®é¢ãç¼å SQL è¯å¥ï¼ä» `Vendors` è¡¨ä¸æ£ç´¢ä¾åºååç§°ï¼`vend_name`ï¼ï¼ä» è¿åå å©ç¦å°¼äºå·çä¾åºåï¼è¿éè¦æå½å®¶[USA]åå·[CA]è¿è¡è¿æ»¤ï¼æ²¡åå ¶ä»å½å®¶ä¹åå¨ä¸ä¸ª CAï¼ çæ¡ï¼ ```sql select vend_name from Vendors where vend_country = 'USA' and vend_state = 'CA'; ``` ### æ£ç´¢å¹¶ååºå·²è®¢è´äº§åçæ¸ å `OrderItems` 表å å«äºææå·²è®¢è´ç产åï¼æäºå·²è¢«è®¢è´å¤æ¬¡ï¼ã | prod_id | order_num | quantity | | ------- | --------- | -------- | | BR01 | a1 | 105 | | BR02 | a2 | 1100 | | BR02 | a2 | 200 | | BR03 | a4 | 1121 | | BR017 | a5 | 10 | | BR02 | a2 | 19 | | BR017 | a7 | 5 | ãé®é¢ãç¼å SQL è¯å¥ï¼æ¥æ¾ææè®¢è´äºæ°éè³å° 100 个ç `BR01`ã`BR02` æ `BR03` ç订åãä½ éè¦è¿å `OrderItems` 表ç订åå·ï¼`order_num`ï¼ã产å IDï¼`prod_id`ï¼åæ°éï¼`quantity`ï¼ï¼å¹¶æäº§å ID åæ°éè¿è¡è¿æ»¤ã çæ¡ï¼ ```sql select order_num, prod_id, quantity from OrderItems where quantity >= 100 and prod_id in('BR01', 'BR02', 'BR03'); ``` ### è¿åææä»·æ ¼å¨ 3 ç¾å å° 6 ç¾å ä¹é´ç产åçåç§°åä»·æ ¼ æè¡¨ `Products`ï¼ | prod_id | prod_name | prod_price | | ------- | --------- | ---------- | | a0011 | egg | 3 | | a0019 | sockets | 4 | | b0019 | coffee | 15 | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿åææä»·æ ¼å¨ 3 ç¾å å° 6 ç¾å ä¹é´ç产åçåç§°ï¼`prod_name`ï¼åä»·æ ¼ï¼`prod_price`ï¼ï¼ä½¿ç¨ AND æä½ç¬¦ï¼ç¶åæä»·æ ¼å¯¹ç»æè¿è¡ååºæåºã çæ¡ï¼ ```sql select prod_name, prod_price from Products where prod_price between 3 and 6 order by prod_price; ``` ### æ£æ¥ SQL è¯å¥ ä¾åºå表 `Vendors` æå段ä¾åºååç§° `vend_name`ãä¾åºåå½å®¶ `vend_country`ãä¾åºåç份 `vend_state` | vend_name | vend_country | vend_state | | --------- | ------------ | ---------- | | apple | USA | CA | | vivo | CNA | shenzhen | | huawei | CNA | xian | ãé®é¢ãä¿®æ¹æ£ç¡®ä¸é¢ sqlï¼ä½¿ä¹æ£ç¡®è¿åã ```sql SELECT vend_name FROM Vendors ORDER BY vend_name WHERE vend_country = 'USA' AND vend_state = 'CA'; ``` ä¿®æ¹åï¼ ```sql select vend_name from Vendors where vend_country = 'USA' and vend_state = 'CA' order by vend_name; ``` `order by` è¯å¥å¿ é¡»æ¾å¨ where ä¹åã ## ç¨éé 符è¿è¡è¿æ»¤ SQL éé ç¬¦å¿ é¡»ä¸ `LIKE` è¿ç®ç¬¦ä¸èµ·ä½¿ç¨ å¨ SQL ä¸ï¼å¯ä½¿ç¨ä»¥ä¸éé ç¬¦ï¼ | éé 符 | æè¿° | | :------------------------------- | :------------------------- | | `%` | 代表é¶ä¸ªæå¤ä¸ªå符 | | `_` | ä» æ¿ä»£ä¸ä¸ªå符 | | `[charlist]` | å符åä¸çä»»ä½åä¸å符 | | `[^charlist]` æè `[!charlist]` | ä¸å¨å符åä¸çä»»ä½åä¸å符 | ### æ£ç´¢äº§ååç§°åæè¿°ï¼ä¸ï¼ `Products` 表å¦ä¸ï¼ | prod_name | prod_desc | | --------- | -------------- | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t-shirts | | c0019 | gucci toy | | d0019 | lego toy | ãé®é¢ãç¼å SQL è¯å¥ï¼ä» `Products` è¡¨ä¸æ£ç´¢äº§ååç§°ï¼`prod_name`ï¼åæè¿°ï¼`prod_desc`ï¼ï¼ä» è¿åæè¿°ä¸å å« `toy` ä¸è¯ç产ååç§°ã çæ¡ï¼ ```sql select prod_name, prod_desc from Products where prod_desc like '%toy%'; ``` ### æ£ç´¢äº§ååç§°åæè¿°ï¼äºï¼ `Products` 表å¦ä¸ï¼ | prod_name | prod_desc | | --------- | -------------- | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t-shirts | | c0019 | gucci toy | | d0019 | lego toy | ãé®é¢ãç¼å SQL è¯å¥ï¼ä» `Products` è¡¨ä¸æ£ç´¢äº§ååç§°ï¼`prod_name`ï¼åæè¿°ï¼`prod_desc`ï¼ï¼ä» è¿åæè¿°ä¸æªåºç° `toy` ä¸è¯ç产åï¼æåæâ产ååç§°âå¯¹ç»æè¿è¡æåºã çæ¡ï¼ ```sql select prod_name, prod_desc from Products where prod_desc not like '%toy%' order by prod_name; ``` ### æ£ç´¢äº§ååç§°åæè¿°ï¼ä¸ï¼ `Products` 表å¦ä¸ï¼ | prod_name | prod_desc | | --------- | ---------------- | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t-shirts | | c0019 | gucci toy | | d0019 | lego carrots toy | ãé®é¢ãç¼å SQL è¯å¥ï¼ä» `Products` è¡¨ä¸æ£ç´¢äº§ååç§°ï¼`prod_name`ï¼åæè¿°ï¼`prod_desc`ï¼ï¼ä» è¿åæè¿°ä¸åæ¶åºç° `toy` å `carrots` ç产åãæå¥½å ç§æ¹æ³å¯ä»¥æ§è¡æ¤æä½ï¼ä½å¯¹äºè¿ä¸ªææé¢ï¼è¯·ä½¿ç¨ `AND` å两个 `LIKE` æ¯è¾ã çæ¡ï¼ ```sql select prod_name, prod_desc from Products where prod_desc like '%toy%' and prod_desc like "%carrots%"; ``` ### æ£ç´¢äº§ååç§°åæè¿°ï¼åï¼ `Products` 表å¦ä¸ï¼ | prod_name | prod_desc | | --------- | ---------------- | | a0011 | usb | | a0019 | iphone13 | | b0019 | gucci t-shirts | | c0019 | gucci toy | | d0019 | lego toy carrots | ãé®é¢ãç¼å SQL è¯å¥ï¼ä» Products è¡¨ä¸æ£ç´¢äº§ååç§°ï¼prod_nameï¼åæè¿°ï¼prod_descï¼ï¼ä» è¿åå¨æè¿°ä¸ä»¥**å å顺åº**åæ¶åºç° toy å carrots ç产åãæç¤ºï¼åªéè¦ç¨å¸¦æä¸ä¸ª `%` 符å·ç `LIKE` å³å¯ã çæ¡ï¼ ```sql select prod_name, prod_desc from Products where prod_desc like '%toy%carrots%'; ``` ## å建计ç®å段 ### å«å å«åç常è§ç¨æ³æ¯å¨æ£ç´¢åºçç»æä¸éå½å表çååæ®µï¼ä¸ºäºç¬¦åç¹å®çæ¥è¡¨è¦æ±æå®¢æ·éæ±ï¼ãæè¡¨ `Vendors` 代表ä¾åºåä¿¡æ¯ï¼`vend_id` ä¾åºå idã`vend_name` ä¾åºååç§°ã`vend_address` ä¾åºåå°åã`vend_city` ä¾åºååå¸ã | vend_id | vend_name | vend_address | vend_city | | ------- | ------------- | ------------ | --------- | | a001 | tencent cloud | address1 | shenzhen | | a002 | huawei cloud | address2 | dongguan | | a003 | aliyun cloud | address3 | hangzhou | | a003 | netease cloud | address4 | guangzhou | ãé®é¢ãç¼å SQL è¯å¥ï¼ä» `Vendors` è¡¨ä¸æ£ç´¢ `vend_id`ã`vend_name`ã`vend_address` å `vend_city`ï¼å° `vend_name` éå½å为 `vname`ï¼å° `vend_city` éå½å为 `vcity`ï¼å° `vend_address` éå½å为 `vaddress`ï¼æä¾åºååç§°å¯¹ç»æè¿è¡ååºæåºã çæ¡ï¼ ```sql select vend_id, vend_name as vname, vend_address as vaddress, vend_city as vcity from Vendors order by vname; # as å¯ä»¥çç¥ select vend_id, vend_name vname, vend_address vaddress, vend_city vcity from Vendors order by vname; ``` ### ææ æä»¬ç示ä¾ååºæ£å¨è¿è¡ææä¿éï¼ææäº§ååéä»· 10%ã`Products` 表å å« `prod_id` 产å idã`prod_price` 产åä»·æ ¼ã ãé®é¢ãç¼å SQL è¯å¥ï¼ä» `Products` 表ä¸è¿å `prod_id`ã`prod_price` å `sale_price`ã`sale_price` æ¯ä¸ä¸ªå å«ä¿éä»·æ ¼ç计ç®å段ãæç¤ºï¼å¯ä»¥ä¹ä»¥ 0.9ï¼å¾å°åä»·ç 90%ï¼å³ 10%çææ£ï¼ã çæ¡ï¼ ```sql select prod_id, prod_price, prod_price * 0.9 as sale_price from Products; ``` 注æï¼`sale_price` æ¯å¯¹è®¡ç®ç»æçå½åï¼è䏿¯åæçååã ## 使ç¨å½æ°å¤çæ°æ® ### 顾客ç»å½å æä»¬çååºå·²ç»ä¸çº¿äºï¼æ£å¨å建顾客账æ·ãææç¨æ·é½éè¦ç»å½åï¼é»è®¤ç»å½åæ¯å ¶åç§°åæå¨åå¸çç»åã ç»åº `Customers` 表 å¦ä¸ï¼ | cust_id | cust_name | cust_contact | cust_city | | ------- | --------- | ------------ | --------- | | a1 | Andy Li | Andy Li | Oak Park | | a2 | Ben Liu | Ben Liu | Oak Park | | a3 | Tony Dai | Tony Dai | Oak Park | | a4 | Tom Chen | Tom Chen | Oak Park | | a5 | An Li | An Li | Oak Park | | a6 | Lee Chen | Lee Chen | Oak Park | | a7 | Hex Liu | Hex Liu | Oak Park | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿å顾客 IDï¼`cust_id`ï¼ã顾客åç§°ï¼`cust_name`ï¼åç»å½åï¼`user_login`ï¼ï¼å ¶ä¸ç»å½åå ¨é¨ä¸ºå¤§å忝ï¼å¹¶ç±é¡¾å®¢è系人çå两个å符ï¼`cust_contact`ï¼åå ¶æå¨åå¸çåä¸ä¸ªå符ï¼`cust_city`ï¼ç»æãæç¤ºï¼éè¦ä½¿ç¨å½æ°ãæ¼æ¥åå«åã çæ¡ï¼ ```sql select cust_id, cust_name, upper(concat(substring(cust_contact, 1, 2), substring(cust_city, 1, 3))) as user_login from Customers; ``` ç¥è¯ç¹ï¼ - æªå彿°`substring()`ï¼æªåå符串ï¼`substring(str ,n ,m)`ï¼è¿åå符串 str ä»ç¬¬ n 个å符æªåå°ç¬¬ m 个å符ï¼å·¦éå³éï¼ï¼ - æ¼æ¥å½æ°`concat()`ï¼å°ä¸¤ä¸ªæå¤ä¸ªåç¬¦ä¸²è¿æ¥æä¸ä¸ªå符串ï¼select concat(A,B) ï¼è¿æ¥å符串 A å Bã - 大å彿° `upper()`ï¼å°æå®å符串转æ¢ä¸ºå¤§åã ### è¿å 2020 å¹´ 1 æçææè®¢åç订åå·åè®¢åæ¥æ `Orders` 订å表å¦ä¸ï¼ | order_num | order_date | | --------- | ------------------- | | a0001 | 2020-01-01 00:00:00 | | a0002 | 2020-01-02 00:00:00 | | a0003 | 2020-01-01 12:00:00 | | a0004 | 2020-02-01 00:00:00 | | a0005 | 2020-03-01 00:00:00 | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿å 2020 å¹´ 1 æçææè®¢åç订åå·ï¼`order_num`ï¼åè®¢åæ¥æï¼`order_date`ï¼ï¼å¹¶æè®¢åæ¥æååºæåº çæ¡ï¼ ```sql select order_num, order_date from Orders where month(order_date) = '01' and year(order_date) = '2020' order by order_date; ``` ä¹å¯ä»¥ç¨éé 符æ¥åï¼ ```sql select order_num, order_date from Orders where order_date like '2020-01%' order by order_date; ``` ç¥è¯ç¹ï¼ - æ¥ææ ¼å¼ï¼`YYYY-MM-DD` - æ¶é´æ ¼å¼ï¼`HH:MM:SS` æ¥æåæ¶é´å¤çç¸å ³ç常ç¨å½æ°ï¼ | å½ æ° | 说 æ | | --------------- | ------------------------------ | | `adddate()` | å¢å ä¸ä¸ªæ¥æï¼å¤©ãå¨çï¼ | | `addtime()` | å¢å ä¸ä¸ªæ¶é´ï¼æ¶ãåçï¼ | | `curdate()` | è¿åå½åæ¥æ | | `curtime()` | è¿åå½åæ¶é´ | | `date()` | è¿åæ¥ææ¶é´çæ¥æé¨å | | `datediff()` | 计ç®ä¸¤ä¸ªæ¥æä¹å·® | | `date_format()` | è¿åä¸ä¸ªæ ¼å¼åçæ¥æææ¶é´ä¸² | | `day()` | è¿åä¸ä¸ªæ¥æç天æ°é¨å | | `dayofweek()` | 对äºä¸ä¸ªæ¥æï¼è¿å对åºçææå | | `hour()` | è¿åä¸ä¸ªæ¶é´çå°æ¶é¨å | | `minute()` | è¿åä¸ä¸ªæ¶é´çåéé¨å | | `month()` | è¿åä¸ä¸ªæ¥æçæä»½é¨å | | `now()` | è¿åå½åæ¥æåæ¶é´ | | `second()` | è¿åä¸ä¸ªæ¶é´çç§é¨å | | `time()` | è¿åä¸ä¸ªæ¥ææ¶é´çæ¶é´é¨å | | `year()` | è¿åä¸ä¸ªæ¥æç年份é¨å | ## æ±æ»æ°æ® æ±æ»æ°æ®ç¸å ³ç彿°ï¼ | å½ æ° | 说 æ | | --------- | ---------------- | | `avg()` | è¿åæåçå¹³åå¼ | | `count()` | è¿åæåçè¡æ° | | `max()` | è¿åæåçæå¤§å¼ | | `min()` | è¿åæåçæå°å¼ | | `sum()` | è¿åæåå¼ä¹å | ### ç¡®å®å·²å®åºäº§åçæ»æ° `OrderItems` 表代表å®åºç产åï¼`quantity` 代表å®åºååæ°éã | quantity | | -------- | | 10 | | 100 | | 1000 | | 10001 | | 2 | | 15 | ãé®é¢ãç¼å SQL è¯å¥ï¼ç¡®å®å·²å®åºäº§åçæ»æ°ã çæ¡ï¼ ```sql select sum(quantity) as items_ordered from OrderItems; ``` ### ç¡®å®å·²å®åºäº§å项 BR01 çæ»æ° `OrderItems` 表代表å®åºç产åï¼`quantity` 代表å®åºååæ°éï¼äº§å项为 `prod_id`ã | quantity | prod_id | | -------- | ------- | | 10 | AR01 | | 100 | AR10 | | 1000 | BR01 | | 10001 | BR010 | ãé®é¢ãä¿®æ¹å建çè¯å¥ï¼ç¡®å®å·²å®åºäº§å项ï¼`prod_id`ï¼ä¸º"BR01"çæ»æ°ã çæ¡ï¼ ```sql select sum(quantity) as items_ordered from OrderItems where prod_id = 'BR01'; ``` ### ç¡®å® Products 表ä¸ä»·æ ¼ä¸è¶ è¿ 10 ç¾å çæè´µäº§åçä»·æ ¼ `Products` 表å¦ä¸ï¼`prod_price` 代表ååçä»·æ ¼ã | prod_price | | ---------- | | 9.49 | | 600 | | 1000 | ãé®é¢ãç¼å SQL è¯å¥ï¼ç¡®å® `Products` 表ä¸ä»·æ ¼ä¸è¶ è¿ 10 ç¾å çæè´µäº§åçä»·æ ¼ï¼`prod_price`ï¼ãå°è®¡ç®æå¾çåæ®µå½å为 `max_price`ã çæ¡ï¼ ```sql select max(prod_price) as max_price from Products where prod_price <= 10; ``` ## åç»æ°æ® `group by` ï¼ - `group by` åå¥å°è®°å½åç»å°æ±æ»è¡ä¸ã - `group by` 为æ¯ä¸ªç»è¿åä¸ä¸ªè®°å½ã - `group by` éå¸¸è¿æ¶åèå`count`ï¼`max`ï¼`sum`ï¼`avg` çã - `group by` å¯ä»¥æä¸åæå¤åè¿è¡åç»ã - `group by` æåç»å段è¿è¡æåºåï¼`order by` å¯ä»¥ä»¥æ±æ»å段æ¥è¿è¡æåºã `having`ï¼ - `having` ç¨äºå¯¹æ±æ»ç `group by` ç»æè¿è¡è¿æ»¤ã - `having` å¿ é¡»è¦ä¸ `group by` è¿ç¨ã - `where` å `having` å¯ä»¥å¨ç¸åçæ¥è¯¢ä¸ã `having` vs `where`ï¼ - `where`ï¼è¿æ»¤è¿æ»¤æå®çè¡ï¼åé¢ä¸è½å èå彿°ï¼åç»å½æ°ï¼ã - `having`ï¼è¿æ»¤åç»ï¼å¿ é¡»è¦ä¸ `group by` è¿ç¨ï¼ä¸è½åç¬ä½¿ç¨ã ### è¿åæ¯ä¸ªè®¢åå·åæå¤å°è¡æ° `OrderItems` 表å 嫿¯ä¸ªè®¢åçæ¯ä¸ªäº§å | order_num | | --------- | | a002 | | a002 | | a002 | | a004 | | a007 | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿åæ¯ä¸ªè®¢åå·ï¼`order_num`ï¼åæå¤å°è¡æ°ï¼`order_lines`ï¼ï¼å¹¶æ `order_lines` å¯¹ç»æè¿è¡ååºæåºã çæ¡ï¼ ```sql select order_num, count(order_num) as order_lines from OrderItems group by order_num order by order_lines; ``` ç¥è¯ç¹ï¼ 1. `count(*)`,`count(åå)`é½å¯ä»¥ï¼åºå«å¨äºï¼`count(åå)`æ¯ç»è®¡é NULL çè¡æ°ï¼ 2. `order by` æåæ§è¡ï¼æä»¥å¯ä»¥ä½¿ç¨åå«åï¼ 3. åç»èåä¸å®ä¸è¦å¿è®°å ä¸ `group by` ,ä¸ç¶åªä¼æä¸è¡ç»æã ### æ¯ä¸ªä¾åºåææ¬æä½çäº§å æ `Products` 表ï¼å«æå段 `prod_price` 代表产åä»·æ ¼ï¼`vend_id` 代表ä¾åºå id | vend_id | prod_price | | ------- | ---------- | | a0011 | 100 | | a0019 | 0.1 | | b0019 | 1000 | | b0019 | 6980 | | b0019 | 20 | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿åå为 `cheapest_item` çåæ®µï¼è¯¥å段å 嫿¯ä¸ªä¾åºåææ¬æä½ç产åï¼ä½¿ç¨ `Products` 表ä¸ç `prod_price`ï¼ï¼ç¶å仿使æ¬å°æé«ææ¬å¯¹ç»æè¿è¡ååºæåºã çæ¡ï¼ ```sql select vend_id, min(prod_price) as cheapest_item from Products group by vend_id order by cheapest_item; ``` ### è¿åè®¢åæ°éæ»åä¸å°äº 100 çææè®¢åç订åå· `OrderItems` 代表订ååå表ï¼å æ¬ï¼è®¢åå· `order_num` åè®¢åæ°é `quantity`ã | order_num | quantity | | --------- | -------- | | a1 | 105 | | a2 | 1100 | | a2 | 200 | | a4 | 1121 | | a5 | 10 | | a2 | 19 | | a7 | 5 | ãé®é¢ã请ç¼å SQL è¯å¥ï¼è¿åè®¢åæ°éæ»åä¸å°äº 100 çææè®¢åå·ï¼æåç»ææç §è®¢åå·ååºæåºã çæ¡ï¼ ```sql # ç´æ¥èå select order_num from OrderItems group by order_num having sum(quantity) >= 100 order by order_num; # åæ¥è¯¢ select order_num from (select order_num, sum(quantity) as sum_num from OrderItems group by order_num having sum_num >= 100 ) a order by order_num; ``` ç¥è¯ç¹ï¼ - `where`ï¼è¿æ»¤è¿æ»¤æå®çè¡ï¼åé¢ä¸è½å èå彿°ï¼åç»å½æ°ï¼ã - `having`ï¼è¿æ»¤åç»ï¼ä¸ `group by` è¿ç¨ï¼ä¸è½åç¬ä½¿ç¨ã ### è®¡ç®æ»å `OrderItems` 表代表订åä¿¡æ¯ï¼å æ¬å段ï¼è®¢åå· `order_num` å `item_price` ååå®åºä»·æ ¼ã`quantity` ååæ°éã | order_num | item_price | quantity | | --------- | ---------- | -------- | | a1 | 10 | 105 | | a2 | 1 | 1100 | | a2 | 1 | 200 | | a4 | 2 | 1121 | | a5 | 5 | 10 | | a2 | 1 | 19 | | a7 | 7 | 5 | ãé®é¢ãç¼å SQL è¯å¥ï¼æ ¹æ®è®¢åå·èåï¼è¿åè®¢åæ»ä»·ä¸å°äº 1000 çææè®¢åå·ï¼æåçç»ææè®¢åå·è¿è¡ååºæåºã æç¤ºï¼æ»ä»· = item_price ä¹ä»¥ quantity çæ¡ï¼ ```sql select order_num, sum(item_price * quantity) as total_price from OrderItems group by order_num having total_price >= 1000 order by order_num; ``` ### æ£æ¥ SQL è¯å¥ `OrderItems` è¡¨å«æ `order_num` 订åå· | order_num | | --------- | | a002 | | a002 | | a002 | | a004 | | a007 | ãé®é¢ãå°ä¸é¢ä»£ç ä¿®æ¹æ£ç¡®åæ§è¡ ```sql SELECT order_num, COUNT(*) AS items FROM OrderItems GROUP BY items HAVING COUNT(*) >= 3 ORDER BY items, order_num; ``` ä¿®æ¹åï¼ ```sql SELECT order_num, COUNT(*) AS items FROM OrderItems GROUP BY order_num HAVING items >= 3 ORDER BY items, order_num; ``` ## 使ç¨åæ¥è¯¢ åæ¥è¯¢æ¯åµå¥å¨è¾å¤§æ¥è¯¢ä¸ç 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 å ³é®å为该临æ¶è¡¨èµ·ä¸ä¸ªååã ### è¿åè´ä¹°ä»·æ ¼ä¸º 10 ç¾å æä»¥ä¸äº§åç顾客å表 `OrderItems` 表示订ååå表ï¼å«æå段订åå·ï¼`order_num`ã订åä»·æ ¼ï¼`item_price`ï¼`Orders` 表代表订åä¿¡æ¯è¡¨ï¼å«æé¡¾å®¢ `idï¼cust_id` å订åå·ï¼`order_num` `OrderItems` 表: | order_num | item_price | | --------- | ---------- | | a1 | 10 | | a2 | 1 | | a2 | 1 | | a4 | 2 | | a5 | 5 | | a2 | 1 | | a7 | 7 | `Orders` è¡¨ï¼ | order_num | cust_id | | --------- | ------- | | a1 | cust10 | | a2 | cust1 | | a2 | cust1 | | a4 | cust2 | | a5 | cust5 | | a2 | cust1 | | a7 | cust7 | ãé®é¢ã使ç¨åæ¥è¯¢ï¼è¿åè´ä¹°ä»·æ ¼ä¸º 10 ç¾å æä»¥ä¸äº§åç顾客å表ï¼ç»ææ éæåºã çæ¡ï¼ ```sql select cust_id from Orders where order_num in ( select order_num from OrderItems group by order_num having sum(item_price) >= 10 ); ``` ### ç¡®å®åªäºè®¢åè´ä¹°äº prod_id 为 BR01 ç产åï¼ä¸ï¼ 表 `OrderItems` 代表订åååä¿¡æ¯è¡¨ï¼`prod_id` 为产å idï¼`Orders` 表代表订å表æ `cust_id` 代表顾客 id åè®¢åæ¥æ `order_date` `OrderItems` è¡¨ï¼ | prod_id | order_num | | ------- | --------- | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | `Orders` è¡¨ï¼ | order_num | cust_id | order_date | | --------- | ------- | ------------------- | | a0001 | cust10 | 2022-01-01 00:00:00 | | a0002 | cust1 | 2022-01-01 00:01:00 | | a0003 | cust1 | 2022-01-02 00:00:00 | | a0013 | cust2 | 2022-01-01 00:20:00 | ãé®é¢ã ç¼å SQL è¯å¥ï¼ä½¿ç¨åæ¥è¯¢æ¥ç¡®å®åªäºè®¢åï¼å¨ `OrderItems` ä¸ï¼è´ä¹°äº `prod_id` 为 "BR01" ç产åï¼ç¶åä» `Orders` 表ä¸è¿åæ¯ä¸ªäº§å对åºç顾客 IDï¼`cust_id`ï¼åè®¢åæ¥æï¼`order_date`ï¼ï¼æè®¢è´æ¥æå¯¹ç»æè¿è¡ååºæåºã çæ¡ï¼ ```sql # åæ³ 1ï¼åæ¥è¯¢ select cust_id, order_date from Orders where order_num in ( select order_num from OrderItems where prod_id = 'BR01' ) order by order_date; # åæ³ 2: è¿æ¥è¡¨ select b.cust_id, b.order_date from OrderItems a, Orders b where a.order_num = b.order_num and a.prod_id = 'BR01' order by order_date; ``` ### è¿åè´ä¹° prod_id 为 BR01 ç产åçææé¡¾å®¢ççµåé®ä»¶ï¼ä¸ï¼ ä½ æ³ç¥éè®¢è´ BR01 产åçæ¥æï¼æè¡¨ `OrderItems` 代表订åååä¿¡æ¯è¡¨ï¼`prod_id` 为产å idï¼`Orders` 表代表订å表æ `cust_id` 代表顾客 id åè®¢åæ¥æ `order_date`ï¼`Customers` è¡¨å«æ `cust_email` 顾客é®ä»¶å `cust_id` 顾客 id `OrderItems` è¡¨ï¼ | prod_id | order_num | | ------- | --------- | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | `Orders` è¡¨ï¼ | order_num | cust_id | order_date | | --------- | ------- | ------------------- | | a0001 | cust10 | 2022-01-01 00:00:00 | | a0002 | cust1 | 2022-01-01 00:01:00 | | a0003 | cust1 | 2022-01-02 00:00:00 | | a0013 | cust2 | 2022-01-01 00:20:00 | `Customers` 表代表顾客信æ¯ï¼`cust_id` 为顾客 idï¼`cust_email` 为顾客 email | cust_id | cust_email | | ------- | --------------- | | cust10 | [email protected] | | cust1 | [email protected] | | cust2 | [email protected] | ãé®é¢ãè¿åè´ä¹° `prod_id` 为 `BR01` ç产åçææé¡¾å®¢ççµåé®ä»¶ï¼`Customers` 表ä¸ç `cust_email`ï¼ï¼ç»ææ éæåºã æç¤ºï¼è¿æ¶å `SELECT` è¯å¥ï¼æå å±çä» `OrderItems` 表è¿å `order_num`ï¼ä¸é´çä» `Customers` 表è¿å `cust_id`ã çæ¡ï¼ ```sql # åæ³ 1ï¼åæ¥è¯¢ select cust_email from Customers where cust_id in ( select cust_id from Orders where order_num in ( select order_num from OrderItems where prod_id = 'BR01' ) ); # åæ³ 2: è¿æ¥è¡¨ï¼inner joinï¼ select c.cust_email from OrderItems a, Orders b, Customers c where a.order_num = b.order_num and b.cust_id = c.cust_id and a.prod_id = 'BR01'; # åæ³ 3ï¼è¿æ¥è¡¨ï¼left joinï¼ select c.cust_email from Orders a left join OrderItems b on a.order_num = b.order_num left join Customers c on a.cust_id = c.cust_id where b.prod_id = 'BR01'; ``` ### è¿åæ¯ä¸ªé¡¾å®¢ä¸å订åçæ»éé¢ æä»¬éè¦ä¸ä¸ªé¡¾å®¢ ID å表ï¼å ¶ä¸å å«ä»ä»¬å·²è®¢è´çæ»éé¢ã `OrderItems` 表代表订åä¿¡æ¯ï¼`OrderItems` 表æè®¢åå·ï¼`order_num` åååå®åºä»·æ ¼ï¼`item_price`ãååæ°éï¼`quantity`ã | order_num | item_price | quantity | | --------- | ---------- | -------- | | a0001 | 10 | 105 | | a0002 | 1 | 1100 | | a0002 | 1 | 200 | | a0013 | 2 | 1121 | | a0003 | 5 | 10 | | a0003 | 1 | 19 | | a0003 | 7 | 5 | `Orders` 表订åå·ï¼`order_num`ã顾客 idï¼`cust_id` | order_num | cust_id | | --------- | ------- | | a0001 | cust10 | | a0002 | cust1 | | a0003 | cust1 | | a0013 | cust2 | ãé®é¢ã ç¼å SQL è¯å¥ï¼è¿å顾客 IDï¼`Orders` 表ä¸ç `cust_id`ï¼ï¼å¹¶ä½¿ç¨åæ¥è¯¢è¿å `total_ordered` 以便è¿åæ¯ä¸ªé¡¾å®¢çè®¢åæ»æ°ï¼å°ç»ææéé¢ä»å¤§å°å°æåºã çæ¡ï¼ ```sql # åæ³ 1ï¼åæ¥è¯¢ SELECT o.cust_id cust_id, tb.total_ordered total_ordered FROM ( SELECT order_num, SUM(item_price * quantity) total_ordered FROM OrderItems GROUP BY order_num ) as tb, Orders o WHERE tb.order_num = o.order_num ORDER BY total_ordered DESC; # åæ³ 2ï¼è¿æ¥è¡¨ select b.cust_id, sum(a.quantity * a.item_price) as total_ordered from OrderItems a, Orders b where a.order_num = b.order_num group by cust_id order by total_ordered desc; ``` ### ä» Products è¡¨ä¸æ£ç´¢ææç产åå称以å对åºçé宿»æ° `Products` è¡¨ä¸æ£ç´¢ææç产ååç§°ï¼`prod_name`ã产å idï¼`prod_id` | prod_id | prod_name | | ------- | --------- | | a0001 | egg | | a0002 | sockets | | a0013 | coffee | | a0003 | cola | `OrderItems` 代表订ååå表ï¼è®¢å产åï¼`prod_id`ãå®åºæ°éï¼`quantity` | prod_id | quantity | | ------- | -------- | | a0001 | 105 | | a0002 | 1100 | | a0002 | 200 | | a0013 | 1121 | | a0003 | 10 | | a0003 | 19 | | a0003 | 5 | ãé®é¢ã ç¼å SQL è¯å¥ï¼ä» `Products` è¡¨ä¸æ£ç´¢ææç产ååç§°ï¼`prod_name`ï¼ï¼ä»¥åå为 `quant_sold` ç计ç®åï¼å ¶ä¸å 嫿å®äº§åçæ»æ°ï¼å¨ `OrderItems` 表ä¸ä½¿ç¨åæ¥è¯¢å `SUM(quantity)` æ£ç´¢ï¼ã çæ¡ï¼ ```sql # åæ³ 1ï¼åæ¥è¯¢ select p.prod_name, tb.quant_sold from ( select prod_id, sum(quantity) as quant_sold from OrderItems group by prod_id ) as tb, Products p where tb.prod_id = p.prod_id; # åæ³ 2ï¼è¿æ¥è¡¨ select p.prod_name, sum(o.quantity) as quant_sold from Products p, OrderItems o where p.prod_id = o.prod_id group by p.prod_name;ï¼è¿éä¸è½ç¨ p.prod_idï¼ä¼æ¥éï¼ ``` ## è¿æ¥è¡¨ 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; ``` ### è¿å顾客åç§°åç¸å ³è®¢åå· `Customers` 表æå段顾客åç§° `cust_name`ã顾客 id `cust_id` | cust_id | cust_name | | -------- | --------- | | cust10 | andy | | cust1 | ben | | cust2 | tony | | cust22 | tom | | cust221 | an | | cust2217 | hex | `Orders` 订åä¿¡æ¯è¡¨ï¼å«æå段 `order_num` 订åå·ã`cust_id` 顾客 id | order_num | cust_id | | --------- | -------- | | a1 | cust10 | | a2 | cust1 | | a3 | cust2 | | a4 | cust22 | | a5 | cust221 | | a7 | cust2217 | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿å `Customers` 表ä¸ç顾客åç§°ï¼`cust_name`ï¼å `Orders` 表ä¸çç¸å ³è®¢åå·ï¼`order_num`ï¼ï¼å¹¶æé¡¾å®¢åç§°åæè®¢åå·å¯¹ç»æè¿è¡ååºæåºãä½ å¯ä»¥å°è¯ç¨ä¸¤ä¸ªä¸åçåæ³ï¼ä¸ä¸ªä½¿ç¨ç®åççè¿æ¥è¯æ³ï¼å¦å¤ä¸ä¸ªä½¿ç¨ INNER JOINã çæ¡ï¼ ```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,o.order_num; # æ¾å¼å è¿æ¥ select c.cust_name, o.order_num from Customers c inner join Orders o using(cust_id) order by c.cust_name,o.order_num; ``` ### è¿å顾客åç§°åç¸å ³è®¢åå·ä»¥åæ¯ä¸ªè®¢åçæ»ä»· `Customers` 表æå段ï¼é¡¾å®¢åç§°ï¼`cust_name`ã顾客 idï¼`cust_id` | cust_id | cust_name | | -------- | --------- | | cust10 | andy | | cust1 | ben | | cust2 | tony | | cust22 | tom | | cust221 | an | | cust2217 | hex | `Orders` 订åä¿¡æ¯è¡¨ï¼å«æå段ï¼è®¢åå·ï¼`order_num`ã顾客 idï¼`cust_id` | order_num | cust_id | | --------- | -------- | | a1 | cust10 | | a2 | cust1 | | a3 | cust2 | | a4 | cust22 | | a5 | cust221 | | a7 | cust2217 | `OrderItems` 表æå段ï¼åå订åå·ï¼`order_num`ãååæ°éï¼`quantity`ãååä»·æ ¼ï¼`item_price` | order_num | quantity | item_price | | --------- | -------- | ---------- | | a1 | 1000 | 10 | | a2 | 200 | 10 | | a3 | 10 | 15 | | a4 | 25 | 50 | | a5 | 15 | 25 | | a7 | 7 | 7 | ãé®é¢ãé¤äºè¿å顾客åç§°å订åå·ï¼è¿å `Customers` 表ä¸ç顾客åç§°ï¼`cust_name`ï¼å `Orders` 表ä¸çç¸å ³è®¢åå·ï¼`order_num`ï¼ï¼æ·»å 第ä¸å `OrderTotal`ï¼å ¶ä¸å 嫿¯ä¸ªè®¢åçæ»ä»·ï¼å¹¶æé¡¾å®¢åç§°åæè®¢åå·å¯¹ç»æè¿è¡ååºæåºã ```sql # ç®åççè¿æ¥è¯æ³ select c.cust_name, o.order_num, sum(quantity * item_price) as OrderTotal from Customers c, Orders o, OrderItems oi where c.cust_id = o.cust_id and o.order_num = oi.order_num group by c.cust_name, o.order_num order by c.cust_name, o.order_num; ``` 注æï¼å¯è½æå°ä¼ä¼´ä¼è¿æ ·åï¼ ```sql select c.cust_name, o.order_num, sum(quantity * item_price) as OrderTotal from Customers c, Orders o, OrderItems oi where c.cust_id = o.cust_id and o.order_num = oi.order_num group by c.cust_name order by c.cust_name, o.order_num; ``` è¿æ¯é误çï¼åªå¯¹ `cust_name` è¿è¡è类确å®ç¬¦å颿ï¼ä½æ¯ä¸ç¬¦å `group by` çè¯æ³ã select è¯å¥ä¸ï¼å¦ææ²¡æ `group by` è¯å¥ï¼é£ä¹ `cust_name`ã`order_num` ä¼è¿åè¥å¹²ä¸ªå¼ï¼è `sum(quantity _ item_price)` åªè¿åä¸ä¸ªå¼ï¼éè¿ `group by` `cust_name` å¯ä»¥è®© `cust_name` å `sum(quantity _ item_price)` ä¸ä¸å¯¹åºèµ·æ¥ï¼æè 说**èç±»**ï¼æä»¥åæ ·çï¼ä¹è¦å¯¹ `order_num` è¿è¡èç±»ã > **ä¸å¥è¯ï¼select ä¸çåæ®µè¦ä¹é½èç±»ï¼è¦ä¹é½ä¸èç±»** ### ç¡®å®åªäºè®¢åè´ä¹°äº prod_id 为 BR01 ç产åï¼äºï¼ 表 `OrderItems` 代表订åååä¿¡æ¯è¡¨ï¼`prod_id` 为产å idï¼`Orders` 表代表订å表æ `cust_id` 代表顾客 id åè®¢åæ¥æ `order_date` `OrderItems` è¡¨ï¼ | prod_id | order_num | | ------- | --------- | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | `Orders` è¡¨ï¼ | order_num | cust_id | order_date | | --------- | ------- | ------------------- | | a0001 | cust10 | 2022-01-01 00:00:00 | | a0002 | cust1 | 2022-01-01 00:01:00 | | a0003 | cust1 | 2022-01-02 00:00:00 | | a0013 | cust2 | 2022-01-01 00:20:00 | ãé®é¢ã ç¼å SQL è¯å¥ï¼ä½¿ç¨åæ¥è¯¢æ¥ç¡®å®åªäºè®¢åï¼å¨ `OrderItems` ä¸ï¼è´ä¹°äº `prod_id` 为 "BR01" ç产åï¼ç¶åä» `Orders` 表ä¸è¿åæ¯ä¸ªäº§å对åºç顾客 IDï¼`cust_id`ï¼åè®¢åæ¥æï¼`order_date`ï¼ï¼æè®¢è´æ¥æå¯¹ç»æè¿è¡ååºæåºã æç¤ºï¼è¿ä¸æ¬¡ä½¿ç¨è¿æ¥åç®åççè¿æ¥è¯æ³ã ```sql # åæ³ 1ï¼åæ¥è¯¢ select cust_id, order_date from Orders where order_num in ( select order_num from OrderItems where prod_id = 'BR01' ) order by order_date; # åæ³ 2ï¼è¿æ¥è¡¨ inner join select cust_id, order_date from Orders o inner join ( select order_num from OrderItems where prod_id = 'BR01' ) tb on o.order_num = tb.order_num order by order_date; # åæ³ 3ï¼åæ³ 2 çç®åç select cust_id, order_date from Orders inner join OrderItems using(order_num) where OrderItems.prod_id = 'BR01' order by order_date; ``` ### è¿åè´ä¹° prod_id 为 BR01 ç产åçææé¡¾å®¢ççµåé®ä»¶ï¼äºï¼ æè¡¨ `OrderItems` 代表订åååä¿¡æ¯è¡¨ï¼`prod_id` 为产å idï¼`Orders` 表代表订å表æ `cust_id` 代表顾客 id åè®¢åæ¥æ `order_date`ï¼`Customers` è¡¨å«æ `cust_email` 顾客é®ä»¶å cust_id 顾客 id `OrderItems` è¡¨ï¼ | prod_id | order_num | | ------- | --------- | | BR01 | a0001 | | BR01 | a0002 | | BR02 | a0003 | | BR02 | a0013 | `Orders` è¡¨ï¼ | order_num | cust_id | order_date | | --------- | ------- | ------------------- | | a0001 | cust10 | 2022-01-01 00:00:00 | | a0002 | cust1 | 2022-01-01 00:01:00 | | a0003 | cust1 | 2022-01-02 00:00:00 | | a0013 | cust2 | 2022-01-01 00:20:00 | `Customers` 表代表顾客信æ¯ï¼`cust_id` 为顾客 idï¼`cust_email` 为顾客 email | cust_id | cust_email | | ------- | --------------- | | cust10 | [email protected] | | cust1 | [email protected] | | cust2 | [email protected] | ãé®é¢ãè¿åè´ä¹° `prod_id` 为 BR01 ç产åçææé¡¾å®¢ççµåé®ä»¶ï¼`Customers` 表ä¸ç `cust_email`ï¼ï¼ç»ææ éæåºã æç¤ºï¼æ¶åå° `SELECT` è¯å¥ï¼æå å±çä» `OrderItems` 表è¿å `order_num`ï¼ä¸é´çä» `Customers` 表è¿å `cust_id`ï¼ä½æ¯å¿ é¡»ä½¿ç¨ INNER JOIN è¯æ³ã ```sql select cust_email from Customers inner join Orders using(cust_id) inner join OrderItems using(order_num) where OrderItems.prod_id = 'BR01'; ``` ### ç¡®å®æä½³é¡¾å®¢çå¦ä¸ç§æ¹å¼ï¼äºï¼ `OrderItems` 表代表订åä¿¡æ¯ï¼ç¡®å®æä½³é¡¾å®¢çå¦ä¸ç§æ¹å¼æ¯çä»ä»¬è±äºå¤å°é±ï¼`OrderItems` 表æè®¢åå· `order_num` å `item_price` ååå®åºä»·æ ¼ã`quantity` ååæ°é | order_num | item_price | quantity | | --------- | ---------- | -------- | | a1 | 10 | 105 | | a2 | 1 | 1100 | | a2 | 1 | 200 | | a4 | 2 | 1121 | | a5 | 5 | 10 | | a2 | 1 | 19 | | a7 | 7 | 5 | `Orders` è¡¨å«æåæ®µ `order_num` 订åå·ã`cust_id` 顾客 id | order_num | cust_id | | --------- | -------- | | a1 | cust10 | | a2 | cust1 | | a3 | cust2 | | a4 | cust22 | | a5 | cust221 | | a7 | cust2217 | 顾客表 `Customers` æå段 `cust_id` å®¢æ· idã`cust_name` 客æ·å§å | cust_id | cust_name | | -------- | --------- | | cust10 | andy | | cust1 | ben | | cust2 | tony | | cust22 | tom | | cust221 | an | | cust2217 | hex | ãé®é¢ãç¼å SQL è¯å¥ï¼è¿åè®¢åæ»ä»·ä¸å°äº 1000 ç客æ·åç§°åæ»é¢ï¼`OrderItems` 表ä¸ç `order_num`ï¼ã æç¤ºï¼éè¦è®¡ç®æ»åï¼`item_price` ä¹ä»¥ `quantity`ï¼ãææ»é¢å¯¹ç»æè¿è¡æåºï¼è¯·ä½¿ç¨ INNER JOIN è¯æ³ã ```sql select cust_name, sum(item_price * quantity) as total_price from Customers inner join Orders using(cust_id) inner join OrderItems using(order_num) group by cust_name having total_price >= 1000 order by total_price; ``` ## å建é«çº§è¿æ¥ ### æ£ç´¢æ¯ä¸ªé¡¾å®¢çåç§°åææç订åå·ï¼ä¸ï¼ `Customers` 表代表顾客信æ¯å«æé¡¾å®¢ id `cust_id` å 顾客åç§° `cust_name` | cust_id | cust_name | | -------- | --------- | | cust10 | andy | | cust1 | ben | | cust2 | tony | | cust22 | tom | | cust221 | an | | cust2217 | hex | `Orders` 表代表订åä¿¡æ¯å«æè®¢åå· `order_num` å顾客 id `cust_id` | order_num | cust_id | | --------- | -------- | | a1 | cust10 | | a2 | cust1 | | a3 | cust2 | | a4 | cust22 | | a5 | cust221 | | a7 | cust2217 | ãé®é¢ãä½¿ç¨ INNER JOIN ç¼å SQL è¯å¥ï¼æ£ç´¢æ¯ä¸ªé¡¾å®¢çåç§°ï¼`Customers` 表ä¸ç `cust_name`ï¼åææç订åå·ï¼`Orders` 表ä¸ç `order_num`ï¼ï¼æåæ ¹æ®é¡¾å®¢å§å `cust_name` ååºè¿åã ```sql select cust_name, order_num from Customers inner join Orders using(cust_id) order by cust_name; ``` ### æ£ç´¢æ¯ä¸ªé¡¾å®¢çåç§°åææç订åå·ï¼äºï¼ `Orders` 表代表订åä¿¡æ¯å«æè®¢åå· `order_num` å顾客 id `cust_id` | order_num | cust_id | | --------- | -------- | | a1 | cust10 | | a2 | cust1 | | a3 | cust2 | | a4 | cust22 | | a5 | cust221 | | a7 | cust2217 | `Customers` 表代表顾客信æ¯å«æé¡¾å®¢ id `cust_id` å 顾客åç§° `cust_name` | cust_id | cust_name | | -------- | --------- | | cust10 | andy | | cust1 | ben | | cust2 | tony | | cust22 | tom | | cust221 | an | | cust2217 | hex | | cust40 | ace | ãé®é¢ãæ£ç´¢æ¯ä¸ªé¡¾å®¢çåç§°ï¼`Customers` 表ä¸ç `cust_name`ï¼åææç订åå·ï¼Orders 表ä¸ç `order_num`ï¼ï¼ååºææç顾客ï¼å³ä½¿ä»ä»¬æ²¡æä¸è¿è®¢åãæåæ ¹æ®é¡¾å®¢å§å `cust_name` ååºè¿åã ```sql select cust_name, order_num from Customers left join Orders using(cust_id) order by cust_name; ``` ### è¿å产ååç§°åä¸ä¹ç¸å ³ç订åå· `Products` 表为产åä¿¡æ¯è¡¨å«æå段 `prod_id` 产å idã`prod_name` 产ååç§° | prod_id | prod_name | | ------- | --------- | | a0001 | egg | | a0002 | sockets | | a0013 | coffee | | a0003 | cola | | a0023 | soda | `OrderItems` 表为订åä¿¡æ¯è¡¨å«æå段 `order_num` 订åå·å产å id `prod_id` | prod_id | order_num | | ------- | --------- | | a0001 | a105 | | a0002 | a1100 | | a0002 | a200 | | a0013 | a1121 | | a0003 | a10 | | a0003 | a19 | | a0003 | a5 | ãé®é¢ã使ç¨å¤è¿æ¥ï¼left joinã right joinãfull joinï¼èç» `Products` 表å `OrderItems` 表ï¼è¿å产ååç§°ï¼`prod_name`ï¼åä¸ä¹ç¸å ³ç订åå·ï¼`order_num`ï¼çå表ï¼å¹¶æç §äº§ååç§°ååºæåºã ```sql select prod_name, order_num from Products left join OrderItems using(prod_id) order by prod_name; ``` ### è¿å产ååç§°åæ¯ä¸é¡¹äº§åçæ»è®¢åæ° `Products` 表为产åä¿¡æ¯è¡¨å«æå段 `prod_id` 产å idã`prod_name` 产ååç§° | prod_id | prod_name | | ------- | --------- | | a0001 | egg | | a0002 | sockets | | a0013 | coffee | | a0003 | cola | | a0023 | soda | `OrderItems` 表为订åä¿¡æ¯è¡¨å«æå段 `order_num` 订åå·å产å id `prod_id` | prod_id | order_num | | ------- | --------- | | a0001 | a105 | | a0002 | a1100 | | a0002 | a200 | | a0013 | a1121 | | a0003 | a10 | | a0003 | a19 | | a0003 | a5 | ãé®é¢ã ä½¿ç¨ OUTER JOIN èç» `Products` 表å `OrderItems` 表ï¼è¿å产ååç§°ï¼`prod_name`ï¼åæ¯ä¸é¡¹äº§åçæ»è®¢åæ°ï¼ä¸æ¯è®¢åå·ï¼ï¼å¹¶æäº§ååç§°ååºæåºã ```sql select prod_name, count(order_num) as orders from Products left join OrderItems using(prod_id) group by prod_name order by prod_name; ``` ### ååºä¾åºååå ¶å¯ä¾äº§åçæ°é æ `Vendors` è¡¨å«æ `vend_id` ï¼ä¾åºå idï¼ | vend_id | | ------- | | a0002 | | a0013 | | a0003 | | a0010 | æ `Products` è¡¨å«æ `vend_id`ï¼ä¾åºå idï¼å prod_idï¼ä¾åºäº§å idï¼ | vend_id | prod_id | | ------- | -------------------- | | a0001 | egg | | a0002 | prod_id_iphone | | a00113 | prod_id_tea | | a0003 | prod_id_vivo phone | | a0010 | prod_id_huawei phone | ãé®é¢ãååºä¾åºåï¼`Vendors` 表ä¸ç `vend_id`ï¼åå ¶å¯ä¾äº§åçæ°éï¼å æ¬æ²¡æäº§åçä¾åºåãä½ éè¦ä½¿ç¨ OUTER JOIN å COUNT()èå彿°æ¥è®¡ç® `Products` è¡¨ä¸æ¯ç§äº§åçæ°éï¼æåæ ¹æ® vend_id ååºæåºã 注æï¼`vend_id` å伿¾ç¤ºå¨å¤ä¸ªè¡¨ä¸ï¼å æ¤å¨æ¯æ¬¡å¼ç¨å®æ¶é½éè¦å®å ¨éå®å®ã ```sql select vend_id, count(prod_id) as prod_id from Vendors left join Products using(vend_id) group by vend_id order by vend_id; ``` ## ç»åæ¥è¯¢ `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` å°æ¥è¯¢ä¹åçåæ¾å¨ä¸èµ·ï¼æ°´å¹³æ¾ç½®ï¼ï¼å³å®ææä¸ä¸ªç¬å¡å°ç§¯ã ### å°ä¸¤ä¸ª SELECT è¯å¥ç»åèµ·æ¥ï¼ä¸ï¼ 表 `OrderItems` å å«è®¢å产åä¿¡æ¯ï¼å段 `prod_id` 代表产å idã`quantity` ä»£è¡¨äº§åæ°é | prod_id | quantity | | ------- | -------- | | a0001 | 105 | | a0002 | 100 | | a0002 | 200 | | a0013 | 1121 | | a0003 | 10 | | a0003 | 19 | | a0003 | 5 | | BNBG | 10002 | ãé®é¢ãå°ä¸¤ä¸ª `SELECT` è¯å¥ç»åèµ·æ¥ï¼ä»¥ä¾¿ä» `OrderItems` è¡¨ä¸æ£ç´¢äº§å idï¼`prod_id`ï¼å `quantity`ãå ¶ä¸ï¼ä¸ä¸ª `SELECT` è¯å¥è¿æ»¤æ°é为 100 çè¡ï¼å¦ä¸ä¸ª `SELECT` è¯å¥è¿æ»¤ id 以 BNBG å¼å¤´ç产åï¼æåæäº§å id å¯¹ç»æè¿è¡ååºæåºã ```sql select prod_id, quantity from OrderItems where quantity = 100 union select prod_id, quantity from OrderItems where prod_id like 'BNBG%'; ``` ### å°ä¸¤ä¸ª SELECT è¯å¥ç»åèµ·æ¥ï¼äºï¼ 表 `OrderItems` å å«è®¢å产åä¿¡æ¯ï¼å段 `prod_id` 代表产å idã`quantity` ä»£è¡¨äº§åæ°éã | prod_id | quantity | | ------- | -------- | | a0001 | 105 | | a0002 | 100 | | a0002 | 200 | | a0013 | 1121 | | a0003 | 10 | | a0003 | 19 | | a0003 | 5 | | BNBG | 10002 | ãé®é¢ãå°ä¸¤ä¸ª `SELECT` è¯å¥ç»åèµ·æ¥ï¼ä»¥ä¾¿ä» `OrderItems` è¡¨ä¸æ£ç´¢äº§å idï¼`prod_id`ï¼å `quantity`ãå ¶ä¸ï¼ä¸ä¸ª `SELECT` è¯å¥è¿æ»¤æ°é为 100 çè¡ï¼å¦ä¸ä¸ª `SELECT` è¯å¥è¿æ»¤ id 以 BNBG å¼å¤´ç产åï¼æåæäº§å id å¯¹ç»æè¿è¡ååºæåºã 注æï¼**è¿æ¬¡ä» 使ç¨å个 SELECT è¯å¥ã** çæ¡ï¼ è¦æ±åªç¨ä¸æ¡ select è¯å¥ï¼é£å°±ç¨ `or` ä¸ç¨ `union` äºã ```sql select prod_id, quantity from OrderItems where quantity = 100 or prod_id like 'BNBG%'; ``` ### ç»å Products 表ä¸ç产ååç§°å Customers 表ä¸ç顾客åç§° `Products` è¡¨å«æåæ®µ `prod_name` 代表产ååç§° | prod_name | | --------- | | flower | | rice | | ring | | umbrella | Customers 表代表顾客信æ¯ï¼cust_name 代表顾客åç§° | cust_name | | --------- | | andy | | ben | | tony | | tom | | an | | lee | | hex | ãé®é¢ãç¼å SQL è¯å¥ï¼ç»å `Products` 表ä¸ç产ååç§°ï¼`prod_name`ï¼å `Customers` 表ä¸ç顾客åç§°ï¼`cust_name`ï¼å¹¶è¿åï¼ç¶åæäº§ååç§°å¯¹ç»æè¿è¡ååºæåºã ```sql # UNION ç»æéä¸çååæ»æ¯çäº UNION ä¸ç¬¬ä¸ä¸ª SELECT è¯å¥ä¸çååã select prod_name from Products union select cust_name from Customers order by prod_name; ``` ### æ£æ¥ SQL è¯å¥ 表 `Customers` 嫿忮µ `cust_name` 顾客åã`cust_contact` 顾客èç³»æ¹å¼ã`cust_state` 顾客å·ã`cust_email` 顾客 `email` | cust_name | cust_contact | cust_state | cust_email | | --------- | ------------ | ---------- | --------------- | | cust10 | 8695192 | MI | [email protected] | | cust1 | 8695193 | MI | [email protected] | | cust2 | 8695194 | IL | [email protected] | ãé®é¢ãä¿®æ£ä¸é¢é误ç SQL ```sql SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state = 'MI' ORDER BY cust_name; UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state = 'IL'ORDER BY cust_name; ``` ä¿®æ£åï¼ ```sql SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state = 'MI' UNION SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state = 'IL' ORDER BY cust_name; ``` ä½¿ç¨ `union` ç»åæ¥è¯¢æ¶ï¼åªè½ä½¿ç¨ä¸æ¡ `order by` åå¥ï¼ä»å¿ é¡»ä½äºæå䏿¡ `select` è¯å¥ä¹å æè ç´æ¥ç¨ `or` æ¥åï¼ ```sql SELECT cust_name, cust_contact, cust_email FROM Customers WHERE cust_state = 'MI' or cust_state = 'IL' ORDER BY cust_name; ```