电竞比分网-中国电竞赛事及体育赛事平台

分享

【Mysql】教程全解(一) select與select distinct

 L羅樂 2018-05-06

MySQL示例數(shù)據(jù)庫

在本MySQL教程中,大部分操作是基于yiibaidb這個數(shù)據(jù)庫作為學(xué)習(xí)MySQL示例數(shù)據(jù)庫,這樣的話有助于您快速有效地使用MySQL。yiibaidb數(shù)據(jù)庫是一個典型汽車零售商數(shù)據(jù)庫模型。它包含典型的業(yè)務(wù)數(shù)據(jù),如客戶,產(chǎn)品,銷售訂單,銷售訂單等。

第一步: 從MySQL示例數(shù)據(jù)庫文章中下載示例數(shù)據(jù)庫(yiibaidb),有關(guān)示例數(shù)據(jù)庫的結(jié)構(gòu),示例數(shù)據(jù)庫下載地址: http://www./downloads/yiibaidb.zip

第二步: 將下載的文件解壓縮到臨時文件夾中。為了簡單起見,我們將把它解壓縮到D:\worksp,如下所示 

MySQL示例數(shù)據(jù)庫模式由以下表組成:

  • customers: 存儲客戶的數(shù)據(jù)。

  • products: 存儲汽車的數(shù)據(jù)。

  • productLines: 存儲產(chǎn)品類別數(shù)據(jù)。

  • orders: 存儲客戶訂購的銷售訂單。

  • orderDetails: 存儲每個銷售訂單的訂單產(chǎn)品數(shù)據(jù)項。

  • payments: 存儲客戶訂單的付款數(shù)據(jù)信息。

  • employees: 存儲所有員工信息以及組織結(jié)構(gòu),例如,直接上級(誰向誰報告工作)。

  • offices: 存儲銷售處數(shù)據(jù),類似于各個分公司。

表與表之間的關(guān)系,請參考以下ER圖 :

第三步: 創(chuàng)建數(shù)據(jù)庫并導(dǎo)入數(shù)據(jù)

創(chuàng)建數(shù)據(jù)庫 :

mysql> CREATE DATABASE IF NOT EXISTS yiibaidb DEFAULT CHARSET utf8 COLLATE utf8_general_ci; mysql> use yiibaidb;

導(dǎo)入數(shù)據(jù):

mysql> use yiibaidb; mysql> source D:/worksp/yiibaidb.sql;

第四步: 測試導(dǎo)入結(jié)果

mysql> select city,phone,country from `offices`; --------------- ------------------ ----------- | city          | phone            | country   | --------------- ------------------ ----------- | San Francisco | 1 650 219 4782  | USA       | | Boston        | 1 215 837 0825  | USA       | | NYC           | 1 212 555 3000  | USA       | | Paris         | 33 14 723 4404  | France    | | Beijing       | 86 33 224 5000  | China     | | Sydney        | 61 2 9264 2451  | Australia | | London        | 44 20 7877 2041 | UK        | --------------- ------------------ ----------- 7 rows in set (0.00 sec)



01

查詢語句

1.1 SELECT

顯示如何使用簡單的SELECT語句來查詢單個表中的數(shù)據(jù)。

使用SELECT語句從表或視圖獲取數(shù)據(jù)。表由行和列組成,如電子表格。 通常,我們只希望看到子集行,列的子集或兩者的組合。SELECT語句的結(jié)果稱為結(jié)果集,它是行列表,每行由相同數(shù)量的列組成。

請參閱示例數(shù)據(jù)庫(yiibaidb)中的以下employees表的結(jié)構(gòu)。它有8列:員工人數(shù),姓氏,名字,分機(jī),電子郵件,辦公室代碼,報告,職位等。

SELECT語句控制要查看哪些列和行。例如,如果只對所有員工的名字,姓氏和職位感興趣,或者您只想查看其職位是銷售代表的每位員工的信息,則SELECT語句可幫助您執(zhí)行這些操作。

我們來看一下SELECT語句的語法:

SELECT    column_1, column_2, ..
.FROM    table_1
[INNER | LEFT |RIGHT] JOIN table_2 ON conditions
WHERE  conditions
GROUP BY column_1
HAVING group_conditions
ORDER BY column_1
LIMIT offset, length;

SQL

SELECT語句由以下列表中所述的幾個子句組成:

  • SELECT之后是逗號分隔列或星號(*)的列表,表示要返回所有列。

  • FROM指定要查詢數(shù)據(jù)的表或視圖。

  • JOIN根據(jù)某些連接條件從其他表中獲取數(shù)據(jù)。

  • WHERE過濾結(jié)果集中的行。

  • GROUP BY將一組行組合成小分組,并對每個小分組應(yīng)用聚合函數(shù)。

  • HAVING過濾器基于GROUP BY子句定義的小分組。

  • ORDER BY指定用于排序的列的列表。

  • LIMIT限制返回行的數(shù)量。

語句中的SELECTFROM語句是必須的,其他部分是可選的。

在隨后的教程中將更詳細(xì)地了解每個子句。在本教程中,我們將重點(diǎn)介紹SELECT語句的簡單形式用法。

MySQL SELECT語句示例

SELECT語句允許通過在SELECT子句中指定逗號分隔列的列表來查詢表的部分?jǐn)?shù)據(jù)。 例如,如果要僅查看員工的名字,姓氏和職位,請使用以下查詢:

SELECT    lastname, firstname, jobtitle
FROM    employees;

即使員工表中有很多列,SELECT語句只返回表中所有行的三列數(shù)據(jù),如下圖所示:

mysql> SELECT lastname, firstname, jobtitle FROM employees; ----------- ----------- ---------------------- | lastname  | firstname | jobtitle             | ----------- ----------- ---------------------- | Murphy    | Diane     | President            | | Patterson | Mary      | VP Sales             | | Firrelli  | Jeff      | VP Marketing         | | Patterson | William   | Sales Manager (APAC) | | Bondur    | Gerard    | Sale Manager (EMEA)  | | Bow       | Anthony   | Sales Manager (NA)   | | Jennings  | Leslie    | Sales Rep            | | Thompson  | Leslie    | Sales Rep            | | Firrelli  | Julie     | Sales Rep            | | Patterson | Steve     | Sales Rep            | | Tseng     | Foon Yue  | Sales Rep            | | Vanauf    | George    | Sales Rep            | | Bondur    | Loui      | Sales Rep            | | Hernandez | Gerard    | Sales Rep            | | Castillo  | Pamela    | Sales Rep            | | Bott      | Larry     | Sales Rep            | | Jones     | Barry     | Sales Rep            | | Fixter    | Andy      | Sales Rep            | | Marsh     | Peter     | Sales Rep            | | King      | Tom       | Sales Rep            | | Nishi     | Mami      | Sales Rep            | | Kato      | Yoshimi   | Sales Rep            | | Gerard    | Martin    | Sales Rep            | ----------- ----------- ---------------------- 23 rows in set

注意比較以下兩個語句返回列有什么區(qū)別 -

語句-1

SELECT lastname, firstname, jobtitle FROM employees;

語句-2

SELECT * FROM employees;

SQL

如果要獲取employees表中所有列的數(shù)據(jù),可以列出SELECT子句中的所有列名,或者只需使用星號(*)表示您想要從表的所有列獲取數(shù)據(jù),如下查詢:

mysql> SELECT * FROM employees; ---------------- ----------- ----------- ----------- ----------------------- ------------ ----------- ---------------------- | employeeNumber | lastName  | firstName | extension | email                 | officeCode | reportsTo | jobTitle             | ---------------- ----------- ----------- ----------- ----------------------- ------------ ----------- ---------------------- |           1002 | Murphy    | Diane     | x5800     | dmurphy@    | 1          | NULL      | President            | |           1056 | Patterson | Mary      | x4611     | mpatterso@  | 1          |      1002 | VP Sales             | |           1076 | Firrelli  | Jeff      | x9273     | jfirrelli@  | 1          |      1002 | VP Marketing         | |           1088 | Patterson | William   | x4871     | wpatterson@ | 6          |      1056 | Sales Manager (APAC) | |           1102 | Bondur    | Gerard    | x5408     | gbondur@gmail.com     | 4          |      1056 | Sale Manager (EMEA)  | |           1143 | Bow       | Anthony   | x5428     | abow@gmail.com        | 1          |      1056 | Sales Manager (NA)   | |           1165 | Jennings  | Leslie    | x3291     | ljennings@  | 1          |      1143 | Sales Rep            | |           1166 | Thompson  | Leslie    | x4065     | lthompson@  | 1          |      1143 | Sales Rep            | |           1188 | Firrelli  | Julie     | x2173     | jfirrelli@  | 2          |      1143 | Sales Rep            | |           1216 | Patterson | Steve     | x4334     | spatterson@ | 2          |      1143 | Sales Rep            | |           1286 | Tseng     | Foon Yue  | x2248     | ftseng@     | 3          |      1143 | Sales Rep            | |           1323 | Vanauf    | George    | x4102     | gvanauf@    | 3          |      1143 | Sales Rep            | |           1337 | Bondur    | Loui      | x6493     | lbondur@    | 4          |      1102 | Sales Rep            | |           1370 | Hernandez | Gerard    | x2028     | ghernande@gmail.com   | 4          |      1102 | Sales Rep            | |           1401 | Castillo  | Pamela    | x2759     | pcastillo@gmail.com   | 4          |      1102 | Sales Rep            | |           1501 | Bott      | Larry     | x2311     | lbott@      | 7          |      1102 | Sales Rep            | |           1504 | Jones     | Barry     | x102      | bjones@gmail.com      | 7          |      1102 | Sales Rep            | |           1611 | Fixter    | Andy      | x101      | afixter@    | 6          |      1088 | Sales Rep            | |           1612 | Marsh     | Peter     | x102      | pmarsh@     | 6          |      1088 | Sales Rep            | |           1619 | King      | Tom       | x103      | tking@gmail.com       | 6          |      1088 | Sales Rep            | |           1621 | Nishi     | Mami      | x101      | mnishi@gmail.com      | 5          |      1056 | Sales Rep            | |           1625 | Kato      | Yoshimi   | x102      | ykato@gmail.com       | 5          |      1621 | Sales Rep            | |           1702 | Gerard    | Martin    | x2312     | mgerard@gmail.com     | 4          |      1102 | Sales Rep            | ---------------- ----------- ----------- ----------- ----------------------- ------------ ----------- ---------------------- 23 rows in set

它返回employees表中的所有列和行。應(yīng)該使用星號(*)進(jìn)行測試。建議顯式獲取數(shù)據(jù)的列,原因如下:

  • 使用星號(*)可能會返回不使用的列的數(shù)據(jù)。 它在MySQL數(shù)據(jù)庫服務(wù)器和應(yīng)用程序之間產(chǎn)生不必要的I/O磁盤和網(wǎng)絡(luò)流量。

  • 如果明確指定列,則結(jié)果集更可預(yù)測并且更易于管理。 想象一下,當(dāng)您使用星號(*)并且有人通過添加更多列來更改表格數(shù)據(jù)時,將會得到一個與預(yù)期不同的結(jié)果集。

  • 使用星號(*)可能會將敏感信息暴露給未經(jīng)授權(quán)的用戶。


1.2  SELECT  DISTINCT 


從表中查詢數(shù)據(jù)時,可能會收到重復(fù)的行記錄。為了刪除這些重復(fù)行,可以在SELECT語句中使用DISTINCT子句。

DISTINCT子句的語法如下:

SELECT DISTINCT    columns
FROM
   table_name
WHERE    where_conditions;

SQL

2. MySQL DISTINCT示例

下面來看看一個使用DISTINCT子句從employees表中選擇員工的唯一姓氏(lastName)的簡單示例。

首先,使用SELECT語句從employees表中查詢員工的姓氏(lastName),如下所示:

SELECT    lastname
FROM    employees
ORDER BY lastname;

SQL

執(zhí)行上面查詢語句,得到以下結(jié)果 -

mysql> SELECT lastname FROM employees ORDER BY lastname; ----------- | lastname  | ----------- | Bondur    | | Bondur    | | Bott      | | Bow       | | Castillo  | | Firrelli  | | Firrelli  | | Fixter    | | Gerard    | | Hernandez | | Jennings  | | Jones     | | Kato      | | King      | | Marsh     | | Murphy    | | Nishi     | | Patterson | | Patterson | | Patterson | | Thompson  | | Tseng     | | Vanauf    | ----------- 23 rows in set

Shell

可看到上面結(jié)果中,有好些結(jié)果是重復(fù)的,比如:Bondur,Firrelli等,那如何做到相同的結(jié)果只顯示一個呢?要刪除重復(fù)的姓氏,請將DISTINCT子句添加到SELECT語句中,如下所示:

SELECT DISTINCT    lastnameFROM    employeesORDER BY lastname;

SQL

執(zhí)行上面查詢,得到以下輸出結(jié)果 -

mysql> SELECT DISTINCT lastname FROM employees ORDER BY lastname; ----------- | lastname  | ----------- | Bondur    | | Bott      | | Bow       | | Castillo  | | Firrelli  | | Fixter    | | Gerard    | | Hernandez | | Jennings  | | Jones     | | Kato      | | King      | | Marsh     | | Murphy    | | Nishi     | | Patterson | | Thompson  | | Tseng     | | Vanauf    | ----------- 19 rows in set

Shell

當(dāng)使用DISTINCT子句時,重復(fù)的姓氏(lastname)在結(jié)果集中被消除。

3. MySQL DISTINCT和NULL值

如果列具有NULL值,并且對該列使用DISTINCT子句,MySQL將保留一個NULL值,并刪除其它的NULL值,因為DISTINCT子句將所有NULL值視為相同的值。

例如,在customers表中,有很多行的州(state)列是NULL值。 當(dāng)使用DISTINCT子句來查詢客戶所在的州時,我們將看到唯一的州和NULL值,如下查詢所示:

SELECT DISTINCT    state
FROM    customers;

SQL

執(zhí)行上面查詢語句后,輸出結(jié)果如下 -

mysql> SELECT DISTINCT state FROM customers; --------------- | state         | --------------- | NULL          | | NV            | | Victoria      | | CA            | | NY            | | PA            | | CT            | | MA            | | Osaka         | | BC            | | Qubec         | | Isle of Wight | | NSW           | | NJ            | | Queensland    | | Co. Cork      | | Pretoria      | | NH            | | Tokyo         | --------------- 19 rows in set

Shell

4. MySQL DISTINCT在多列上的使用

可以使用具有多個列的DISTINCT子句。 在這種情況下,MySQL使用所有列的組合來確定結(jié)果集中行的唯一性。

例如,要從customers表中獲取城市(city)和州(state)的唯一組合,可以使用以下查詢:

SELECT DISTINCT    state, city
FROM    customers
WHERE    state IS NOT NULL
ORDER BY state , city;

SQL

執(zhí)行上面查詢,得到以下結(jié)果 -

mysql> SELECT DISTINCT state, city FROM  customers WHERE state IS NOT NULL ORDER BY state ,city; --------------- ---------------- | state         | city           | --------------- ---------------- | BC            | Tsawassen      | | BC            | Vancouver      | | CA            | Brisbane       | | CA            | Burbank        | | CA            | Burlingame     | | CA            | Glendale       | | CA            | Los Angeles    | | CA            | Pasadena       | | CA            | San Diego      | | CA            | San Francisco  | | CA            | San Jose       | | CA            | San Rafael     | | Co. Cork      | Cork           | | CT            | Bridgewater    | | CT            | Glendale       | | CT            | New Haven      | | Isle of Wight | Cowes          | | MA            | Boston         | | MA            | Brickhaven     | | MA            | Cambridge      | | MA            | New Bedford    | | NH            | Nashua         | | NJ            | Newark         | | NSW           | Chatswood      | | NSW           | North Sydney   | | NV            | Las Vegas      | | NY            | NYC            | | NY            | White Plains   | | Osaka         | Kita-ku        | | PA            | Allentown      | | PA            | Philadelphia   | | Pretoria      | Hatfield       | | Qubec         | Montral        | | Queensland    | South Brisbane | | Tokyo         | Minato-ku      | | Victoria      | Glen Waverly   | | Victoria      | Melbourne      | --------------- ---------------- 37 rows in set

沒有DISTINCT子句,將查詢獲得州(state)和城市(city)的重復(fù)組合如下:

SELECT    state, city
FROM    customers
WHERE    state IS NOT NULL

ORDER BY state , city;

SQL

執(zhí)行上面查詢,得到以下結(jié)果 -

5. DISTINCT子句與GROUP BY子句比較

如果在SELECT語句中使用GROUP BY子句,而不使用聚合函數(shù),則GROUP BY子句的行為與DISTINCT子句類似。

以下語句使用GROUP BY子句來選擇customers表中客戶的唯一state列的值。

SELECT    state
FROM    customers
GROUP BY state;

SQL

執(zhí)行上面查詢,得到以下結(jié)果 -

mysql> SELECT  state FROM customers GROUP BY state; --------------- | state         | --------------- | NULL          | | BC            | | CA            | | Co. Cork      | | CT            | | Isle of Wight | | MA            | | NH            | | NJ            | | NSW           | | NV            | | NY            | | Osaka         | | PA            | | Pretoria      | | Qubec         | | Queensland    | | Tokyo         | | Victoria      | --------------- 19 rows in set


可以通過使用DISTINCT子句來實(shí)現(xiàn)類似的結(jié)果:

mysql> SELECT DISTINCT state FROM customers; --------------- | state         | --------------- | NULL          || NV            || Victoria      || CA            || NY            || PA            || CT            || MA            || Osaka         || BC            || Qubec         || Isle of Wight || NSW           || NJ            || Queensland    || Co. Cork      || Pretoria      || NH            || Tokyo         | --------------- 19 rows in set

SQL

一般而言,DISTINCT子句是GROUP BY子句的特殊情況。 DISTINCT子句和GROUP BY子句之間的區(qū)別是GROUP BY子句可對結(jié)果集進(jìn)行排序,而DISTINCT子句不進(jìn)行排序。

如果將ORDER BY子句添加到使用DISTINCT子句的語句中,則結(jié)果集將被排序,并且與使用GROUP BY子句的語句返回的結(jié)果集相同。

SELECT DISTINCT    state
FROM    customers
ORDER BY state;

SQL

執(zhí)行上面查詢,得到以下結(jié)果 -

mysql> SELECT DISTINCT state FROM customers ORDER BY state; --------------- | state         | --------------- | NULL          | | BC            | | CA            | | Co. Cork      | | CT            | | Isle of Wight | | MA            | | NH            | | NJ            | | NSW           | | NV            | | NY            | | Osaka         | | PA            | | Pretoria      | | Qubec         | | Queensland    | | Tokyo         | | Victoria      | --------------- 19 rows in set

Shell

6. MySQL DISTINCT和聚合函數(shù)

可以使用具有聚合函數(shù)(例如SUM,AVG和COUNT)的DISTINCT子句中,在MySQL將聚合函數(shù)應(yīng)用于結(jié)果集之前刪除重復(fù)的行。

例如,要計算美國客戶的唯一state列的值,可以使用以下查詢:

SELECT    COUNT(DISTINCT state)
FROM    customers
WHERE    country = 'USA';

SQL

執(zhí)行上面查詢,得到以下結(jié)果 -

mysql> SELECT  COUNT(DISTINCT state) FROM customers WHERE country = 'USA'; ----------------------- | COUNT(DISTINCT state) | ----------------------- |                     8 | ----------------------- 1 row in set

Shell

7. MySQL DISTINCT與LIMIT子句

如果要將DISTINCT子句與LIMIT子句一起使用,MySQL會在查找LIMIT子句中指定的唯一行數(shù)時立即停止搜索。

以下查詢customers表中的前3個非空(NOT NULL)唯一state列的值。

mysql> SELECT DISTINCT state FROM customers WHERE state IS NOT NULL LIMIT 3; ---------- | state    | ---------- | NV       | | Victoria | | CA       | ---------- 3 rows in set

Shell

在本教程中,我們學(xué)習(xí)了使用MySQL DISTINCT子句的各種方法,例如消除重復(fù)行和計數(shù)非NULL值。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多