1. 程式人生 > >例題SQL語句詳解-資料庫基本操作11-排序分組聯合

例題SQL語句詳解-資料庫基本操作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語句中的資料型別可以不一致。