🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注
select查询语句介绍 🏍️
select语句
是我们在数据库的DML
操作中使用最频繁的,也是最常见的操作, 查询操作直接关系到你开发的项目!
项目写得好不好,数据优化的怎么样,等等, 这都跟select
查询有关系, 总之查询写得好不好直接关系到项目的质量!
我们通过SQL语法
从表中把我们所需要的数据查询
高效出来的过程,这就是select语句
要干的事情!
可以说select语句
是SQL
中最基本且功能强大的语句, 下面我来详细说明一下 select
语句的语法,并且通过一些通俗易懂的案例来展示其用法, 同时绍一些 select语句
的妙用, 不要走开哦,继续往下看~~干货满满! 🤪🤪🤪
数据准备 🗽
在我们正式学习select语句
之前,我个人建议最好有一些测试数据,来帮助我们理解select语句
,这里我给大家贴心准备了一个数据表和一些测试数据供大家使用,
测试表结构如下
CREATE TABLE Persons(
pid int PRIMARY KEY IDENTITY, --用户id
pName VARCHAR(255) NOT NULL, --用户名称
pAge TINYINT NOT NULL, --用户年龄
pAddr VARCHAR(255) NOT NULL, --用户地址
pSex bit NOT NULL, --用户性别
pScore TINYINT NOT NULL, --用户得分
pEmail VARCHAR(255) NOT NULL, --用户电子邮箱
pLevel TINYINT NOT NULL, --用户等级
pAddTime DATETIME NOT NULL, --用户添加时间
)
我们可以在查询分析器中去执行一下!
如图
效果如下
插入一些测试数据
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('赵家货',35,'上海',1,68,'zhaojiahuo@163.com',5,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('杨洋',28,'北京',0,80,'yangyang@163.com',5,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('文强',20,'上海',1,90,'wenqiang@163.com',6,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('罗镖',40,'江苏',1,60,'luobiao@163.com',7,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('李豪强',36,'广东',1,18,'lihaoqiang@163.com',8,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('刘佳佳',22,'重庆',0,95,'liujiajia@163.com',1,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('罗宾汉',40,'四川',1,80,'luobinhan@163.com',2,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('王佳燕',30,'重庆',0,70,'wangjiayan@163.com',3,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('刘晓明',35,'贵州',1,75,'liuxiaoming@163.com',4,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('王小华',18,'浙江',0,65,'wangxiaohua@163.com',5,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('赵家货',50,'北京',1,80,'zhaojiahuo@163.com',2,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('张文军',69,'云南',1,86,'zhangwenjun@163.com',5,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('罗敏',39,'上海',0,88,'luomin@163.com',2,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('刘婷',22,'湖南',0,82,'liuting@163.com',2,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('刘晓亚',32,'重庆',0,79,'liuxiaoya@163.com',3,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('王建军',40,'江西',1,75,'wangjianjun@163.com',3,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('谢涛',42,'陕西',1,89,'xietao@163.com',2,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('张良',32,'陕西',1,98,'zhangliang@163.com',1,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('李民',56,'贵州',1,56,'limin@163.com',9,GETDATE());
insert into Persons(pName,pAge,pAddr,pSex,pScore,pEmail,pLevel,pAddTime)
values('赵晓丽',38,'浙江',0,59,'zhaoxiaoli@163.com',8,GETDATE());
如图
注意:
日期和时间我们这里通常通过内置的 GETDATE() 函数
来获取当前的日期和时间进行插入即可~
当然你也可以自行输入让日期值各有差异,便于测试!
效果如下
select查询方式的分类 🗺️
在刚刚开始学习select语句
的时候,这里我大致简单的把查询方式分成两种~
一种是单表查询
另外一种就是两表或者说多表查询
在刚刚开始学习的时候,大家最好先把单表查询
学习好, 然后我们在学习多表查询!
select 基本查询 🔋
1. 查询数据表中的所有数据记录
SQL如下
select * from 表名称
这里的*
号就代表所有字段的通配符!
举个栗子
select * from Persons;
如图
2. 指定查询表中某些字段
SQL如下
select 字段1,字段2,.... from 表名称
举个栗子
select pName,pAge from Persons;
如图
3.定义查询别名
我们在查询的时候,可以给定一个别名, 也就是说在一个表达式
后面用 as 关键字
(不区分大小写) 让这个表达式有名字,而这个别名
会替换查询结果的名字!
举个栗子
select 1+1 as '结果';
如图
我们来试试查一下具体的表字段,然后定义一下别名
如下
select pName as '用户名', pAge as '年龄' from Persons;
如图
有了别名之后,这样显示 是不是更加直观了!
4.表达式查询
注意: select语句
后面是可以直接跟常数或者表达式的!
而查询结果就是计算表达式的结果, 也就是说select语句
后也可跟运算表达式
,查询到的结果就是运算结果
, 然后你也可以定义一个别名~,方便查看!
比如: 上面我们说的直接计算数字的结果, select 100 + 100
这种表达式
如图
你也可以让字段
和字段
之间直接进行计算,并且得出结果!
例如
select pAge + pLevel from Persons;
5.数据去重复查询
在表中,可能会包含重复值
, 我们在查询的时候可以给字段
加上distinct关键字
来进行过滤查询!
举个栗子
我们要查询用户名
,并且不重复的数据!
SQL如下
select distinct pName from Persons;
如图
5.top查询
所谓top查询
就是在字段
的前面
加top n
,就能从结果集
中提取前n条数据
,注意n
必须是大于0
的整数!
举个栗子
我们现在要提取Persons
表中的前3条数据记录的所有信息!
select top 3 * from Persons;
如图
6.排序查询 order by
有的时候,我们需要将查询出来的结果进行排序整理,让结果看起来更加直观,这时候我们就要使用到排序!
排序查询我们需要使用到一个关键字order by
语法规则
select * from 表名称 order by 字段[asc/desc];
order by
语句默认按照升序
对记录进行排序, 如果您希望按照降序对记录进行排序,可以使用 desc关键字
注意:
如果排序的列是字符类型,则按字母大小进行排序, 并且在升序排序的时候,asc关键字
是可以省略的!
举个栗子
我们按照年龄从大到小进行排序显示Persons
表的所有记录
select * from Persons order by pAge desc;
如图
select 条件查询 🛹
我们查询不能光是这样查数据,肯定在实际开发中会根据各种各样的条件进行查询数据记录!
那么条件查询主要就是先要使用到where关键字
, 具体语法如下:
SELECT 字段/* FROM 表名称 where…条件
那么这个where条件
该怎么去写呢, 这就非常灵活了,所以查询不是死的,而是根据我们的具体想法和需求进行查询数据的!
比如:
查询用户年龄大于30岁的
select pName from Persons where pAge>30
如图
所以这里的条件有一定讲究, where关键字
后面一般都是跟条件表达式
,用来过滤
查询结果!
如果where关键字
后跟的表达式
为真
,那么将会查询到相应的结果集!
1.条件运算符
条件运算符
是我们在执行select语句
的时候,必须要使用到的运算符!
基本上是搭配where子句
使用, 可以在where子句
中出现的条件运算
符有如下表:
如下
操作符 | 描述 |
---|---|
> | 大小 |
< | 小于 |
= | 等于 |
<> | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
Between…and | 在…之间 |
Not Between…and | 不在…之间 |
like | 模糊匹配 |
Not like | 与like相反 |
in | 指定值列表 |
Not in | 与in相反 |
and | 和 |
or | 或 |
注意:>=、<=、>、< 等不一定只用于数字比较。如果是字符串比较时,就比较字母的大小
比较运算
举例说明
查询等级小于5的用户
select * from Persons where pLevel < 5;
至于其他的等于、不等于 、大于等于、小于等于
这跟我们数学里面的含义差不多,大家可以去试试看各个字段!
这里就不过多演示了,主要我们重点放在下面几种运算符!
Between…and 区间查询
比如我们现在要查询年龄在30 ~~ 40
之间的人就要用到这个关键字!
select * from Persons where pAge between 30 and 40;
如图
between…and
其实你可以看出来是表示两个数之间
,并且这个两个数都同时被包含
其中!
那么如果想查询相反的结果可以加not
关键字
例如
select * from Persons where pAge not between 30 and 40;
如图
and 运算符
这个运算符可以用来连接多个条件,并且都要成立才能查询出结果,存在并且的意思!
and运算
的核心在于如果第一个条件和第二个条件都成立
那么才能出想要的结果!
举个栗子
跟刚刚上面一样我们现在要查询年龄在30 ~~ 40
之间的人, 用and
来实现一下!
select * from Persons where pAge >= 30 and pAge <= 40;
你也可以对比一下between..and
的结果看看是不是一样!
如图
但是如果我们要相反方向查询,还是要借助一下not关键字
, 并且这里要打一个括号~
select * from Persons where not (pAge >= 30 and pAge <= 40);
如图
or 运算符
AND
和 OR
可在 WHERE 子句
中都可以把两个
或多个条件
结合起来进行查询!
那么or运算符
的核心理念就在于, 如果第一个条件
和第二个条件
中只要有一个成立,那就可以查询出相应的结果!
举个栗子
我们现在要查询一下Persons
表中地址是重庆
或者上海
的所有用户!
如下
select * from Persons where pAddr='重庆' or pAddr='上海';
如图
同理,假设我们要查询不是重庆和上海的其他所有用户呢?该怎么办?想一想?
是不是也可以使用not关键字
来完成呢?
我们来试试看!
select * from Persons where not (pAddr='重庆' or pAddr='上海');
如图
and 和 or 运算符混用
根据实际的查询需求,我们其实可以把and
和 or
运算符进行混合使用!
举个栗子
现在我们要查询Persons
表中地区重庆
和广东
的用户都可以, 但是年龄要在30岁以上,包含30岁!
如下
select * from Persons where (pAddr='重庆' or pAddr='广东') and pAge>=30;
如图
2.Like模糊匹配查询
如果你看过我之前的正则表达式
教程, 那么你肯定对模糊查询不会感到陌生~
所谓Like模糊查询
其实也是对字符串
的一种处理,跟正则表达式
很类似!
根据一种模糊不清的方式,来对我们要查询的信息进行过滤和筛选!
简单的说就是指不明确指定的查询方式!
语法规则
SELECT 字段名称/* FROM 表名称 where…like…
通配符
Like
查询的时候,我们通常都需要加上一些通配符,来辅助我们查询!
如下
通配符 | 说明 |
---|---|
% | 代表0个以上的字符 |
_ | 代表一个字符 |
那么我们现在就来把这些通配符
和like
查询结合一下看看效果吧~
通配符 % 的使用
它可以代表0个
或者多个以上的字符串!
比如:现在我们希望从Persons表
中查询用户名以 赵
开始的人信息!
如下
select * from Persons where pName like '赵%';
如图
比如:现在我们希望从Persons表
中查询地址以 西
结尾的人信息!
如下
select * from Persons where pAddr like '%西';
如图
比如:现在我们希望从Persons表
用户名中包含 佳
的人信息!
如下
select * from Persons where pName like '%佳%';
如图
通配符 _ 的使用
这个_
下划线,可以代表一个字符!
举个栗子
比如: 现在我们要查询Persons表
中姓名为刘
开头的,后面跟两个字符的用户姓名信息!
如下
select * from Persons where pName like '刘__';
如图
3. in 包含查询
in关键字
允许我们在 where子句
中规定多个值, 这种查询在必要的时候非常有用!
语法规则
SELECT 字段/* FROM 表名称 WHERE 字段 IN (value1,value2,...)
举个栗子
我现在要查询包含重庆、广东、上海
用户的所有信息!
如下
select * from Persons where pAddr in ('重庆','广东','上海');
如图
聚合函数 🍋
聚合函数
的使用也是非常重要的,在我们查询的时候,需要一些聚合函数
来帮助我们进行计算和统计!
聚合函数
主要用于数值字段执行计算,并返回单个值作为结果。
这些聚合函数在数据分析、报告生成
以及业务智能分析
中发挥着关键作用
常见的聚合函数
有如下表:
函数名 | 函数说明 |
---|---|
SUM | 求和 |
MIN | 求最小值 |
MAX | 求最大值 |
COUNT(*) | 选择选定的行数(记录数) |
AVG | 求平均数 |
SUM求和函数
SUM函数
可以返回数值字段的总和, 通常用来计算金额!
举个栗子
比如我们现在要计算Persons表
中所有人的分数之和!
如下
select sum(pScore) as '总和' from Persons;
如图
当然聚合函数
不会这样单独去使用,通常都是结合我们条件查询一起使用才有意义!
MAX最大值 和 MIN最小值 函数
这两个聚合函数,可以帮助我们把数值字段的最大值,和最小值提取出来!
举个栗子
比如我们现在要查询Persons
表中年龄最大和最小的两个用户信息!
如下
select * from Persons where pAge=(select max(pAge) from Persons)
union
select * from Persons where pAge=(select min(pAge) from Persons)
如图
这里我们就使用了MAX 和 MIN
这两个聚合函数,来计算最大年龄和最小年龄值
其中还使用了联合查询union
和子查询,这个不明白也没关系,马上下面会讲到!
COUNT 统计函数
COUNT() 函数
主要用于返回指定条件的行数, 但是NULL
不会计算在内!
举个栗子
比如我们要查询Persons
表中一共有多少个城市?
如下
select count(pAddr) as '城市数量' from Persons
如图
但是如果这样查询,结果明显不正确,因为城市是有重复数据的!
我们可以结合一下distinct
来一起查询
如下
select count(distinct pAddr) as '城市数量' from Persons
如图
AVG求平均数
AVG 函数
可以用来计算数值字段的平均值
, 并且NULL 值
不会包括在计算中!
举个栗子
比如计算所有人的平均年龄是多少!~
如下
select avg(pAge) as '平均年龄' from Persons
如图
小结
聚合函数
能够从数据记录中提取有用的统计信息, 这些统计信息对于了解数据记录
的整体特征、制定决策以及进行业务分析
至关重要, 通过使用聚合函数,我们可以轻松地计算出大量数据的统计信息,而无需手动进行繁琐的计算!
分组查询group by 🍏
有的时候我们需要把数据进行分组处理
,
比如说, 一个班级的学生,有时我们可能会按照性别
进行分组
。
一个学校的学生,我们可以按照年级
进行分组等等!!
分组查询的重点就在于分组要有依据
,
例如
国家的省份,如果你在查询的时候按照省份
进行分组查询,这样查询实际没有任何意义,这种情况的分组跟不分组查询没有区别,因为省份本来就不可能出现重复,那么你归类的时候,本来有多少省份,最终你就会分出多少个组, 明白这个道理吧!!
分组查询
是刚刚开始接触查询新手的一大痛点, 不过也不同过于担心,分组查询
只要你多加练习,一定能掌握其中的精髓!
举个栗子
现在有一个employees
表:
问题: 查询每个部门员工的平均年龄?
那么这个时候,你就要从问题中招答案,找到分组的依据是什么!
问题分析
这里很明显我们要以部门进行分组, 然后统计平均年龄, 因为存在多个员工在一个部门的情况,所以我们要对部门进行分组。
SQL如下
select company, avg(age) as '平均年龄' from employees group by company
结果如下
所以其实group by
要以某某为分组的依据对数据进行查询, 它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理!
再举个例子
比如我们现在要查询Persons表
中男女分别的平均年龄是多少!
如下
select pSex as '性别', avg(pAge) as '平均年龄' from Persons group by pSex
如图
having子句的使用
我们在说having
之前,先看一个案例
比如说我们现在要查询Persons
表中的数据,查询平均年龄大于30的城市有哪些~该怎么查询?
那么此时你可能会想到以下写法
如下
select pAddr from Persons where avg(pAge)>30 group by pAddr;
如图
这样写会报错,因为在我们的SQL Server 2000
中聚合函数
不能出现在where子句
中, 那么应该怎么办呢?
这时候having
就有用了, 它就和where子句
一样,也是条件判断,只不过它可以接受聚合函数
也就是说它是一个条件过滤语句,跟where
一样,并且通常与group by
一起使用!
如果两者要对比的话,那就是如下所示:
WHERE 子句
:在数据分组之前使用,用于过滤原始数据行。
HAVING 子句
:在数据分组之后使用,用于过滤分组后的结果,可以包含聚合函数!
那么刚刚我们查询的从用户表中查询平均年龄大于30的城市应该如下写
select pAddr as '城市',avg(pAge) as '平均年龄' from Persons group by pAddr having avg(pAge)>30;
如图
注意:
聚合函数
不应出现在 WHERE 子句
中,除非该聚合函数
位于 HAVING 子句
或者 选择字段表所包含在子查询
中,并且要对其进行聚合运算
的字段是外部引用!
关键字顺序
那么现在就要问了,学了一些关键字,它们的顺序是什么?
当where、group by、having、order by
在同一条查询语句
中出现的时候,他们的一个正常顺序如下
where、group by、having、order by
举个栗子
查询的从Persons
用户表中查询平均年龄大于30的城市, 并且这个等级为大于3的,平均年龄从大到小进行显示!
如下
select pAddr as '城市',avg(pAge) as '平均年龄'from Persons
where pLevel>3
group by pAddr
having avg(pAge)>30
order by avg(pAge) desc
如图
select 子查询 🍇
说到子查询
的话,这种查询的使用场景也很多!
所谓子查询
就是一个select语句
定义在另一个select、insert、update
或delete
语句中,或定义在另一个子查询
中。
子查询
通常用于返回一个值
或一组值
,这些值将被主查询
用来执行比较
或作为数据条件
!
子查询
的核心概念也就是把一个查询的结果作为另一个查询的条件, 查询中套用查询!
子查询的分类
子查询
通常分为两种: 单行子查询
和 多行子查询
单行子查询
指的就是子查询
会返回单个值
,通常用于where子句
中进行比较!
多行子查询
指的就是子查询
会返回一组值
, 通常与IN、ANY或ALL
这些关键字一起使用!
举个栗子
我们先来体验一下什么叫子查询
比如说现在有一个需求, 我们要查询Persons
表, 要求查询分数高于重庆最低分的所有用户!
如下
--首先查询重庆得分最低分,然后用这个条件让主查询判断分数, 高于重庆最低分的所有用户
select * from Persons where pScore>(select min(pScore) from Persons where pAddr='重庆' )
如图
这就是子查询
!
再举个例子
比如我们现在要查询分数超过85的所有用户信息
SQL如下
select * from Persons where pid in (select pid from Persons where pScore> 85);
如图
当然这个问题,我们不用子查询,也可以轻松解决,这里只是举例说明, 仅供参考!
总之 子查询
可以嵌套,嵌套多少层
完全是根据查询条件
和具体项目需求来确定!
我们在后面的实际项目开发中还会使用到子查询!
select … into …的妙用 🌰
这种语句可以有效的帮助我们快速的备份数据到一个新的数据表中!
语法规则
select [字段/*/关键字] into new_table from old_table
注意: 要求目标表new_table不存在
举个栗子
我们现在要把Persons表
中的全部字段和数据复制到一张stu新表中
如下
select * into stu_backup from Persons;
如图
数据完全一模一样!
如图
当然你也可以选择指定的字段,进行复制和拷贝!
这其实跟我们之前讲过的 insert…into…语句
有点类似,但是区别如下:
insert..into..语句
要求必须目标表名
要存在!
select ..into..语句
是可以自动生成表结构的!
最后 👋
对于select语句
的基本操作,和单表查询
差不多也就是这些了,熟练的先掌握它们对后面学习多表查询
和联表查询
有很大帮助!
最后祝大家 1024程序员节快乐啊...
明天继续更新select语句
多表查询!..
各位先吃饭了~~ 😛😛😛
"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚
好玩 好用 好看
的干货教程可以
点击下方关注❤️
微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇