第四章 檢索數(shù)據(jù)
4.1 SELECT語(yǔ)句
SELECT
語(yǔ)句的用途是從一個(gè)或多個(gè)表中檢索信息。為了使用SELECT
語(yǔ)句檢索表數(shù)據(jù),至少需要給出兩條信息——想選擇什么以及從什么地方選擇。
4.2 檢索單個(gè)列
輸入:
SELECT prod_name FROM products;
輸出:略
分析:從products
表中檢索一個(gè)名為prod_name
的列。
注意:
- 以上輸出的數(shù)據(jù)是沒(méi)有排序的,其當(dāng)前序列可能使添加到表中的順序,也可能不是,沒(méi)有特殊含義。
- 多條SQL語(yǔ)句必須以分號(hào)分割。MySQL如同多數(shù)DBMS,不需要在單條SQL語(yǔ)句后加分號(hào),但加上分號(hào)也沒(méi)有壞處。
- SQL語(yǔ)句不區(qū)分大小寫(xiě),因此
SELECT
與select
是相同的,甚至Select
也是相同的。但一般約定對(duì)所有SQL關(guān)鍵字使用大寫(xiě),對(duì)列和表名使用小寫(xiě),以便于調(diào)試與使用。 - 在處理SQL中,其中所有空格都被忽略,SQL可以在一行上給出,也可以分為多行。
4.3 檢索多個(gè)列
在選擇多個(gè)列時(shí),一定要在列名之間加上逗號(hào),但在最后一個(gè)列名上不加。
輸入:
SELECT prod_name, prod_price FROM products;
輸出:略
分析:從products
表中檢索名為prod_name
和prod_price
的列。
4.4 檢索所有列
除了指定所需要的列外(一個(gè)或多個(gè)),SELECT
語(yǔ)句還可以檢索所有的列而非逐個(gè)將其列出。這可以通過(guò)在實(shí)際列名的位置使用星號(hào)*
通配符實(shí)現(xiàn)。
輸入:
SELECT * FROM products;
輸出:略
分析:通過(guò)通配符(*
),匹配出所有的列。除非確實(shí)需要表中的每個(gè)列,否則最好別使用通配符(*
),檢索 不需要的列通常會(huì)降低檢索和使用程序的性能。
4.5 檢索不同的行
SELECT
返回所有匹配的行,如果想讓相同的行只出現(xiàn)一次,則需要使用DISTINCT
關(guān)鍵字
輸入:
SELECT DISTINCT vend_id FROM products;
輸出:略
分析:DISTINCT
關(guān)鍵字必須在列名前使用。
4.6 限制結(jié)果
SELECT
返回所有匹配的行,如果要控制返回的行數(shù)與行號(hào),可以使用LIMIT
關(guān)鍵字。
輸入:
SELECT prod_name FROM products LIMIT 5;
輸出:略
分析:此語(yǔ)句使用SELECT
檢索單個(gè)列,LIMIT 5
指示MySQL返回不多于5行(至多0-4行)。
為得出下一個(gè)5行,可指定要檢索的開(kāi)始行和行數(shù):
輸入:
SELECT prod_name FROM products LIMIT 5,5;
輸出:略
分析:LIMIT 5,5
指示MySQL返回從行5開(kāi)始的5行,第一個(gè)數(shù)字為開(kāi)始位置,第二個(gè)數(shù)為要檢索的行數(shù)。
注意:
- 檢索的第一行為行0。因此,
LIMIT 1,1
檢索出來(lái)的是第二行。 - 在行數(shù)不夠時(shí),MySQL返回其能夠提供的所有行。
- MySQL 5 支持使用
LIMIT 4 OFFSET 3
等價(jià)于LIMIT 3,4
表示從行3開(kāi)始取4行。
4.7 使用完全限定的表名
輸入:
SELECT products.prod_name FROM products;
或
SELECT products.prod_name FROM crashcourse.products;
輸出:略
分析:第一條語(yǔ)句完全限制了列名,第二條語(yǔ)句還嚴(yán)格限制了表名。有一些情形需要完全限定名,現(xiàn)在,請(qǐng)知曉這個(gè)語(yǔ)法。
第五章 排序檢索數(shù)據(jù)
5.1 排序數(shù)據(jù)
如果沒(méi)有明確規(guī)定排序順序,則不應(yīng)該假定檢索出的數(shù)據(jù)的順序有意義。SQL語(yǔ)言由子句(clause)構(gòu)成,有些子句是必須的,而有些是可選的,為了明確排序SELECT
的檢索結(jié)果,可使用ORDER BY
子句。
輸入:
SELECT prod_name FROM products ORDER BY prod_name;
輸出:略
分析:ORDER BY prod_name
指示MySQL對(duì)SELECT
語(yǔ)句的檢索結(jié)果以prod_name
列字母順序進(jìn)行排序。
注意:使用非檢索的列排序數(shù)據(jù)是完全合法的。
5.2 按多個(gè)列排序
按多個(gè)列排序時(shí),只需要指定列名,列名間用逗號(hào)分隔開(kāi)即可。使用前,注意理解其含義,排序結(jié)果首先按照第一列排序,如果第一列結(jié)果相同,再按照第二列進(jìn)行排序,以此類推。
輸入:
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
輸出:略
分析:對(duì)檢索結(jié)果先按照prod_price
排序,二者相等時(shí),再按照prod_name
排序。
5.3 指定排序方向
數(shù)據(jù)排序默認(rèn)為升序排序,但可以使用DESC
關(guān)鍵字指示MySQL對(duì)檢索結(jié)果以降序排序。
輸入:
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
輸出:略
分析:對(duì)檢索結(jié)果按照prod_price
以降序排序。
DESC
關(guān)鍵字只應(yīng)用于直接位于其前面的列名。如果需要對(duì)多個(gè)列調(diào)整排序方式,則需要分別指定。
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
輸出:略
分析:對(duì)檢索結(jié)果按照prod_price
以降序排序,prod_price
相同時(shí),按照prod_name
以升序排列。
使用ORBER BY和LIMIT的組合,可以找到一個(gè)列中最大或最小值。
輸入:
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
輸出:略
分析:返回prod_price最大值。
注意:
- 與
DESC
相反的關(guān)鍵詞是ASC
,由于排序默認(rèn)是升序的,因此ASC
很少使用。 - 在字典排序中,A與a視為相同,這是默認(rèn)行為,如果需要改變這種行為,
ORBER BY
語(yǔ)句無(wú)法實(shí)現(xiàn),必須請(qǐng)求數(shù)據(jù)庫(kù)管理員更改配置。 -
ORDER BY
子句必須保證位于FROM
子句之后。
第六章 過(guò)濾數(shù)據(jù)
6.1 使用WHERE子句
數(shù)據(jù)庫(kù)一般包含大量的數(shù)據(jù),很少需要檢索表中所有行。通常需要通過(guò)WHERE子句給檢索指定搜索條件(過(guò)濾條件)。
輸入:
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;
輸出:略
分析:從products中檢索兩個(gè)列,并選取其中prod_price = 2.50 的列返回。
** 注意:**在同時(shí)使用ORDER BY
和WHERE
子句時(shí),應(yīng)讓ORDER BY
位于WHERE
之后。
6.2 WHERE子句操作符
MySQL允許的搜索條件不僅僅是相等測(cè)試,MySQL支持的所有操作符如下。
6.2.1 檢索單個(gè)值
單引號(hào)用來(lái)限定字符串。如果將值與串類型的列進(jìn)行比較,則需要限定引號(hào)。用來(lái)與數(shù)值列進(jìn)行比較時(shí),則不需要使用引號(hào)。
輸入:
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
輸出:略
分析:MySQL在匹配時(shí)不分大小寫(xiě),fuses
與Fuses
一行相匹配。
類似的,我們可以分別修改WHERE
子句為WHERE prod_price < 10
或 WHERE prod_price <= 10
來(lái)指示MySQL檢索prod_price
小于10,或小于等于10的行。
6.2.2 不匹配檢查
輸入:
SELECT vend_id, prod_name FROM products WHERE vend_id <> 1003:
輸出:略
分析:列出的是不由供應(yīng)商1003制造的所有產(chǎn)品
6.2.3 范圍值檢查
為了檢查某個(gè)范圍的值,可以使用BETWEEN操作符。其語(yǔ)法與其他WHERE子句稍有不同,需要提供兩個(gè)參數(shù)作為范圍最低值和最高值。
輸入:
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
輸出:略
分析:BETWEEN
的兩個(gè)參數(shù)由AND
間隔開(kāi),5和10分別是開(kāi)始值和結(jié)束值。
6.2.4 空值檢查
在創(chuàng)建表時(shí),表設(shè)計(jì)人員可以指定其中的列是否可以不包含值,一個(gè)列不包含值時(shí),稱其值為空值NULL(與包含0、空字符串或僅包含空格不同)。用來(lái)檢測(cè)NULL值的是IS NULL子句。
輸入:
SELECT prod_name FROM products WHERE prod_price IS NULL;
輸出:略
分析:返回沒(méi)有價(jià)格的所有產(chǎn)品。
注意:在匹配過(guò)濾和不匹配過(guò)濾時(shí),并不返回NULL值的列。這是由于未知具有特殊含義,數(shù)據(jù)庫(kù)無(wú)法進(jìn)行匹配。