MYSQL——GROUP BY與 JOIN


GROUP BY

簡述

Group By”從字面意義上理解就是根據“By”指定的規則對數據進行分組,所謂的分組就是將一個“數據集”划分成若干個“小區域”,然后針對若干個“小區域”進行數據處理

示例

1.新建表如下

MariaDB [sawyer]> create table groupby(type varchar(5) not null,number tinyint(4),exp varchar(100));

MariaDB [sawyer]> desc groupby_test;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| type   | varchar(5)   | NO   |     | NULL    |       |
| number | tinyint(4)   | NO   |     | NULL    |       |
| exp    | varchar(100) | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+

2.向表內插入數據

MariaDB [sawyer]> insert groupby_test values('a',5,'a2002'),('a',2,'a2001'),('b',10,'b2003'),('b',6,'b2002'),('b',3,'b2001'),('c',9,'c2005'),('c',9,'c2004'),('c',8,'c2003'),('c',7,'c2002'),('c',4,'c2001'),('a',11,'a2001');
Query OK, 11 rows affected (0.001 sec)
Records: 11  Duplicates: 0  Warnings: 0


MariaDB [sawyer]> select * from groupby_test;
+------+--------+-------+
| type | number | exp   |
+------+--------+-------+
| a    |      5 | a2002 |
| a    |      2 | a2001 |
| b    |     10 | b2003 |
| b    |      6 | b2002 |
| b    |      3 | b2001 |
| c    |      9 | c2005 |
| c    |      9 | c2004 |
| c    |      8 | c2003 |
| c    |      7 | c2002 |
| c    |      4 | c2001 |
| a    |     11 | a2001 |
+------+--------+-------+
11 rows in set (0.001 sec)

3.簡單Group By

select type '類型',sum(number) '最大值' from groupby_test GROUP BY type;

效果見下

這里以type字段進行分組,將相同類別的數量進行比較,取各個類別中的數量最大值

4.GROUP BY與Order by

select type '類型',sum(number) '最大值' from groupby_test GROUP BY type ORDER BY sum(number) desc;

效果見下

5.組合GROUP BY

SELECT
	type '類型',
	sum( number ) '最大值',
	exp '說明' 
FROM
	groupby_test 
GROUP BY
	type,
	groupby_test.exp 
ORDER BY
	sum( number ) DESC

效果如下

當group by 后接多個字段時,我們可以將多個字段看作一個整體,這里只有type=a的2行內容滿足條件,所以其和為11+2=13.

Group By與聚合函數

由於GROUP BY用法下,會出現一個字段內存在多個值出現,這在sql中時不允許的。所以GROUPBY經常與聚合函數一起使用。

函數 作用
sum(列名) 求和
max(列名) 最大值
min(列名) 最小值
avg(列名) 平均值
count(列名) 統計記錄數

Join詳解

簡述

SQL JOIN 子句用於把來自兩個或多個表的行結合起來,基於這些表之間的共同字段來進行操作。

現假設有兩張表:com_list 和 nation_list

com_list

com_list

nation_list

  • 后續將以這兩張table作為實例

INNER JOIN

內連接是最常見的一種連接,只連接表中匹配的行。

  • 語法:
select column_name(s)
from table 1
INNER JOIN table 2
ON
table 1.column_name=table 2.column_name

注意:INNER JOIN與JOIN是相同的。

示例

1.創建兩張表

MariaDB [sawyer]> create table com_list(id int(4) not null primary key auto_increment,name varchar(50) not null);
Query OK, 0 rows affected (0.007 sec)

#修改表相應字段的編碼類型
ariaDB [sawyer]> alter table com_list modify name varchar(50) character set utf8;
Query OK, 0 rows affected (0.013 sec)              
Records: 0  Duplicates: 0  Warnings: 0



#導入數據
MariaDB [sawyer]> insert com_list values(1,'Google'),(2,'淘寶'),(3,'微博'),(4,'Facebook');
Query OK, 4 rows affected (0.001 sec)
Records: 4  Duplicates: 0  Warnings: 0


MariaDB [sawyer]> select * from com_list;
+----+----------+
| id | name     |
+----+----------+
|  1 | Google   |
|  2 | 淘寶     |
|  3 | 微博     |
|  4 | Facebook |
+----+----------+
4 rows in set (0.000 sec)

#創建nation_list表(修改編碼為UTF8)
MariaDB [sawyer]> create table nation_list(id int(4) primary key not null,address varchar(50)) default charset = utf8;

#添加數據
MariaDB [sawyer]> insert nation_list values(1,'美國'),(5,'中國'),(3,'中國'),(6,'
美國');
Query OK, 4 rows affected (0.002 sec)
Records: 4  Duplicates: 0  Warnings: 0
MariaDB [sawyer]> select * from nation_list;
+----+---------+
| id | address |
+----+---------+
|  1 | 美國    |
|  3 | 中國    |
|  5 | 中國    |
|  6 | 美國    |
+----+---------+
4 rows in set (0.000 sec)

2.將兩張表INNER JOIN

SELECT
	a.id,
	a.NAME,
	b.address 
FROM
	com_list a
	INNER JOIN nation_list b ON a.id = b.id

執行結果如下

LEFT JOIN

LEFT JOIN返回左表的全部行和右表滿足ON條件的行,如果左表的行在右表中沒有匹配,那么這一行右表中對應數據用NULL代替。

  • LEFT JOIN 語法
select column_name(s)
from table 1
LEFT JOIN table 2
ON table 1.column_name=table 2.column_name

示例

同樣將上兩張表進行LEFT JOIN連接

SELECT
	a.id,
	a.NAME,
	b.address 
FROM
	com_list a
	LEFT JOIN nation_list b ON a.id = b.id

執行結果如下

RIGHT JOIN

RIGHT JOIN返回右表的全部行和左表滿足ON條件的行,如果右表的行在左表中沒有匹配,那么這一行左表中對應數據用NULL代替

  • RIGHT JOIN語法
select column_name(s)
from table 1
RIGHT JOIN table 2
ON table 1.column_name=table 2.column_name

實例

將上兩張table進行RIGHT JOIN操作

SELECT
	a.id,
	a.NAME,
	b.address 
FROM
	com_list a
	RIGHT JOIN nation_list b ON a.id = b.id

執行結果如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM