天天看點

mysql分組統計查詢 張三_MySQL 資料的查詢

查詢的基本文法

select * from 表名;

SELECT [ALL|DISTINCT] [,]…

FROM [,]…

[WHERE ]

[GROUP BY [HAVING ]]

[ORDER BY [ASC|DESC]…]

select distinct *

from 表名

where ....

group by ... having ...

order by ...

limit star,count

from關鍵字後面寫表名,表示資料來源于是這張表

select後面寫表中的列名,如果是*表示在結果中顯示表中所有列

在select後面的列名部分,可以使用as為列起别名,這個别名出現在結果集中

SELECT 字段名1 [AS] 别名 [,字段名1 AS 别名]… FROM

如果要查詢多個列,之間使用逗号分隔

在select後面列前使用distinct可以消除重複的行

select distinct gender from students;

準備資料

1.建立資料庫和資料表

2.插入基本資料

drop table if exists student;

-- 建立學生表

CREATE TABLE student (

id INT PRIMARY KEY ,

name VARCHAR(20) NOT NULL ,

sex VARCHAR(1) ,

birth YEAR,

department VARCHAR(20) ,

address VARCHAR(50)

);

-- 建立分數表

drop table if exists score;

CREATE TABLE score (

id INT PRIMARY KEY AUTO_INCREMENT ,

stu_id INT(10) NOT NULL ,

c_name VARCHAR(20) ,

grade INT(10)

);

-- 向student表插入記錄的INSERT語句如下:

INSERT INTO student VALUES( 901,'張老大', '男',1985,'計算機系', '北京市');

INSERT INTO student VALUES( 902,'張老二', '男',1986,'中文系', '北京市');

INSERT INTO student VALUES( 903,'張三', '女',1990,'中文系', '湖南省');

INSERT INTO student VALUES( 904,'李四', '男',1990,'英語系', '遼甯省');

INSERT INTO student VALUES( 905,'王五', '女',1991,'英語系', '福建省');

INSERT INTO student VALUES( 906,'王六', '男',1988,'計算機系', '湖南省');

-- 向score表插入記錄的INSERT語句如下:

INSERT INTO score VALUES(NULL,901, '計算機',98);

INSERT INTO score VALUES(NULL,901, '英語', 80);

INSERT INTO score VALUES(NULL,902, '計算機',65);

INSERT INTO score VALUES(NULL,902, '中文',88);

INSERT INTO score VALUES(NULL,903, '中文',95);

INSERT INTO score VALUES(NULL,904, '計算機',70);

INSERT INTO score VALUES(NULL,904, '英語',92);

INSERT INTO score VALUES(NULL,905, '英語',94);

INSERT INTO score VALUES(NULL,906, '計算機',90);

INSERT INTO score VALUES(NULL,906, '英語',85);

簡單查詢

-- 查詢所有的列

select * from student;

-- 查詢部分列

select name,department,address from student;

mysql分組統計查詢 張三_MySQL 資料的查詢

查詢結果

mysql分組統計查詢 張三_MySQL 資料的查詢

查詢部分列

條件

使用where子句對表中的資料篩選,結果為true的行會出現在結果集中

文法如下:

select * from 表名 where 條件;

運算符:

運算符

描述

=

等于

<> 或 !=

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN

在某個範圍内

LIKE

搜尋某種模式

關于BETWEEN和LIKE,專門拿出來重點說下

模糊查詢 LIKE

LIKE關鍵字與通配符一起使用

通配符

描述

%

替代一個或多個字元

_

僅替代一個字元

[charlist]

字元列中的任何單一字元

[^charlist]

或者[!charlist]

不在字元列中的任何單一字元

-- 查詢姓氏為張的學生資訊

SELECT id,name,address FROM student WHERE name LIKE '張%'

-- 查詢名字最後一個為“生”的同學

SELECT id,name,address FROM student WHERE name LIKE '%生'

-- 查詢名字中含有“生”的學生資訊

SELECT id,name,address FROM student WHERE name LIKE '%生%'

-- 查詢姓名為兩個字,且姓張學生資訊

SELECT id,name,address FROM student WHERE name LIKE '張_'

-- 查詢姓氏為張、李的學生資訊這個可以使用or關鍵字,但是使用通配符更簡單高效

SELECT id,name,address FROM student WHERE name LIKE '[張李]%'

-- 查詢姓氏非張、李的學生資訊

-- 這個也可以使用NOT LIKE 來實作,用下面方法更好。

SELECT id,name,address FROM student WHERE name LIKE '[^張李]%'

-- 或者:

SELECT id,name,address FROM student WHERE name LIKE '[!張李]%'

mysql分組統計查詢 張三_MySQL 資料的查詢

查詢結果

範圍查詢 BETWEEN

between ... and ...表示在一個連續的範圍内

select * from score

where grade between 60 and 80;

mysql分組統計查詢 張三_MySQL 資料的查詢

分數在60~80之間的資料

IN 操作符允許我們在 WHERE 子句中規定多個值。表示:在哪些值當中。

in表示在一個非連續的範圍内

-- 查詢計算機,英語的成績

select * from score

where c_name in ('計算機','英語');

mysql分組統計查詢 張三_MySQL 資料的查詢

計算機,英語的成績

邏輯運算符

AND 在 WHERE 子語句中把兩個或多個條件結合起來。表示和的意思,多個條件都成立。

-- 查詢姓張的男同學資訊

SELECT name,sex FROM student WHERE sex='男' AND Name LIKE '張%'

OR可在 WHERE 子語句中把兩個或多個條件結合起來。或關系,表示多個條件,隻有一個符合即可。

-- 查詢姓氏為張、李的學生資訊

SELECT * FROM student WHERE Name LIKE '張%' OR Name LIKE '李%'

NOT對于條件的否定,取非。

-- 查詢非張姓氏的學習資訊

SELECT * FROM Students WHERE Name NOT LIKE '張%'

空判斷

注意:null與''是不同的

判空is null

-- 查詢沒有填寫位址的學生

select * from student where address is null;

判非空is not null

-- 查詢填寫了位址的學生

select * from students where address is not null;

-- 查詢填寫了位址的女生

select * from students where address is not null and sex='女';

聚合函數查詢

聚合函數:是一個值的集合為輸入,傳回單個值的函數。

SQL預定義了5個聚集函數:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(計數)。

具體的資料庫還會預定義一些其他常用的函數,比如字元串相聚合函數、時間聚合函數……。

-- 查詢學生總數

select count(id) from student;

-- 分數那一列的求和,最大值,最小值,平均值

select sum(grade),max(grade),min(grade),avg(grade) from score;

mysql分組統計查詢 張三_MySQL 資料的查詢

統計結果

分組查詢

按照字段分組,表示此字段相同的資料會被放到一個組中

分組後,隻能查詢出相同的資料列,對于有差異的資料列無法出現在結果集中

可以對分組後的資料進行統計,做聚合運算

文法:

select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

-- 查詢各城市人數

select address as 家鄉,count(*)

from student

group by address ;

分組後的資料篩選

文法:

select 列1,列2,聚合... from 表名

group by 列1,列2,列3...

having 列1,...聚合...;

having後面的條件運算符與where的相同

對比where與having

where是對from後面指定的表進行資料篩選,屬于對原始資料的篩選

having是對group by的結果進行篩選

注意:分組之後,隻能查詢被分組的列和聚合函數

-- having後面的條件運算符與where的相同

-- 查詢男生總人數

-- 方案一

select count(*)

from student

where sex='男';

-- 方案二

select sex as 性别,count(*)

from student

group by sex

having sex ='男';

mysql分組統計查詢 張三_MySQL 資料的查詢

Paste_Image.png

排序

為了友善檢視資料,可以對資料進行排序

文法:

select * from 表名

order by 列1 asc|desc,列2 asc|desc,...

将行資料按照列1進行排序,如果某些行列1的值相同時,則按照列2排序,以此類推

預設按照列值從小到大排列

asc從小到大排列,即升序

desc從大到小排序,即降序

除了制定某個列排序外,還能指定多列排序,每個排序字段可以制定排序規則

說明:優先第一列排序,如果第一列相同,則按照第二列排序規則執行,以此類推。

-- 排序

select * from score

order by grade;

select * from score

order by grade asc;

select * from score

order by grade desc;

分頁

當資料量過大時,在一頁中檢視資料是一件非常麻煩的事情

文法

select * from 表名

limit start,count```

從start開始,擷取count條資料

start索引從0開始

-- 分頁

-- 每頁顯示2條(pageSize),要第4頁(pageNow) limit (pageNow-1)*pageSize,pageSize

select * from score

order by id

limit 0,3;

select * from score

order by id

limit 6,2;

####小結

完整的select語句

select distinct *

from 表名

where ....

group by ... having ...

order by ...

limit star,count

執行順序為:

from 表名

where ....

group by ...

having ...

order by ...

limit star,count

實際使用中,隻是語句中某些部分的組合,而不是全部