【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 select语句数据查询操作详解 今天干货满满!《1024特别篇》

🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注

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 运算符

ANDOR 可在 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 表名称 wherelike
通配符

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在同一条查询语句中出现的时候,他们的一个正常顺序如下

 wheregroup byhavingorder 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、updatedelete语句中,或定义在另一个子查询中。

子查询通常用于返回一个值一组值,这些值将被主查询用来执行比较或作为数据条件!

子查询的核心概念也就是把一个查询的结果作为另一个查询的条件, 查询中套用查询!

子查询的分类

子查询 通常分为两种: 单行子查询多行子查询

单行子查询指的就是子查询会返回单个值,通常用于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语句多表查询!..

各位先吃饭了~~ 😛😛😛

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多 好玩 好用 好看的干货教程可以 点击下方关注❤️ 微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇