关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
2016-12-12 12:55
549 查看
http://www.jianshu.com/p/eeb6a898d4ec
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/f21277acf43d028a6faeca4570df296d)
SQL数据查询
SQL查询语句的顺序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必须的,HAVING子句只能与GROUP BY搭配使用。
1.创建数据库和数据表
2.插入基本数据
3.本文以SQL Server为例介绍
简单查询只需要
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/d49be29a95fcfc3a623fdeb86d0ff42c)
简单查询结果
AS可以省略
当别名中含有非字母和下划线时或者是关键字时,需要加上单/双引号
示例
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/f66ba5212397fa552d5841de17122c7f)
别名/更名
子查询也称嵌套查询,是指一个
连接查询:涉及两个及以上的表查询为连接查询。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/b473e1fb5b9a71d502016bd048148dcf)
子查询
聚合函数:是一个值的集合为输入,返回单个值的函数。
SQL预定义了5个聚集函数:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(计数)。
具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数、时间聚合函数……。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/c46b05bb7f5be1dfe02c375cfd5c1c6c)
聚合函数查询
使用
注意:分组查询的时候要在
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/8d6ef67882a8085598e87a8c11a36cd0)
分组查询
HAVING子句
如果需要在分组前的数据进行限制,可以使用HAVING子句
HAVING子句只能与GROUP BY搭配使用
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/16ec973e2727f02c2587d294a2e214c4)
HAVING子句
HAVING子句和WHERE的区别
WHERE语句在GROUP BY语句之前,SQL会在分组之前计算WHERE语句;
HAVING语句在GROUP BY语句之后,SQL会在分组之后计算HAVING语句。
模糊查询是通过关键字
_:任何单个字符(一个'_'只匹配一个字符,多个字符就使用多个_)
%:包含零个或更多字符的任意字符串(匹配任意内容)
[]:指定范围的字符(只匹配[]内的字符)
[ ^]:不在指定范围的字符(只匹配除[]内的字符)
SQL中通配符可以混合使用
单个字符匹配
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/76fdedf04d71fbe830bd67f5f10728ab)
模糊查询-单个字符匹配
任意字符匹配
这三条SQL语句查询结果都相同只针对此表,原因是瞎猫碰上死耗子。(数据少,刚好查询的结果是全部的内容)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/fa4b1154a0459b8cb09b4b271cbf0b8a)
模糊查询-任意匹配
范围内查询
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/c07f79f340ed5ca464ca07f3be4c5776)
模糊查询-范围内查询
不在范围内查询
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/12/9f6e16ce96e1b1818f887b62c1224542)
模糊查询-不在范围内查询
关于SQL查询就到这里告一段落,后面会更新相关内容。
如果你觉得有问题,欢迎和你一起探讨。
文/seayxu(简书作者)
原文链接:http://www.jianshu.com/p/eeb6a898d4ec
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
前言
SQL数据查询
语法回顾
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]… FROM <表名或视图名>[,<表名或视图名>]… [WHERE <条件表达式>] [GROUP BY <列名> [HAVING <条件表达式>]] [ORDER BY <列名> [ASC|DESC]…]
SQL查询语句的顺序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必须的,HAVING子句只能与GROUP BY搭配使用。
准备工作
1.创建数据库和数据表
2.插入基本数据
3.本文以SQL Server为例介绍
-- 创建学生表 CREATE TABLE Students( Id int NOT NULL PRIMARY KEY, Name varchar(20) NOT NULL, Class varchar(15) NOT NULL, Gender varchar(10) NULL, Age int NULL, Phone varchar(15) NULL, [Address] varchar(100) NULL ) -- 创建课程表 CREATE TABLE Courses( Id int NOT NULL PRIMARY KEY IDENTITY(1,1), Name varchar(50) NOT NULL ); -- 创建成绩表 CREATE TABLE Scores( Id int PRIMARY KEY IDENTITY(1,1), SId int NOT NULL, CId int NOT NULL, Grades decimal(5,2) NOT NULL, IsPassed bit NOT NULL ); -- 插入学生表基础数据 INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016001,'小明','一班','男',20,'18817716611','北京'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016002,'小龙','一班','男',19,'18817716622','天津'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016003,'小王','二班','男',20,'18817716633','北京'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016004,'婷婷','一班','女',17,'18817716644','济南'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016005,'张三','一班','男',19,'18817716655','北京'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016006,'小赵','一班','男',20,'18817716666','北京'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016007,'丽丽','二班','女',18,'18817716677','北京'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016008,'花花','一班','女',19,'18817716688','沈阳'); INSERT INTO Students (Id,Name,Class,Gender,Age,Phone,[Address]) VALUES(2016009,'静静','二班','女',20,'18817716699','北京'); -- 插入课程表基础数据 INSERT INTO Courses(Name) VALUES('语文'); INSERT INTO Courses(Name) VALUES('数学'); INSERT INTO Courses(Name) VALUES('英语'); -- 插入成绩表基础数据 INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,1,120,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,2,70,0); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016001,3,89,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,1,90,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,2,88,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016002,3,96,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,1,112,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016003,3,102,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,1,80,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,2,86,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016004,3,47,0); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,1,87,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,2,96,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016005,3,68,0); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,2,95,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016006,3,100,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,1,87,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,2,57,0); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016007,3,130,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,1,89,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016008,3,66,0); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,1,97,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,2,104,1); INSERT INTO Scores(SId,CId,Grades,IsPassed) VALUES(2016009,3,68,1);
简单查询
简单查询只需要
SELECT、
FROM、
WHERE3个关键字即可实现。
SELECT * FROM Students; SELECT * FROM Students WHERE Class='一班'; SELECT * FROM Students WHERE Class='一班' AND Age = 20;
简单查询结果
别名/更名
语法SELECT 字段名1 [AS] 别名 [,字段名1 AS 别名]… FROM <表名>
AS可以省略
当别名中含有非字母和下划线时或者是关键字时,需要加上单/双引号
示例
SELECT Id AS '学号',Name '姓名',Class ClassName FROM Students;
别名/更名
子查询(嵌套查询)
子查询也称嵌套查询,是指一个
SELECT查询语句可以嵌入另一个
SELECT查询语句之中。SQL中允许多级嵌套,子查询在实际使用中非常多。
连接查询:涉及两个及以上的表查询为连接查询。
--查询二班学生成绩 SELECT * FROM Scores WHERE SId IN(SELECT Id FROM Students WHERE Class='二班')
子查询
聚合函数查询
聚合函数:是一个值的集合为输入,返回单个值的函数。
SQL预定义了5个聚集函数:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(计数)。
具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数、时间聚合函数……。
SELECT AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students;
聚合函数查询
分组查询
使用
GROUP BY子句可进行分组查询
注意:分组查询的时候要在
GROUP BY子句后面跟上所有查询字段的列表
--根据班级分组查询各班平均年龄、最大 年龄、最小年龄、年龄总和、班级人数 SELECT Class,AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students GROUP BY Class;
分组查询
HAVING子句
如果需要在分组前的数据进行限制,可以使用HAVING子句
HAVING子句只能与GROUP BY搭配使用
--根据班级分组查询各班平均年龄并且班级人数大于3人 SELECT Class,AVG(Age) FROM Students GROUP BY Class HAVING COUNT(Id)>3;
HAVING子句
HAVING子句和WHERE的区别
WHERE语句在GROUP BY语句之前,SQL会在分组之前计算WHERE语句;
HAVING语句在GROUP BY语句之后,SQL会在分组之后计算HAVING语句。
模糊查询
语法SELECT 字段列表 FROM 表名 WHERE 字段 LIKE '<通配符>'
模糊查询是通过关键字
LIKE和通配符实现的
_:任何单个字符(一个'_'只匹配一个字符,多个字符就使用多个_)
%:包含零个或更多字符的任意字符串(匹配任意内容)
[]:指定范围的字符(只匹配[]内的字符)
[ ^]:不在指定范围的字符(只匹配除[]内的字符)
SQL中通配符可以混合使用
单个字符匹配
SELECT * FROM Students WHERE Name LIKE '小_'; SELECT * FROM Students WHERE Phone LIKE '188177166__';
模糊查询-单个字符匹配
任意字符匹配
SELECT * FROM Students WHERE Phone LIKE '188177166__'; SELECT * FROM Students WHERE Phone LIKE '%'; SELECT * FROM Students;
这三条SQL语句查询结果都相同只针对此表,原因是瞎猫碰上死耗子。(数据少,刚好查询的结果是全部的内容)
模糊查询-任意匹配
范围内查询
-- 查询所有手机号码结尾两位包含1和2的信息 SELECT * FROM Students WHERE Phone LIKE '188177166[12][12]';
模糊查询-范围内查询
不在范围内查询
-- 查询所有手机号码结尾两位不包含1、3、5、7的信息 SELECT * FROM Students WHERE Phone LIKE '188177166[^1357][^1357]';
模糊查询-不在范围内查询
关于SQL查询就到这里告一段落,后面会更新相关内容。
如果你觉得有问题,欢迎和你一起探讨。
文/seayxu(简书作者)
原文链接:http://www.jianshu.com/p/eeb6a898d4ec
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
- 四、数据库基本SQL语句之查询数据
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
- Linq排序、分组、模糊查询、调用外部方法、直接执行SQL语句、事务、修改数据
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
- 数据库概论(实验四2) SQL查询(排序、集函数和分组子句的应用)
- ORACLE SQL 查询数据库 数据显示的格式设置
- 数据库时间段分组查询解决方法和数据转储方法
- 2000W条数据的Oralce数据库SQL查询优化经验 - 机会总会留给有准备的人
- 2000W条数据的Oralce数据库SQL查询优化经验 - 机会总会留给有准备的人
- 2000W条数据的Oralce数据库SQL查询优化经验 - 机会总会留给有准备的人
- 2000W条数据的Oralce数据库SQL查询优化经验 - 机会总会留给有准备的人
- MySQL、MS SQL、Oracle三种数据库查询M到N行数据 分类: 数据库 2009-11-10 23:33 688人阅读 评论(0) 收藏
- SQL查询有关 sql_variant 值的基本数据类型和其他信息
- sql在不同数据库查询前几条数据
- 主流数据库之间对SQL:2003标准的不同实现方法比较(第四部分 查询结果集中间n行数据)
- sql在不同数据库查询前几条数据