第四章 檢索數(shù)據(jù)
4.1 SELECT語句
SELECT
語句的用途是從一個或多個表中檢索信息储藐。為了使用SELECT
語句檢索表數(shù)據(jù)余素,至少需要給出兩條信息——想選擇什么以及從什么地方選擇。
4.2 檢索單個列
輸入:
SELECT prod_name FROM products;
輸出:略
分析:從products
表中檢索一個名為prod_name
的列。
注意:
- 以上輸出的數(shù)據(jù)是沒有排序的,其當(dāng)前序列可能使添加到表中的順序,也可能不是克蚂,沒有特殊含義。
- 多條SQL語句必須以分號分割筋讨。MySQL如同多數(shù)DBMS埃叭,不需要在單條SQL語句后加分號,但加上分號也沒有壞處悉罕。
- SQL語句不區(qū)分大小寫赤屋,因此
SELECT
與select
是相同的,甚至Select
也是相同的壁袄。但一般約定對所有SQL關(guān)鍵字使用大寫类早,對列和表名使用小寫,以便于調(diào)試與使用嗜逻。 - 在處理SQL中涩僻,其中所有空格都被忽略,SQL可以在一行上給出栈顷,也可以分為多行逆日。
4.3 檢索多個列
在選擇多個列時,一定要在列名之間加上逗號萄凤,但在最后一個列名上不加屏富。
輸入:
SELECT prod_name, prod_price FROM products;
輸出:略
分析:從products
表中檢索名為prod_name
和prod_price
的列。
4.4 檢索所有列
除了指定所需要的列外(一個或多個)蛙卤,SELECT
語句還可以檢索所有的列而非逐個將其列出。這可以通過在實際列名的位置使用星號*
通配符實現(xiàn)噩死。
輸入:
SELECT * FROM products;
輸出:略
分析:通過通配符(*
)颤难,匹配出所有的列。除非確實需要表中的每個列已维,否則最好別使用通配符(*
)行嗤,檢索 不需要的列通常會降低檢索和使用程序的性能。
4.5 檢索不同的行
SELECT
返回所有匹配的行垛耳,如果想讓相同的行只出現(xiàn)一次栅屏,則需要使用DISTINCT
關(guān)鍵字
輸入:
SELECT DISTINCT vend_id FROM products;
輸出:略
分析:DISTINCT
關(guān)鍵字必須在列名前使用飘千。
4.6 限制結(jié)果
SELECT
返回所有匹配的行,如果要控制返回的行數(shù)與行號,可以使用LIMIT
關(guān)鍵字栈雳。
輸入:
SELECT prod_name FROM products LIMIT 5;
輸出:略
分析:此語句使用SELECT
檢索單個列护奈,LIMIT 5
指示MySQL返回不多于5行(至多0-4行)。
為得出下一個5行哥纫,可指定要檢索的開始行和行數(shù):
輸入:
SELECT prod_name FROM products LIMIT 5,5;
輸出:略
分析:LIMIT 5,5
指示MySQL返回從行5開始的5行霉旗,第一個數(shù)字為開始位置,第二個數(shù)為要檢索的行數(shù)蛀骇。
注意:
- 檢索的第一行為行0厌秒。因此,
LIMIT 1擅憔,1
檢索出來的是第二行鸵闪。 - 在行數(shù)不夠時,MySQL返回其能夠提供的所有行暑诸。
- MySQL 5 支持使用
LIMIT 4 OFFSET 3
等價于LIMIT 3蚌讼,4
表示從行3開始取4行。
4.7 使用完全限定的表名
輸入:
SELECT products.prod_name FROM products;
或
SELECT products.prod_name FROM crashcourse.products;
輸出:略
分析:第一條語句完全限制了列名屠列,第二條語句還嚴格限制了表名啦逆。有一些情形需要完全限定名,現(xiàn)在笛洛,請知曉這個語法夏志。
第五章 排序檢索數(shù)據(jù)
5.1 排序數(shù)據(jù)
如果沒有明確規(guī)定排序順序,則不應(yīng)該假定檢索出的數(shù)據(jù)的順序有意義苛让。SQL語言由子句(clause)構(gòu)成沟蔑,有些子句是必須的,而有些是可選的狱杰,為了明確排序SELECT
的檢索結(jié)果瘦材,可使用ORDER BY
子句。
輸入:
SELECT prod_name FROM products ORDER BY prod_name;
輸出:略
分析:ORDER BY prod_name
指示MySQL對SELECT
語句的檢索結(jié)果以prod_name
列字母順序進行排序仿畸。
注意:使用非檢索的列排序數(shù)據(jù)是完全合法的食棕。
5.2 按多個列排序
按多個列排序時,只需要指定列名错沽,列名間用逗號分隔開即可簿晓。使用前,注意理解其含義千埃,排序結(jié)果首先按照第一列排序憔儿,如果第一列結(jié)果相同,再按照第二列進行排序放可,以此類推谒臼。
輸入:
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
輸出:略
分析:對檢索結(jié)果先按照prod_price
排序朝刊,二者相等時,再按照prod_name
排序蜈缤。
5.3 指定排序方向
數(shù)據(jù)排序默認為升序排序拾氓,但可以使用DESC
關(guān)鍵字指示MySQL對檢索結(jié)果以降序排序。
輸入:
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
輸出:略
分析:對檢索結(jié)果按照prod_price
以降序排序劫樟。
DESC
關(guān)鍵字只應(yīng)用于直接位于其前面的列名痪枫。如果需要對多個列調(diào)整排序方式,則需要分別指定叠艳。
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
輸出:略
分析:對檢索結(jié)果按照prod_price
以降序排序奶陈,prod_price
相同時,按照prod_name
以升序排列附较。
使用ORBER BY和LIMIT的組合吃粒,可以找到一個列中最大或最小值。
輸入:
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
輸出:略
分析:返回prod_price最大值拒课。
注意:
- 與
DESC
相反的關(guān)鍵詞是ASC
徐勃,由于排序默認是升序的,因此ASC
很少使用早像。 - 在字典排序中僻肖,A與a視為相同,這是默認行為卢鹦,如果需要改變這種行為臀脏,
ORBER BY
語句無法實現(xiàn),必須請求數(shù)據(jù)庫管理員更改配置冀自。 -
ORDER BY
子句必須保證位于FROM
子句之后揉稚。
第六章 過濾數(shù)據(jù)
6.1 使用WHERE子句
數(shù)據(jù)庫一般包含大量的數(shù)據(jù),很少需要檢索表中所有行熬粗。通常需要通過WHERE子句給檢索指定搜索條件(過濾條件)搀玖。
輸入:
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;
輸出:略
分析:從products中檢索兩個列,并選取其中prod_price = 2.50 的列返回驻呐。
** 注意:**在同時使用ORDER BY
和WHERE
子句時灌诅,應(yīng)讓ORDER BY
位于WHERE
之后。
6.2 WHERE子句操作符
MySQL允許的搜索條件不僅僅是相等測試含末,MySQL支持的所有操作符如下延塑。
6.2.1 檢索單個值
單引號用來限定字符串。如果將值與串類型的列進行比較答渔,則需要限定引號。用來與數(shù)值列進行比較時侥涵,則不需要使用引號沼撕。
輸入:
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
輸出:略
分析:MySQL在匹配時不分大小寫宋雏,fuses
與Fuses
一行相匹配。
類似的务豺,我們可以分別修改WHERE
子句為WHERE prod_price < 10
或 WHERE prod_price <= 10
來指示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 范圍值檢查
為了檢查某個范圍的值笼沥,可以使用BETWEEN操作符蚪燕。其語法與其他WHERE子句稍有不同,需要提供兩個參數(shù)作為范圍最低值和最高值奔浅。
輸入:
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
輸出:略
分析:BETWEEN
的兩個參數(shù)由AND
間隔開馆纳,5和10分別是開始值和結(jié)束值。
6.2.4 空值檢查
在創(chuàng)建表時汹桦,表設(shè)計人員可以指定其中的列是否可以不包含值鲁驶,一個列不包含值時,稱其值為空值NULL(與包含0舞骆、空字符串或僅包含空格不同)钥弯。用來檢測NULL值的是IS NULL子句。
輸入:
SELECT prod_name FROM products WHERE prod_price IS NULL;
輸出:略
分析:返回沒有價格的所有產(chǎn)品督禽。
注意:在匹配過濾和不匹配過濾時脆霎,并不返回NULL值的列。這是由于未知具有特殊含義狈惫,數(shù)據(jù)庫無法進行匹配睛蛛。