例題SQL語句詳解-資料庫基本操作11-排序分組聯合
阿新 • • 發佈:2018-12-11
|
1.6.11 order by排序
asc:升序【預設】
desc:降序
mysql> select * from stu order by ch desc; # 語文成績降序排列
mysql> select * from stu order by math asc; # 數學成績升序排列
mysql> select * from stu order by math; # 預設升序排列
多列排序
#年齡升序,成績降序
mysql> select *,(ch+math) as '總分' from stu order by stuage asc,(ch+math) desc;
思考如下程式碼表示什麼含義
select * from stu order by stuage desc,ch desc; #年齡降序,語文降序
select * from stu order by stuage desc,ch asc; #年齡降序,語文升序
select * from stu order by stuage,ch desc; #年齡升序、語文降序
select * from stu order by stuage,ch; #年齡升序、語文升序
1.6.12 group by 【分組查詢】
將查詢的結果分組,分組查詢目的在於統計資料。
# 按性別分組,顯示每組的平均年齡
mysql> select avg(stuage) as '年齡',stusex from stu group by stusex;
+---------+--------+
| 年齡 | stusex |
+---------+--------+
| 22.7500 | 女 |
| 25.4000 | 男 |
+---------+--------+
2 rows in set (0.00 sec)
# 按地區分組,每個地區的平均年齡
mysql> select avg(stuage) as '年齡',stuaddress from stu group by stuaddress;
+---------+------------+
| 年齡 | stuaddress |
+---------+------------+
| 31.0000 | 上海 |
| 21.3333 | 北京 |
| 27.0000 | 天津 |
| 23.0000 | 河北 |
| 23.0000 | 河南 |
+---------+------------+
5 rows in set (0.00 sec)
腳下留心:
1、如果是分組查詢,查詢欄位必須是分組欄位和聚合函式。
2、查詢欄位是普通欄位,只取第一個值
通過group_concat()函式將同一組的值連線起來顯示
mysql> select group_concat(stuname),stusex from stu group by stusex;
+-------------------------------------+--------+
| group_concat(stuname) | stusex |
+-------------------------------------+--------+
| 李斯文,諸葛麗麗,梅超風,Tabm | 女 |
| 張秋麗,李文才,歐陽俊雄,爭青小子,Tom | 男 |
+-------------------------------------+--------+
2 rows in set (0.00 sec)
多學一招:【瞭解】
1、分組後的結果預設會按升序排列顯示
2、也是可以使用desc實現分組後的降序
多列分組
mysql> select stuaddress,stusex,avg(stuage) from stu group by stuaddress,stusex;
+------------+--------+-------------+
| stuaddress | stusex | avg(stuage) |
+------------+--------+-------------+
| 上海 | 男 | 31.0000 |
| 北京 | 女 | 22.0000 |
| 北京 | 男 | 21.0000 |
| 天津 | 男 | 27.0000 |
| 河北 | 女 | 23.0000 |
| 河南 | 女 | 23.0000 |
+------------+--------+-------------+
6 rows in set (0.00 sec)
1.6.13 having條件
思考:資料庫中的表是一個二維表,返回的結果是一張二維表,既然能在資料庫的二維表中進行查詢,能否在結果集的二維表上繼續進行查詢?
答:可以,having條件就是在結果集上繼續進行篩選。
例題
mysql> select * from stu where stusex='男'; # 從資料庫中查詢
+--------+----------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+----------+--------+--------+---------+------------+------+------+
| s25301 | 張秋麗 | 男 | 18 | 1 | 北京 | 80 | NULL |
| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |
| s25304 | 歐陽俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 |
| s25318 | 爭青小子 | 男 | 26 | 6 | 天津 | 86 | 92 |
| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 |
+--------+----------+--------+--------+---------+------------+------+------+
5 rows in set (0.00 sec)
mysql> select * from stu having stusex='男'; # 從結果集中查詢
+--------+----------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+----------+--------+--------+---------+------------+------+------+
| s25301 | 張秋麗 | 男 | 18 | 1 | 北京 | 80 | NULL |
| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |
| s25304 | 歐陽俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 |
| s25318 | 爭青小子 | 男 | 26 | 6 | 天津 | 86 | 92 |
| s25320 | Tom | 男 | 24 | 8 | 北京 | 65 | 67 |
+--------+----------+--------+--------+---------+------------+------+------+
5 rows in set (0.00 sec)
思考如下語句是否正確
having和where的區別:
where是對原始資料進行篩選,having是對記錄集進行篩選。
1.6.14 limit
語法:limit 起始位置,顯示長度
mysql> select * from stu limit 0,2; # 從0的位置開始,取兩條資料
+--------+---------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+---------+--------+--------+---------+------------+------+------+
| s25301 | 張秋麗 | 男 | 18 | 1 | 北京 | 80 | NULL |
| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |
+--------+---------+--------+--------+---------+------------+------+------+
2 rows in set (0.00 sec)
mysql> select * from stu limit 2,2; # 從2的位置開始,取兩條資料
+--------+----------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+----------+--------+--------+---------+------------+------+------+
| s25303 | 李斯文 | 女 | 22 | 2 | 北京 | 55 | 82 |
| s25304 | 歐陽俊雄 | 男 | 28 | 4 | 天津 | NULL | 74 |
+--------+----------+--------+--------+---------+------------+------+------+
起始位置可以省略,預設是從0開始
mysql> select * from stu limit 2;
+--------+---------+--------+--------+---------+------------+------+------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math |
+--------+---------+--------+--------+---------+------------+------+------+
| s25301 | 張秋麗 | 男 | 18 | 1 | 北京 | 80 | NULL |
| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 |
+--------+---------+--------+--------+---------+------------+------+------+
2 rows in set (0.00 sec)
例題:找出班級總分前三名
mysql> select *,(ch+math) total from stu order by total desc limit 0,3;
+--------+----------+--------+--------+---------+------------+------+------+-------+
| stuNo | stuName | stuSex | stuAge | stuSeat | stuAddress | ch | math | total |
+--------+----------+--------+--------+---------+------------+------+------+-------+
| s25318 | 爭青小子 | 男 | 26 | 6 | 天津 | 86 | 92 | 178 |
| s25321 | Tabm | 女 | 23 | 9 | 河北 | 88 | 77 | 165 |
| s25302 | 李文才 | 男 | 31 | 3 | 上海 | 77 | 76 | 153 |
+--------+----------+--------+--------+---------+------------+------+------+-------+
多學一招:limit在update和delete語句中也是可以使用的。
1.6.15 查詢語句中的選項
查詢語句中的選項有兩個:
1、 all:顯示所有資料 【預設】
2、 distinct:去除結果集中重複的資料
mysql> select distinct stuaddress from stu;
+------------+
| stuaddress |
+------------+
| 上海 |
| 天津 |
| 河南 |
| 河北 |
| 北京 |
+------------+
5 rows in set (0.00 sec)
1.7 union(聯合)
插入測試資料
mysql> create table GO1(
-> id int primary key,
-> name varchar(20));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into Go1 values (1,'李白'),(2,'張秋麗');
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
1.7.1 union的使用
作用:將多個select語句結果集縱向聯合起來
語法:select 語句 union [選項] select 語句 union [選項] select 語句
mysql> select stuno,stuname from stu union select id,name from Go1;
+--------+----------+
| stuno | stuname |
+--------+----------+
| s25301 | 張秋麗 |
| s25302 | 李文才 |
| s25303 | 李斯文 |
| s25304 | 歐陽俊雄 |
| s25305 | 諸葛麗麗 |
| s25318 | 爭青小子 |
| s25319 | 梅超風 |
| s25320 | Tom |
| s25321 | Tabm |
| 1 | 李白 |
| 2 | 張秋麗 |
+--------+----------+
例題:查詢上海的男生和北京的女生
mysql> select stuname,stuaddress,stusex from stu where (stuaddress='上海' and stusex='男') or (stuaddress='北京' and stusex='女');
+---------+------------+--------+
| stuname | stuaddress | stusex |
+---------+------------+--------+
| 張秋麗 | 上海 | 男 |
| 梅超風 | 北京 | 女 |
+---------+------------+--------+
2 rows in set (0.00 sec)
mysql> select stuname,stuaddress,stusex from stu where stuaddress='上海' and stusex='男' union select stuname,stuaddress,stusex from stu where stuaddress='北京' and stusex='女';
+---------+------------+--------+
| stuname | stuaddress | stusex |
+---------+------------+--------+
| 張秋麗 | 上海 | 男 |
| 梅超風 | 北京 | 女 |
+---------+------------+--------+
2 rows in set (0.02 sec)
1.7.2 union的選項
union的選項有兩個
1、 all:顯示所有資料
2、 distinct:去除重複的資料【預設】
mysql> select name from go1 union select stuname from stu;
+----------+
| name |
+----------+
| 李白 |
| 張秋麗 |
| 李文才 |
| 李斯文 |
| 歐陽俊雄 |
| 諸葛麗麗 |
| 爭青小子 |
| 梅超風 |
| Tom |
| Tabm |
+----------+
預設是去重複的
mysql> select name from go1 union all select stuname from stu; # all不去重複記錄
+----------+
| name |
+----------+
| 李白 |
| 張秋麗 |
| 張秋麗 |
| 李文才 |
| 李斯文 |
| 歐陽俊雄 |
| 諸葛麗麗 |
| 爭青小子 |
| 梅超風 |
| Tom |
| Tabm |
+----------+
1.7.3 union的注意事項
1、 union兩邊的select語句的欄位個數必須一致
2、 union兩邊的select語句的欄位名可以不一致,最終按第一個select語句的欄位名。
3、 union兩邊的select語句中的資料型別可以不一致。