在講解查詢前,我為大家準備了一個資料表。這個表中存放著銀行的餘額和使用者的基本資料。
我們定義了一個表格結構,表名為money。
「建立表格的語句如下:
表格結構與資料顯示如下:CREATE TABLE
) ENGINE = InnoDB CHARACTER SET utf8;money
(
#id
INT NOT NULL AUTO_INCREMENT ,
username
VARCHAR(50) NOT NULL ,
#balance
FLOAT NOT NULL ,
#balance
FLOAT NOT NULL ,
age
TINYINT UNSIGNED NOT NULL ,sex
TINYINT NOT NULL ,PRIMARY KEY (
id
(10))
##id | #username | balance | province | age | sex |
---|---|---|---|---|---|
1 | #1 | 王寶強 | |||
上海 | 29 | 1 | ##2 | #范冰冰 | 260.23 |
40 | #0 | 3 | 黃曉明 | 150.86 | |
40 | #1 | 4 | 井柏然 | ||
遼寧 | 27 | 1 | #5 | 李冰冰 | |
黑龍江 | 43 | 0 | 6 | 成龍 | |
山東 | 63 | 1 | #7 | 楊冪 | |
北京 | 30 | 0 | 8 | 劉詩詩 | |
北京 | 29 | 1 | 9 | 柳岩 | |
9 | 柳岩 | 23.4 | ##湖南36 | 0 | |
#趙本山 | 3456 | ##遼寧 | 63 | 1 |
#34.32
北京
1 |
註:”*” 是一種正規表示式的寫法,表示匹配所有,上面的查詢語句和下面的是等價:
mysql> select * from money;
+- ---+-----------+---------+-----------+-----+-----+
| id | username | balance | province | age | sex |
+----+-----------+---------+--- --------+-----+-----+
| 1 | 王寶強 | 120.02 | 湖北 | 29 | 1 |
| 2 | | 0 |
| 3 | 黃曉明 | 150.86 | 山東 | 40 | 1 |
| 4 | 汝 5 | 李冰冰 | 20.15 | 黑龍江 | 43 | 0 |
| 6 | 成龍 | 313 | 山東 | 63 | 1 |
| 7 | 楊冪 | 1 |
| 7 | 楊冪 | 12 北京劉 |詩詩 | 456 | 北京 | 29 | 1 |
| 9 | 柳岩 | 23.4 | 湖南 | 36 | 0 |
#| 10 | 趙本山 | 3456 |115 | 34.32 | 北京 | 44 | 1 |
| 12 | 郭德綱 | 212 | 天津 | 43 | 1 |
+----+-----------+---------+------ -----+-----+-----+
12 rows in set (0.00 sec)
#指定欄位查詢
詳細解示 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
select 欄位from 表; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
select id,username, balance from money; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
查詢money表中id,username, balance欄位中的所有結果 |
基本語法 | |
---|---|
#範例 | select distinct age deptno from money; |
範例說明 | 查詢money表中年齡唯一的所有結果 |
mysql> select distinct age deptno from money; | +--------+ | | deptno |
| 27 |
| 43 |
| 63 |
| 30 |
| 36 |
| 44 |
+--------+
8 rows in set (0.00 sec )
條件查詢where
##基本語法 | select 欄位from 表where where條件; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
select * from money where age = 29; | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
查詢money表中年齡為29的所有結果 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
符號 | 說明 |
---|---|
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
!= | 不等於 |
= | 等於 |
#邏輯運算子
符號 | |
---|---|
or | |
並且
我們來看多個條件的範例: | |
---|---|
select * from money where id <10 and |
查詢所有欄位要求id小於10 且province='湖北'+----+-----------+---------+----------+-----+----- +| id | username | balance | province | age | sex |
mysql> select * from money where id <10 and province='湖北';
+----+-----------+---------+----------+-----+----- +
結果集排序 | |
---|---|
排序用到的關鍵字:
關鍵字 | 說明 |
---|---|
asc | 升序排列,從小到大(預設) |
在select 出來之後的結果集中排序使用order by ,其中desc 和asc 是排序順序中的關鍵字。 desc 表示依照欄位進行降序排列,asc 表示升序排列,如果不寫關鍵字預設升序排列。
mysql> select id,username, balance from money order by balance desc;
+----+-----------+-------- -+
| id | username | balance |
+----+-----------+---------+
| 10 | 趙本山| 3456 |
| 4 | 井柏然 | 810 |
| 8 | 劉詩詩 | 456 |
| 16 | 成龍 冰 1 260.23 |
| 12 | 郭德綱| 212 |
| 3 | 黃曉明 | 150.86 |
| 7 | 楊冪 | 123 | ## 102 王寶強 |10. 34.32 |
| 9 | 柳岩| 23.4 |
類別 | |
---|---|
基本語法 | |
範例 | |
範例說明 |
* 註:如果第一個欄位已經將結果給排好。第二個字段排序字段不生效。本例中,第二個欄位無效。 *
mysql> select id,username, balance from money order by balance desc,age asc;
+----+-----------+---------+
# | id | username | balance |
+----+-----------+---------+
# | 10 | 趙本山 | 3456 |
| 4 | 井柏然 | 810 |
| 8 | 劉詩詩 | 456 |
| 6 | 成龍 | 313 |
| 2 | 範冰冰 | 260.23 |
| 12 | 郭德綱 | 212 |
| 3 | 黃曉明 | 150.86 |
| 7 | 楊冪 | 123 |
| 1 | 王寶強 | 120.02 |
| 11 | 汪峰 | 34.32 |
| 9 | 柳岩 | 23.4 |
| 5 | 李冰冰 | 20.15 |
+----+-----------+---------+
# 12 rows in set (0.00 sec)
對於查詢或排序後的結果集,如果希望只顯示一部分而不是全部,使用limit 關鍵字結果集數量限制。
類別 | 詳細解示 |
---|---|
基本語法 | #select 欄位from 表 limit 數量; |
範例 | #select id,username, balance from money limit 5; |
#範例說明 | 顯示前五個使用者 |
mysql> select * from money limit 5;
+----+-----------+---------+------- ----+-----+-----+
| id | username | balance | province | age | sex |
+----+-------- ---+---------+-----------+-----+-----+
| 1 | 王寶強 | 120.02 | 湖北 | 29 | 1 |
| 2 | 範冰冰 | 260.23 | 山東 | 40 | 0 |
#| 3 | 黃曉栠 40 | 0 |
| 3 | 黃小頠 | 4 | 井柏然 | 810 | 遼寧 | 27 | 1 |
| 5 | 李冰冰 | 20.15 | 黑龍江 | 43 | 0 |
+----+-----------+---------+- ----------+-----+-----+
5 rows in set (0.00 sec)
類別 | 詳細解示 |
---|---|
#基本語法 | select 欄位from 表order by 欄位關鍵字limit 數量 |
#範例 | select id,username, balance from money order by balance desc limit 5; |
#範例說明 | 依照錢來排序,顯示前五個最有錢的用戶 |
mysql> select id,username, balance from money order by balance desc limit 5;
+----+-----------+---------+
| id | username | balance |
+----+-----------+---------+
| 10 | 趙本山 | 3456 |
| 4 | 井柏然 | 810 |
| 8 | 劉詩詩 | 456 |
| 6 | 成龍 | 313 |
| 2 | 範冰---------+
5 rows in set (0.00 sec)
詳細解示 | |
---|---|
#select 欄位from 表 limit 偏移量,數量 | |
select id,username, balance from money limit 0,3; | |
從第一筆開始取三筆記錄 |
#函數 | 說明 |
---|---|
#sum | 總和 |
count | 統計總數 |
#max | 最大 |
min | 最小值 |
avg#平均值
註:當然你知道其他的mysql函數也可以使用。不過,在實際工作中,大公司的許多大中型項上很少使用,他們都有專門的計數伺服器。因為,mysql的計算量本身很大,為了減少壓力通常我們將實際的運算任務交給業務伺服器或其他伺服器來完成。 | |
---|---|
#詳細解示 | |
基本語法 | select 函數(字段) from 表 |
範例 | #select count(id) from money |
mysql> select count(id) from money;
+-----------+
| count(id) |
+-----------+
| 12 |
+-----------+
1 row in set (0.00 sec)
你也可以為欄位取別名喲!使用as關鍵字。
mysql> select count(id) as zongshu from money;
+---------+
| zongshu |
+---------+
| 12 |
+---------+
1 row in set (0.00 sec)
mysql> select avg(balance) from money;
+--------------------+
| avg(balance) |
+--------------------+
| 498.24833393096924 |
+--------------------+
1 row in set (0.00 sec)
mysql> select sum(balance) from money;
+-----------------+
| sum(balance) |
# +-----------------+
| 5978.980007171631 |
+-----------------+
1 row in set (0.00 sec)
mysql> select max(balance) from money;
+--------------+
| max(balance) |
+--------------+
| 3456 |
+--------------+
1 row in set (0.00 sec)
mysql> select min(balance) from money;
+--------------------+
| min(balance) |
# +--------------------+
| 20.149999618530273 |
+--------------------+
1 row in set (0.00 sec)
我們拿金額表裡面的省份進行分組數據,分組數據後你會發現。有相同的省份會去掉。即,一個省份為一個組。
類別 | 詳細解示 |
---|---|
基本語法 | #select * from 表group by 欄位 |
#範例 | select * from money group by province; |
範例說明 | 依照地區進行分組 |
mysql> select * from money group by province;
+----+-----------+---------+------ -----+-----+-----+
| id | username | balance | province | age | sex |
+----+------- ----+---------+-----------+-----+-----+
| 7 | 楊冪 | 123 | 北京| 30 | 0 |
| 12 | 郭德綱 | 212 | 天津 | 43 | 1 |
| 2 1 | 王寶強 | 120.02 | 湖北 | 29 | 1 |
| 9 | 柳岩 | 23.4 | 湖南 | 36 | 0 |
| 4 | 井 # | 5 | 李冰冰 | 20.15 | 黑龍江 | 43 | 0 |
+----+-----------+---------+-----------+-----+ -----+
統計分組(分類)各總數:
mysql> select deptno, count(1) from emp group by deptno;
+----- ---+----------+| deptno | count(1) |
+--------+----------+
| 1 | 1 |
#| 2 | 5 |
| 3 | ---- -----+
4 rows in set (0.04 sec)
統計省份數量後再進行分組顯示
+-----------------+-----------+| 3 | 北京 |
with rollup用的很少。這個知識點設定為了解等級。
| 1 | 天津 |
| 3 | 山東 |
| 1 | 湖北 |
| 1 | 湖南 |
| 2 | 遼寧 |
| 1 | 黑色龍江 |
+-----------------+-----------+
7 rows in set (0.00 sec)
在分組基礎上進行統計
類別 | 詳細解示 |
---|---|
#基本語法 | select * from 表group by 欄位with rollup |
範例 | select count(province),province from money group by province with rollup; |
##範例說明 |
#在上面的基礎上統計總數,下例結果中,最後多了一個12 NULL。8 rows in set (0.00 sec)+-----------------+-----------+
mysql> select count(province),province from money group by province with rollup;
+-----------------+-----------+
| count(province) | province |
+-----------------+-----------+
| 3 | 北京 |
| 1 | 天津 |
| 3 | 山東 |
| 1 | 湖北 |
| 1 | 湖南 |
| 2 | 遼寧 |
| 1 | 黑色龍江 |
| 12 | NULL |
結果再過濾having
having子句與where有相似之處但也有區別,都是設定條件的語句。
類別 | |
---|---|
基本語法 | |
範例 | |
範例說明 |
mysql> select count(province) as result ,province from money group by province having result >2;
+--------+----------+
| result | province |
+--------+----------+
| 3 | 北京 |
| 3 | 山東 |
+--------+----------+
2 rows in set (0.00 sec)
我們在上面的語句中都是單一使用的某些語句,沒有整體使用過。
我們現在將語句進行整合後,搭配使用一次。整體的SQL語句配合使用的語法結構如下:
SELECT
[字段1 [as 別名1],[函數(字段2) ,]......字段n]
FROM 表名
[WHERE 其中條件]
[GROUP BY 字段]
[HAVING where_contition]
[order 條件]
[limit 條件]
附註:上面的語句中可以[] 代表可選。
最終的語法總結如下:
關鍵字 | 說明 |
---|---|
#select | 選擇的欄位 |
from | 表 |
where | 查詢的條件 |
group by | 分組屬性 having 分組篩選的條件 |
#排序屬性 | |
起始記錄位置,取記錄的條數 |
mysql> select id,username,balance,province from money where id > 1 and balance > 50 group by province order by id desc limit 3;下一節+----+-----------+---------+----------+
| id | username | balance | province |
+----+-----------+---------+----------+
| 12 | 郭德綱 | 212 | 天津 |
| 7 | 楊冪 | 123 | 北京 |
| 4 | 井柏然 | 810 | 遼寧 |
+----+-----------+---------+----------+
3 rows in set (0.00 sec)