查詢的基本文法
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;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4AjM4kjYxgDNzEmMvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
查詢結果
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4AjM4kjYxgDNzEmMvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
查詢部分列
條件
使用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 '[!張李]%'
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4AjM4kjYxgDNzEmMvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
查詢結果
範圍查詢 BETWEEN
between ... and ...表示在一個連續的範圍内
select * from score
where grade between 60 and 80;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4AjM4kjYxgDNzEmMvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
分數在60~80之間的資料
IN 操作符允許我們在 WHERE 子句中規定多個值。表示:在哪些值當中。
in表示在一個非連續的範圍内
-- 查詢計算機,英語的成績
select * from score
where c_name in ('計算機','英語');
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4AjM4kjYxgDNzEmMvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
計算機,英語的成績
邏輯運算符
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;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4AjM4kjYxgDNzEmMvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
統計結果
分組查詢
按照字段分組,表示此字段相同的資料會被放到一個組中
分組後,隻能查詢出相同的資料列,對于有差異的資料列無法出現在結果集中
可以對分組後的資料進行統計,做聚合運算
文法:
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 ='男';
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4AjM4kjYxgDNzEmMvwFcvwVbvNmL1h2cuFWaq5yd3d3Lc9CX6MHc0RHaiojIsJye.jpg)
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
實際使用中,隻是語句中某些部分的組合,而不是全部