mysql之select

本文详细介绍了SQL查询语句的各个组成部分,包括字段表达式、FROM子句、WHERE子句等八个子句的功能与用法,并讲解了子查询、连接查询的概念及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

格式:SELECT [选项子句]  字段表达式子句   [FROM子句]   [WHERE子句]  [GROUP BY子句]  [HAVING子句]  [ORDER BY子句]  [LIMIT子句]

一共是8个子句,有[]表示是可以省略的

提示:8个子句的顺序是固定的,不允许颠倒

字段表达式子句

它的作用是指定查询出哪些内容

*表示查询出表中所有的字段

还可以使用函数及运算禾符

还可以使用as关键字给字段起别名(as关键字可以省略)


FROM子句

此子句作用主要是指定查询的数据源

除了指定一个数据表作为数据源外,还可以指定多个数据表作为数据源

数据源中的数据表也可以使用AS关键字给它起别名(AS关键可以省略)


WHERE子句

此子句的作用主要是进行设定查询条件以筛选数据

比较运算符

>

>=

<

<=

=

!= <> 


逻辑运算符

&& and

||  or

!   not

xor


like

可以使用通配符%_来匹配

这种也叫模糊查询。模糊查询的效率很低的!

Innot in


再使用not in


发现了一个奇怪的问题,就是数据为null的记录没有出现在查询结果中

原因:null是一种特殊的数据,不会参与普通的比较

     Null数据也不会出现在索引中

Where 1的用法

就是在使用条件查询时,可以把条件表达式写一个1或者true,要把1或true认为是一个表达式。表示式的结果为真的。


Where 1后面可以跟任意个表达式,这个1不会影响后面表达式的运算结果。这是一个技巧。

GROUP BY子句

Group by是用于where条件查询后的数据进行分组 统计用的。

比如我们想知道学生男女各有多少人,就可以使用group by来做

分组的目的在于统计


group by后面出现的字段,应该写到字段表达式位置,而且它的值不会出现重复的,不同的值只会出现一次。

在字段表达式处,需要使用分组函数来配合。

统计函数

Count() 用于计算总数

Avg() 用于计算平均数

Sum() 用于计算和

Max() 用于计算最大值

Min() 用于计算最小值


提示:使用count()分组函数时如果用的不是*使用的是某个字段,则要关注一下此字段中数据有无null值,有null的记录不会计算在总数中的

可以使用多个字段进行分组


HAVING子句

此子句是用于对使用了wheregroup by之后的结果进行再次的筛选


如果查询语句中,没有where和group by子句,能不能使用having?

答案是可以。


但是要注意:此处的HAVING不是where!也不能代替where

ORDER BY子句

此子句主要用于对查询结果进行排序

ASC 正序 字段后省略不写时,默认是asc

DESC 倒序

这两个用在字段后面


还可以使用多个进行排序。

当第一个排序后,有相同内容的记录时,将使用第2个字段进行排序


提示:

使用一个字段进行排序时,如果有相同顺序(指排序字段)的记录时,它会按照主键的正序进行第二排序。

LIMIT子句

此子句主要用于分页

格式1:limit 起始记录位置,每页的条数  起始位置是从0开始的


格式2:limit 条数  注:相当于起始位置是第一条数据


选项子句

用于修饰整个查询的结果是否允许有重复数据

有两个参数

All  是默认参数,不写时就是all

Distinct 不能有重复记录


子查询,subquery

当一个查询语句出现在另一个查询语句中时,则称为子查询。

为什么要使用子查询

我们有一个学生信息表,相查出年龄最大的学生

因为不知道到底有几个学生是年龄最大,加大limit数量的方法也不好,只能用别的办法

方法就是使用子查询

相当于先用一条查询语句查到一个结果


因为不知道到底有几个学生是年龄最大,加大limit数量的方法也不好,只能用别的办法

方法就是使用子查询

相当于先用一条查询语句查到一个结果


结论:当一句sql查询语句无法得到结果时,可以使用子查询来辅助得到结果

子查询分类

子查询语句可以出现在另一个查询语句中,能够出现在哪些位置上?返回结果的情况是什么?

根据位置

FROM型子查询:子查询语句出现在FROM子句中,作为临时数据源

WHERE型子查询:子查询语句出现在WHERE子句中,作为条件

 

根据子查询返回结果

标量子查询:返回一行一列的记录

列子查询:返回多行一列的记录

行子查询:返回一行多列的记录

表子查询:返回多行多列的记录

FROM型子查询


注:子查询必须放在括号中

From子查询的结果作为临时数据源可以用AS起别名

WHERE型子查询


连接查询,join

当我们想获取学生信息+其班级信息时,从一个表是无法做到的。

此是就需要使用一种叫连接查询的方式,把信息全部取到。

如第1个表studentinfo有5个字段

第2个表classinfo有3个字段

连接以后的新结果集是5+3=8的字段

相当于把表加宽了。

连接查询必须是有多个表的情况下

连接查询有哪些方式?

Innerjoin 内连接

Left|rightOuter join 外连接(左外连接,右外连接)

Crossjoin交叉连接

Naturaljoin 自然连接

内连接和交叉连接

Select * from table1 inner join table2

在内连接不加连接条件时,会形成一个笛卡尔积


上面不加连接条件就是cross join一样(截图省略)

上面不加连接也和:Select * from table1,table2 结果一样也是28条记录

不加连接条件时,省略inner或cross结果也一样


下面看内连接下加连接条件的情况(连接条件使用on关键字

Select * fromtable1 inner join table2 on 连接条件

有连接条件的内连接会返回所有成功连接的记录,不会有连接失败的记录。


外连接

外连接才是数据查询中主要使用的方式,必须熟练掌握

外连接分为:

Left [outer] join :左外连接,以左表为主,左表的数据将全部出现在结果中,包括和右表连接失败的记录,这些失败记录的右表部分用null补齐

Right [outer] join :右外连接,以右表为主,右表的数据将全部出现在结果中,连接失败的左表部分用null补齐


左外连接时右表的情况:

1. 右表中并不是所有记录都会出现(只有符合连接条件的才出现)

2. 右表中的记录有重复出现的情况

3. 右表中没有满足左表条件的记录时,用null补齐

再右外连接的表现


可以看到,现在是右表为主了

1. 左表不符合条件的记录没出现

2. 左表没有与右表连接的合适记录则补NULL

3. 右表的记录全部会出现

左外还是右外,是相对来看,一般我们都习惯左外连接,就是把主要的表放在左边。

提示:外连接必须要有连接条件,不能省略

总结:在这些连接方式中,是重要和最多使用的是left join
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值