五、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),
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/46561.html
標籤:MySQL
上一篇:資料庫學習之四:資料庫用戶管理
