五、SELECT高級應用 1、課程大綱 2、開發環境 3、select語法環境 4、WHERE子句 • 基本語法 • WHERE條件又叫做過濾條件,它從FROM子句的中間結果中去掉所有 條件conditions不為TRUE(而為FALSE或者NULL)的行 • WHERE子句跟在FROM子句後面 • ...
五、SELECT高級應用
1、課程大綱
• 開發環境準備
• select語句的基本語法格式
• WHERE子句
• ORDER BY子句
• LIMIT子句
• 多表連接查詢(join、using) • 集合操作(union) • group by與having字句
• 子查詢
2、開發環境
• 導入world.sql
• 創建用戶,使用sqlyog登錄資料庫
3、select語法環境
help select;
SELECT
[ALL | DISTINCT | DISTINCTROW ]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[Asc | DEsc], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[Asc | DEsc], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]]
4、WHERE子句
• 基本語法
SELECT *|{[DISTINCT] column|select_expr [alias], ...]}
[FROM [database.]table]
[WHERE conditions];
• WHERE條件又叫做過濾條件,它從FROM子句的中間結果中去掉所有 條件conditions不為TRUE(而為FALSE或者NULL)的行
• WHERE子句跟在FROM子句後面
• 不能在WHERE子句中使用列別名
例1:where字句的基本使用
SELECT * FROM world.`city` WHERE CountryCode='CHN';
or
SELECT * FROM world.`city` WHERE CountryCode='chn';
註意:
WHERE中出現的字元串和日期字面量必須使用引號括起來
這裡,字元串字面量寫成大寫或小寫結果都一樣,即不區分大小寫進行查詢。
這和ORACLE不同,ORACLE中WHERE條件中的字面量是區分大小寫的
例2:where字句中的邏輯操作符:
SELECT * FROM world.`city`
WHERE CountryCode='chn' AND district = 'anhui';
• 邏輯操作符介紹:
– and
邏輯與。只有當所有的子條件都為true時,and才返回true。否則返回false或null
– or
邏輯或。只要有一個子條件為true,or就返回true。否則返回false或null
– not
邏輯非。如果子條件為true,則返回false;如果子條件為false,則返回true
– xor
邏輯異或。當一個子條件為true而另一個子條件為false時,其結果為true;
當兩個條件都為true或都為false時,結果為false。否則,結果為null
例3 :where字句中的範圍比較:
SELECT * FROM world.`city`
WHERE
population BETWEEN 100000 AND 200000 ;
• 例4:where字句中的IN
SELECT * FROM city
WHERE countrycode IN ('CHN','JPN');
例5:where字句中的like
– 語法:
like ‘匹配模式字元串’
– 實現模式匹配查詢或者模糊查詢:
測試一個列值是否匹配給出的模式
– 在‘匹配模式字元串’中,可以有兩個具有特殊含義的通配字元:
%:表示0個或者任意多個字元
_:只表示一個任意字元
SELECT * FROM city
WHERE countrycode LIKE 'ch%';
5、ORDER BY子句
• ORDER BY子句用來排序行
• 如果SELECT語句中沒有ORDER BY子句,那麼結果集中行的順序是
不可預料的
• 語法:
SELECT expr
FROM table
[WHERE condition(s)]
[ORDER BY {column, expr, numeric_position} [Asc|DEsc]];
• 其中:
– Asc:執行升序排序。預設值
– DEsc:執行降序排序
– ORDER BY子句一般在SELECT語句的最後面
例1: 基本使用
SELECT * FROM city
ORDER BY population;
• 例2:多個排序條件
SELECT * FROM city
ORDER BY population,countrycode;
• 例3:以select字句列編號排序
SELECT * FROM city
ORDER BY 5; 按照第5列進行排序。
• 例4:desc asc
SELECT * FROM city
ORDER BY 5 desc;
• 例5:NULL值的排序
在MySQL中,把NULL值當做一列值中的最小值對待。因此,升序排序時,它出現在最前面
6、LIMIT子句
MySQL特有的子句。
• 它是SELECT語句中的最後一個子句(在order by後面)。
• 它用來表示從結果集中選取最前面或最後面的幾行。
• 偏移量offset的最小值為0。
• 語法:
limit <獲取的行數> [OFFSET <跳過的行數>]
或者 limit [<跳過的行數>,] <獲取的行數>
SELECT * FROM city
ORDER BY 5 DEsc
LIMIT 4;
註:先按照人口數量進行降序排序,然後使用limit從中挑出最前面的4行。
如果沒有order by子句,返回的4行就是不可預料的。
7、多表連接查詢
傳統的連接寫法(使用where)
SELECT NAME,ci.countrycode ,cl.language ,ci.population
FROM city ci , countrylanguage cl
WHERE ci.`CountryCode`=cl.countrycode;
註意:一旦給表定義了別名,那麼原始的表名就不能在出現在該語句 的其它子句中了
• NATURAL JOIN子句
• 自動到兩張表中查找所有同名同類型的列拿來做連接列,進行相等 連接
SELECT NAME,countrycode ,LANGUAGE ,population
FROM city NATURAL JOIN countrylanguage
WHERE population > 1000000
ORDER BY population;
註意:在select子句只能出現一個連接列
使用using子句
SELECT NAME,countrycode ,LANGUAGE ,population
FROM city JOIN countrylanguage
USING(countrycode);
8、集合操作
UNION [DISTINCT]
• UNION ALL
• 語法:
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
• UNION用於把兩個或者多個select查詢的結果集合併成一個
• 進行合併的兩個查詢,其SELECT列表必須在數量和對應列的數據類型上保持一致
• 預設會去掉兩個查詢結果集中的重覆行
• 預設結果集不排序
• 最終結果集的列名來自於第一個查詢的SELECT列表
9、分組操作及分組處理
“Group By”從字面意義上理解就是根據“By”指定的規則對數據進行分組, 所謂的分組就是將一個“數據集”劃分成若幹個“小區域”,然後針對若幹個 “小區域”進行數據處理。
• Having與Where的區別
- where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分
組之前過濾數據,where條件中不能包含聚組函數,使用where條件過濾出特定的行。
- having 子句的作用是篩選滿足條件的組,即在分組之後過濾數據,條件中經常包含聚
組函數,使用having 條件過濾出特定的組,也可以使用多個分組標準進行分組。
11、子查詢
子查詢定義
- 在一個表表達中可以調用另一個表表達式,這個被調用的表表達式叫做子查詢( subquery),我麽也稱作子選擇(subselect)或內嵌選擇(inner select)。子查詢 的結果傳遞給調用它的表表達式繼續處理。
- 子查詢(inner query)先執行,然後執行主查詢(outer query)
- 子查詢按對返回結果集的調用方法,可分為:where型子查詢,from型子查詢及exists 型子查詢。
• 使用子查詢原則
- 一個子查詢必須放在圓括弧中。
- 將子查詢放在比較條件的右邊以增加可讀性。
子查詢不包含 ORDER BY 子句。對一個 SELECT 語句只能用一個 ORDER BY 子句,並且 如果指定了它就必須放在主 SELECT 語句的最後。
- 在子查詢中可以使用兩種比較條件:單行運算符(>, =, >=, <, <>, <=) 和多行運算符 (IN, ANY, ALL)。