檢索數(shù)據(jù)
檢索單個(gè)列
# 從products表中檢索一個(gè)名為prod_name的列
select prod_name from products;
檢索多個(gè)列
SELECT prod_id, prod_name FROM products;
檢索所有列
SELECT * FROM products;
使用DISTINCT關(guān)鍵字
# 只返回不同的值
SELECT DISTINCT vend_id FROM products;
限制查詢喘沿,LIMIT關(guān)鍵字
可用來實(shí)現(xiàn)分頁查詢。
# 返回?cái)?shù)據(jù)不多于5行
SELECT prod_name FROM products LIMIT 5;
# 返回從行5開始的5行竭贩,第一個(gè)數(shù)字為開始位置蚜印,第二個(gè)位置為要檢索的行數(shù)
SELECT prod_name FROM products LIMIT 5, 5;
- 檢索的第一行為行0,所以LIMIT 1, 1將檢索出第二行
- 當(dāng)指定要檢索的行數(shù)不夠時(shí)留量,MySQL返回它能返回的那么多行
- MySQL5支持LIMIT的另一種語法窄赋,LIMIT 4 OFFSET 3意為從行3開始讀取4行,和LIMIT 3, 4一樣
使用完全限定的表名
SELECT products.prod_name FROM crashcourse.products;
排序檢索數(shù)據(jù)
子句(clause)SQL語句由子句構(gòu)成楼熄,有些子句是必須的忆绰,有些是可選的,一個(gè)子句通常由一個(gè)關(guān)鍵字和所提供的數(shù)據(jù)組成可岂。
為了明確地排序用SELECT語句檢索出的數(shù)據(jù)错敢,可使用ORDER BY子句。
排序數(shù)據(jù)
# 對(duì)prod_name列以字母順序排序數(shù)據(jù)
SELECT prod_name FROM products ORDER BY prod_name;
按多個(gè)列排序
# 先按價(jià)格排序缕粹,再按名字排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
指定排序方向稚茅,DESC
ORDER BY默認(rèn)的排序是升序,還可以指定降序排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
# 先對(duì)價(jià)格降序排序平斩,然后對(duì)名字升序排序
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
** 如果想在多個(gè)列上進(jìn)行降序排序挥吵,必須對(duì)每個(gè)列指定DESC關(guān)鍵字德撬。 **
與DESC相反的是ASC(Ascending)婚陪,也就是升序贰军,但是一般用不上爽冕,因?yàn)槟J(rèn)就是升序的。
使用ORDER BY和LIMIT找出一個(gè)列中最高或最低的值
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
** ORDER BY子句須在FROM子句之前总棵,LIMIT子句之后 **
過濾數(shù)據(jù)
使用 WHERE 子句
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;
WHERE子句與 ORDER BY子句共用時(shí)廷臼,ORDER BY 在 WHERE 之后,意對(duì)過濾后的數(shù)據(jù)進(jìn)行排序塘辅。
上面 WHERE 子句使用的是相等的條件操作符晃虫,WHERE 子句還支持下面的條件操作符:
操作符 | 說明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= |
大于等于 |
BETWEEN | 在指定的兩個(gè)值之間 |
SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
+-----------+------------+
| prod_name | prod_price |
+-----------+------------+
| Fuses | 3.42 |
+-----------+------------+
1 row in set (0.00 sec)
由上面查詢可以知道,MySQL 在執(zhí)行匹配時(shí)默認(rèn)不區(qū)分大小寫扣墩,所以 fuses 和 Fuses 匹配哲银。
SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值檢查
在創(chuàng)建表時(shí),表設(shè)計(jì)人員可以指定其中的列是否可以不包含值呻惕,一個(gè)列不包含值時(shí)荆责,稱其為包含空值 NULL。
mysql> SELECT cust_id, cust_email FROM customers WHERE cust_email IS NULL;
+---------+------------+
| cust_id | cust_email |
+---------+------------+
| 10002 | NULL |
| 10005 | NULL |
+---------+------------+
2 rows in set (0.00 sec)
組合 WHERE 子句
AND 操作符
SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
當(dāng)然亚脆,后面還可以繼續(xù)添加 AND 操作符以組合多個(gè)條件
OR 操作符
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;
AND OR 操作符的計(jì)算次序
假如我們的需求是:列出價(jià)格為1-美元(含)以上且由1002或1003制造的所有產(chǎn)品
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
上面的 SQL 語句并不能達(dá)到需求做院,因?yàn)樵?SQL 中,會(huì)優(yōu)先處理 AND 操作符濒持,這和大部分的語言是一樣的键耕,所以上面的 SQL 語句的含義為:由供應(yīng)商1003制造的任何價(jià)格為10美元(含)以上的產(chǎn)品,或者由制造商1002制造的任何產(chǎn)品柑营,而不管其價(jià)格如何屈雄。
正確的 SQL 如下,添加括號(hào)控制優(yōu)先級(jí)即可:
SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
在組合使用 AND 和 OR 操作符時(shí)官套,最好能使用括號(hào)酒奶,消除歧義,哪怕計(jì)算次序符合我們要求奶赔。
IN 操作符
SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
它雖然等同于使用 OR 子句:
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 ORDER BY prod_name;
但是使用 IN 子句惋嚎,SQL 更簡(jiǎn)潔,而且 IN 可以使用復(fù)合的查詢語句纺阔,后續(xù)會(huì)提到瘸彤。
NOT 操作符
SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;
MySQL 支持使用 NOT 對(duì) IN,BETWEEN笛钝,和 EXISTS 子句取反质况。