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