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
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
執行結果如下