SQL数据库查询基础(主讲MySQL,必要时补充了SQLServer、Access兼容性说明)

在这里插入图片描述



注,文中如无特别说明,均指 MySQL 数据库环境!


一. 逻辑运算符

1. 执行的优先级

括号 > Not(非) > And(与) > Or(或)

2. 多个 or 子句的简化写法 - IN

SELECT * FROM 数据表
 	WHERE 接单数 >= 20 
 		AND 评分 >= 4.5 
 		AND (区域 = '华东' OR 区域 = '华南' OR 区域 = '华中')
SELECT * FROM 数据表
 	WHERE 接单数 >= 20 
 		AND 评分 >= 4.5 
 		AND 区域 IN ('华东', '华南', '华中')


二. 模糊查询

通配符 与 Like

  1. % :在与Like 搭配使用时,代表 “ 任意 多个 任意 字符

    SELECT * FROM tblMembers
    	WHERE kitchen LIKE '%盒%'
    
  2. _ : 下划线(_)代表任意的 1 个字符

    SELECT * FROM person
    	WHERE uname LIKE '_峰'
    


    注意 如果需要查询的字符就是 “%” 或 “_”,写 Like 语句时,需要使用反斜线(\)对通配符转义,变为普通字符。如下所示:

    SELECT * FROM person
    	WHERE uname LIKE '%\%'
    


三. SQL语句中的计算字段

SELECT 中、WHERE 子句中、ORDER BY 字句中均中使用:
在这里插入图片描述



四. SQL 子句的执行顺序

FROM ⇒ \Rightarrow WHERE ⇒ \Rightarrow SELECT ⇒ \Rightarrow ORDER BY



五. 系统函数


1. 拼接多个字符串字段

  1. 加号(+)

    SELECT team + game as 完整名称 FROM football
    
兼容性:
1) MySQL:结果错误;
2) SQLServerAccess:结果正确;
3) Oracle:结果错误(需使用 || 代替加号‘ +’)
这也体现了不同数据库对 SQL 语言的支持不一样的特点。



  1. CONCAT 函数

    CONCAT 即拼接字符串(Concatenate)的缩写,绝大多数据库提供了该函数,实现字符串字段的拼接,如:

    SELECT CONCAT( team, '(' , game , ')' ) AS 完整队名
    	FROM football
    

    执行结果如下图所示:
    在这里插入图片描述
    注意 Oracle 数据库里只允许拼接两个字符串



  2. 其它函数

    同时,绝大部分数据库中也支持以下函数。

    兼容性:下表中列出的函数功能,不同数据库中也存在写法上的不同,如果不清楚,请查阅数据库文档,这点请注意!

    数表达式描述
    LEFT(s,x)取字符串 s 的左边 x
    RIGHT(s,x)取字符串 s 的右边 x
    LENGTH(s)LEN(s)计算 s 的长度,即字符个数或占用字节数,具体取决定数据库品牌
    TRIM(s)去掉 s 两端的空格
    UPPER(s)s 中的字母全变为 大写Access 里使用 Ucace
    LOWER(s)s 中的字母全变为 小写Access 里使用 Lcace


2. 处理日期和时间

MySQL、SQLServer 等常见数据库中都有名为 DATETIME 的类型,可以保存 “ 日期 + 时间 ” 形式的完整时间数据。

有这样一张 打赏收入 表,其中 打赏时间到帐时间 字段中保存的都是DATETIME类型的数据。
在这里插入图片描述

SELECT * FROM 打赏收入 WHERE 打赏时间 = '2020-09-04 15:19:53'
SELECT * FROM 打赏收入 WHERE 打赏时间 = '2020/09/04 15:19:53'

虽然下面这句中表示时间的字符串与数据库中保存的时间格式不一致,但它们都能得到正确的结果。

原因在于 MySQL 认为用 “_” 隔开的年月日,和用 “ / ” 隔开的年月日,都是合法的日期表示方法。

SELECT * FROM 打赏收入 WHERE 打赏时间 = '2020-09-04'

特别注意: 对于 DATETIME 类型,如果只写日期如 2020-09-04,则默认为该日零点零分零秒: 2020-09-04 00:00:00



  1. between … and

    以查找 9 月份的交易记录为例:

    SELECT * FROM 打赏收入
    WHERE 打赏时间 BETWEEN '2020-09-01 0:0:0' AND '2020-09-30 23:59:59'
    

    等价于

    SELECT * FROM 打赏收入
    WHERE 打赏时间 >= '2020-09-01 0:0:0' AND 打赏时间 < '2020-10-01 0:0:0'
    

    注意,between ... and 是一个 闭区间,包含了 起点终点

  2. DATE 函数

    SELECT * FROM 打赏收入
    	WHERE DATE(打赏时间) = '2020-09-03'
    

    注意:DATE函数比前面使用 >=<between... and 等等,在执行时间上,更长一些(效率更低)。

    MySQL 常用时间函数

    函数描述
    DATE(d)取得 d 代表的日期,忽略秒、分、时
    YEAR(d)从日期 d 取得年份数字
    MONTH(d)取得 d 的月份数字
    DAY(d)取得 d 的日数字
    HOUR(d)从日期 d 取得小时数字
    MINUTE(d)d 取得分钟数字
    SECOND(d)从日期 d 取得秒数
    DATEDIFF(d1,d2)计算 d1d2 相差多少天

    注意:除DATE函数外,其余的都是返回数字,如MONTH('2020-09-01 0:0:0')返回值是 数字 9,比较运算时不要打引号。



3. 聚集函数

这里重点讲解 Count 函数,其它函数略。

各种 聚集函数 的结果只可能是 一个 数字,所以最终查询结果中,只有 一条 记录。

在这里插入图片描述

SELECT count(*) FROM income

count(*):所有记录都被纳入统计。因为没有指定具体的字段名,所以记录中只要有一个字段中不存在Null,就符合 count(*) 的筛选条件

说明: 即假如要统计某个表中所有记录的个数,而 其中“某字段” 中存在Null 值,count(“某字段”),其结果则为表中总行数减去有Null值的行数(Null值不计入统计

所有聚集函数中,除 COUNT(*),均忽略null

根据 SQL标准,聚集函数 应该与普通字段 同时 出现在 SELECT 中, 除非 该字段用于 分组(MySQL没有严格执行规定,所以即使写错语句也不会报错,应 谨慎 使用)

应用举例:

  • 删除重复后统计记录数
    SELECT COUNT(distinct funs_id) FROM income
    



六. Group By - 分组查询

GROUP BY 字段等。按照指定字段(或计算字段、函数等)对记录进行分组。如果分组时发现 NULL值,则 NULL 的记录单列一组。

可以使用聚集函数,对每一组数据分别进行统计。

SELECT funs_id , SUM(money) FROM income GROUP BY funs_id

如图:
在这里插入图片描述

起个别名,再加一个排序:

SELECT funs_id , SUM(money) AS 打赏总额
	FROM income GROUP BY funs_id
	ORDER BY 打赏总额 DESC

语句执行结果:
在这里插入图片描述
注意各子句间的先后次序(顺序绝对不能搞错):

SELECT ⇒ \Rightarrow FROM ⇒ \Rightarrow WHERE ⇒ \Rightarrow GROUP BY ⇒ \Rightarrow ORDER BY

此外,MySQL相比 SQLServer、Oracle 等数据库,特殊的地方在于:

  1. 允许 Group By 中使用 别名
  2. 允许 SELECT 中使用与 分组无关 的字段。


标准 SQL 语法
如果使用了 GROUP BY,则 SELECT 子句中只能出现 GROUP BY 后面的字段,或 聚集函数。

MySQL 进行了特别设计,因而不受此规则限制。

动画演示: GROUP BY 分组统计
在这里插入图片描述

分组查询的注意事项:

  1. WHERE子句必须写在GROUP BY子句之前;
  2. WHERE子句中 不允许 使用 聚集统计函数
  3. 分组后使用 HAVING 筛选分组,而不是WHERE


七. Having 子句


HAVING 子句:对分组后的数据进行过滤,分组后选出符合条件的组。

HAVING 的用法和 WHERE 用法类似。区别在于 HAVING 子句必须写在 GROUP BY 分组之后,执行顺序也在分组之后,HAVING 可以使用聚合函数。

例如:

select date(pay_time) as 日期, sum(money) as 总额
    from income
    where gift_level = '玫瑰'
    group by date(pay_time)
    having sum(money) > 500

以上语句对分组后每一组的总金额进行过滤,保留大于500的组。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

←か淡定☆ ヾ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值