MySQL高階SQL語句_gw
MySQL高階SQL語句
MySQL進階查詢
在 MySQL 中,可以使用 select 語句來查詢資料。
查詢資料是指從資料庫中根據需求,使用不同的查詢方式來獲取不同的資料,是使用頻率最高、最重要的操作。
SELECT * FROM 表名;
SELECT 列名 FROM 表名;
按關鍵字排序
1、使用order by語句來實現排序
2、排序可針對一個或多個欄位
3、ASC:升序,預設排序方式
4、DESC:降序
5、order by的語法結構:select 欄位1,欄位2 from 表名 order by 欄位1 desc|asc,欄位2 desc|asc;
對結果進行分組
1、使用group by語句來實現分組
2、通常結合聚合函式一起使用
3、可以按一個或多個欄位對結果進行分組
限制結果條目
1、只返回select查詢結果的第一行或前幾行
2、使用limit語句限制條目
3、limit語法結構(1)select 欄位1,欄位2 from 表名 limit [offset,] number;
(2)offset:位置偏移量,從0開始
(3)number:返回記錄行的最大數目
設定別名
1、使用as語句設定別名,關鍵字as可省略
2、設定別名時,保證不能與庫中其他表或欄位名稱衝突
3、別名的語法結構
萬用字元
1、用於替換字串中的部分字元
2、通常配合like一起使用,並協同where完成查詢
3、常用萬用字元(1)%表示零個、一個或多個即任意字元
(2)_表示單個字元
子查詢
1、也稱作內查詢或者巢狀查詢
2、先於主查詢被執行,其結果將作為外層主查詢的條件
3、在增刪改查中都可以使用子查詢
4、支援多層巢狀
5、in語句用來判斷某個值是否在給定的結果集中
多層巢狀
select、update、delete都支援多層巢狀
exists的用法
select * from 表名 where exists(select * from 表名 where 欄位=值); #exists與if類似,後面的語句執行成功,在執行前面的語句
NULL值
1、表示缺失的值
2、與數字0或者空白(spaces)是不同的
3、使用is null或is not null進行判斷
4、null值和空值(’’)的區別空值長度為0,不佔空間;null值的長度為null,佔用空間
is null無法判斷空值
空值使用“=”或者“<>”來處理
count()計算時,null會忽略,空值會加入計算
null:真空(什麼都沒有); ‘ ’:空氣(還有空氣)
正則表示式
1、根據指定的匹配模式匹配記錄中符合要求的特殊字元
2、使用regexp關鍵字指定匹配模式
3、常用匹配模式:^ 匹配文字的開始字元
$ 匹配文字的結束字元
. 匹配任何單個字元
* 匹配前面的字元零次或多次
+ 匹配前面的字元一次或多次
字串 匹配包含指定的字串
p1lp2 匹配p1或p2
[…] 匹配字元集合中任一字元
[^…] 匹配不在括號中的任一字元
{n} 匹配前面的字串n次
{n,m} 匹配前面的字串至少n次,之多m次
運算子
用於對記錄中的欄位值進行運算
MySQL 的運算子共有四種,分別是:算術運算子、比較運算子、邏輯運算子和位運算子
算數運算子
+ 加法
- 減法
* 乘法
/ 除法
% 取餘
比較運算子
= 等於
大於
< 小於
= 大於等於
<= 小於等於
!=或<> 不等於
is null 判斷一個值是否為NULL
is not null 判斷一個值是否不為NULL
between and 兩者之間
in 在集合中
like 萬用字元匹配
greatest 兩個或多個引數時返回最大值
least 兩個或多個引數時返回最小值
regext 正則表示式
等於運算子
1、用來判斷數字、字串和表示式是否相等的,如果相等則返回 1,如果不相等則返回 0。其中字元的比較是根據 ASCII 碼來判斷的。
2、ASCII碼錶轉換:
0-48,1-49,…9-57
A-65,B-66
a-97,b-98
3、比較規則:
如果兩者都是整數,則按照整數值進行比較。
如果一個整數一個字串,則會自動將字串轉換為數字,再進行比較。
如果兩者都是字串,則按照字串進行比較。
如果兩者中至少有一個值是 NULL,則比較的結果是 NULL。
不等於運算子
1、不等於號有兩種寫法,分別是<>或者!=,用於針對數字、字串和表示式不相等的比較。如果不相等則返回 1,如果相等則返回 0。
2、需要注意的是不等於運算子不能用於判斷 NULL。
注意
都不能用於判斷NULL
S NULL、IS NOT NULL
1、IS NULL 判斷一個值是否為 NULL,如果為 NULL 返回 1,否則返回 0。
2、IS NOT NULL 判斷一個值是否不為 NULL,如果不為 NULL 返回 1,否則返回 0。
between and
用於判斷一個值是否落在某兩個值之間
例如,判斷某數字是否在另外兩個數字之間,也可以判斷某英文字母是否在另外兩個字母之間
least、greatest
1、LEAST:當有兩個或者多個引數時,返回其中的最小值。如果其中一個值為 NULL,則返回結果就為 NULL。
2、GREATEST:當有兩個或者多個引數時,返回其中的最大值。如果其中一個值為 NULL, 則返回結果就為 NULL。
in、not in
1、IN 判斷一個值是否在對應的列表中,如果是返回 1,否則返回 0。
2、NOT IN 判斷一個值是否不在對應的列表中,如果不是返回 1,否則返回 0。
like、not like
1、LIKE 用來匹配字串,如果匹配成功則返回 1,反之返回 0;NOT LIKE 正好跟 LIKE 相反。
2、LIKE 支援兩種萬用字元:’%’ 用於匹配任意數目的字元,而’_’只能匹配一個字元。
邏輯運算子
1、又被稱為布林運算子
2、用來判斷表示式的真假
3、運算子————描述NOT或!————邏輯非
AND或&&————邏輯與
OR或|————邏輯或
XOR————邏輯異或
邏輯非
1、邏輯非將跟在它後面的邏輯測試取反,把真變為假,把假變為真。
2、如果 NOT 後面的運算元為 0 時,所得值為 1;如果運算元為非 0 時,所得值為 0;如果運算元為 NULL 時,所得值為 NULL。
注意:非0值都是1
邏輯與
如果所有值都是真返回 1,否則返回 0。
邏輯或(最好用or)
邏輯或表示包含的運算元,任意一個為非零值並且不是 NULL 值時,返回 1,否則返回0。
邏輯異或
兩個非 NULL 值的運算元,如果兩者都是 0 或者都是非 0,則返回 0;如果一個為 0, 另一個為非 0,則返回結果為 1;
當任意一個值為 NULL 時,返回值為 NULL。
運算總結
and運算,只要碰到0就是0,(非0和null是null)
or運算,只要碰到非0值就是1,(0和null是null)
異或運算,只要碰到null都是null
位運算子
位運算子實際上是對二進位制數進行計算的運算子。
位運算方法:
mysql> select 10&15,10|15,10^15,15&~10;
1、按位與運算
按位與運算(&),是對應的二進位制位都是 1 的,它們的運算結果為 1,否則為 0
10 | 1010 | / |
---|---|---|
15 | 1111 | |
& | 1010 | 10 |
2、按位或運算
按位或運算(|),是對應的二進位制位只要是 1 的,它們的運算結果就為 1,否則為 0
10 | 1010 | / |
---|---|---|
15 | 1111 | |
1111 15 |
3、按位異或運算
按位異或運算(^),是對應的二進位制位不相同時,運算結果 1,否則為 0
10 | 1010 | / |
---|---|---|
15 | 1111 | |
^ | 0101 | 5 |
4、按位取反運算
按位取反(~),是對應的二進位制數逐位反轉,即 1 取反後變為 0, 0 取反後變為 1
15 | 1111 | / |
---|---|---|
10 | 1010 | |
& | 1010 | 10 |
~ | 0101 | 5 |
5、按位左移運算
1 | 0001 |
---|---|
1<<2 | 0100 |
6、按位右移運算
按位右移2位,多餘的位數直接刪除
按位左移3位,空缺處補0
10 | 1010 | / |
---|---|---|
10>>2 | 0010 | 2 |
10<<2 | 010100000 | 80 |
常用的運算子優先順序
優先順序 運算子
1 !
2 ~
3 ^
4 *,/(DIV),%(MOD)
5 +,-
6 >>,<<
7 &
8 I
9 =,<=>,>=,>,<,<>,!=,IS,LIKE,REGEXP,IN
10 BETWEEN,CASE,WHEN,THEN,ELSE
11 NOT
12 &&,AND
13 II,OR,XOR
14 :=
連線查詢
通常都是將來自兩個或多個表的行結合起來,基於這些表之間的共同欄位,進行資料的拼接。
要先確定一個主表作為結果集,然後將其他表的行有選擇性的連線到選定的主表結果集上。
使用較多的連線查詢包括:
內連線
外連線:左連線
右連線
內連線
1、在from子句中使用關鍵字 inner join 來連線多張表,並使用 on子句設定連線條件
2、內連線是系統預設的表連線,所以在 FROM 子句後可以省略 INNER 關鍵字,只使用關鍵字 JOIN。同時有多個表時,也可以連續使用 INNER JOIN 來實現多表的內連線,不過為了更好的效能,建議最好不要超過三個表。
外連線
1、左連線,主表在左邊,主表內容會全部顯示出來,在從表中沒匹配到的以NULL顯示出來
2、右連線,主表在右邊,主表內容會全部顯示出來,在從表中沒匹配到的以NULL顯示出來