7.SQL_数据查询语言DQL

本文详细介绍了SQL查询的各种操作,包括DQL的基础查询、条件查询、模糊查询、字段控制、去除重复记录、数据运算、处理NULL值、结果集排序、聚合函数运用、分组查询及HAVING子句的使用。通过Navicat工具进行了实际操作演示,如利用LIKE进行部分匹配,使用DISTINCT去除重复,运用GROUP_CONCAT组合字段,以及LIMIT进行分页查询。文章强调了遇到问题时的解决策略,即冷静思考和尝试,展示了SQL在数据查询中的强大功能。

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

SQL虚拟结果集

查表

SELECT * from 表名;

在这里插入图片描述在这里插入图片描述
查询的结果是虚拟表,并不会被储存。

在这里遇到了无法解决的问题

[SQL]SELECT * from students;#查询students表

[Err] 1146 - Table ‘my_test.students;’ doesn’t exist

最后发现是因为搜索没有保存的缘故,保存以后再点运行才可以。
果然,遇到问题一时无法解决不要紧,放两天再想没准可以一下就解决。
在这里插入图片描述

查列

SELECT 列名1,列名2…… from 表名; 

在这里插入图片描述

SQL条件查询

跟之前讲的一样,加一些 WHERE关键字就可以

关键字应用
= != <>(不等于) < >基本运算符
BETWEEN…AND;值的范围
IN(set);查询固定范围的值
IS NULL; IS NOT NULL;空 非空
AND
OR
NOT

SQL条件查询练习

添加列

Navicat操作

在这里插入图片描述
做如下修改:
在这里插入图片描述
在这里插入图片描述

查询

SELECT * from students WHERE gender='男' AND age=20;

在这里插入图片描述

-- 查询学号记录
# select * from students where id=1001 or id=1002 or id=1003;
select * from students where id in(1001,1002,1003);

在这里插入图片描述

其余同理,不再赘述。

SQL模糊查询

  • 根据指定的关键字进行查询
  • 使用LIKE关键字后跟通配符
  • 通配符:“_”–任意一个字母;“%”–任意0~n个字母。
-- 查询姓名由三个字符构成的学生记录
select * from students where name like '___'; # 三个"_" 
-- 查询姓名由三个字符构成且最后一个字母是s
select * from students where name like '___s';
-- 查询姓名以m开头
select * from students where name like 'm%';# '%'表示不限字符个数
-- 查询姓名包含s
select * from students where name like '%s%';

字段控制查询

去除重复记录

SELECT DISTINCT name FROM students;

DISTINCT命令可以对表的相应列去重

把查询字段的结果进行运算

要求相应字段必须是数据型。

SELECT *, age+score FROM sutdents; # *表示新生成的一列

处理NULL

SELECT *,IFNULL(age,0) + IFNULL(score,0) FROM students;

IFNULL(name,number)如果’name’列为空,则赋值为0

对查询结果起别名

SELECT *,IFNULL(age,0) + IFNULL(score,0) AS total FROM students;

AS后边加新名称即可

SELECT name AS mingzi FROM sutdents;

SQL数据的导入及排序 ORDER BY

数据的导入导出

可直接用Navicat实现
也可以用查询语句,先创建表再插入语句

数据排序

升序ASC从小到大,默认
降序DESC从大到小
SELECT * FROM employee ORDER BY salary;# 升序
SELECT * FROM employee ORDER BY salary ASC;# 升序
SELECT * FROM employee ORDER BY salary DESC;# 降序
-- 多个条件
SELECT * FROM employee ORDER BY salary DESC,id DESC;# 降序

SQL聚合函数

函数功能
COUNT统计指定列不为NULL的记录行数
MAX计算指定列的最大值,如果指定列是字符串类型,则使用字符串排序运算
MIN计算指定列的最小值,如果指定列是字符串类型,则使用字符串排序运算
SUM计算指定列的数值和,如果指定列类型不是数值类型,则计算结果为0
AVG计算指定列的平均值,如果指定列类型不是数值类型,则计算结果为0

COUNT

SELECT * FROM employee; # 查询所有字段
SELECT COUNT(*) FROM employee; # 查询非NULL记录总数
-- 加点条件
SELECT COUNT(*) FROM employee WHERE IFNULL(salary,0)+IFNULL(performance,0)>5000;

SUM AVG

SELECT SUM(salary) FROM employee;
SELECT AVG(salary) FROM employee;

MIN MAX

SELECT MIN(salary) FROM employee;
SELECT MAX(salary) FROM employee;

SQL分组查询

  • 分组查询:将查询结果按照1个或多个字段进行分组,字段相同的为一组。

比如根据gender分组

SELECT gender FROM employee GROUP BY gender;

GROUP BY 单独使用时只显示每组第一条数据,故单独使用价值不大。

SELECT department,GROUP_CONCAT(name) FROM employee GROUP BY department;

SQL分组_group_concat()

  • group_concat(字段名)可以作为一个输出字段来使用
  • 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
  • 注意,使用分组时,select 后面直接跟的字段一般都出现在 group by 之后
SELECT gender,GROUP_CONCAT(name) FROM employee GROUP BY gender;

SQL分组_聚合函数

我们既然可以用group_concat统计出每个分组某字段的值的集合,则我们也可以通过集合函数来对这个“值的集合”做一些操作。

-- 先分组,再查询部门名称,然后计算每一组的薪资总和
SELECT department,GROUP_CONCAT(salary),SUM(salary) FROM employee GROUP BY department;
SELECT name,salary FROM employee WHERE salary>1500 GROUP BY department;

SQL分组_having

-- 查询工资总和大于9000的所有部门
SELECT department,GROUP_CONCAT(salary),SUM(SALARY) FROM employee # 查询数据、计算数据
GROUP BY department # 分组
HAVING SUM(SALARY)>=9000; # 筛选

where和having的区别

wherehaving
数据过滤在分组前对数据进行过滤在分组后对数据进行过滤
分组函数后面不可以使用分组函数后面可以使用分组函数(过滤函数)
若某行记录不满足WHERE子句的条件,则该行记录不参加分组对分组后数据进行约束
SELECT department,GROUP_CONCAT(salary),SUM(salary) FROM employee 
WHERE salary>2000
GROUP BY department
HAVING SUM(salary)>9000
ORDER BY SUM(salary) DESC;

SQL查询语句书写顺序(了解)

书写顺序
select -> from -> where -> group by -> having -> order by -> limit
执行顺序
from -> where -> group by -> having -> select -> order by -> limit

SQL分页查询思路Limit使用

  • 目的:从哪一行查,要查几行
  • 使用:Limit a,b a-从哪一行开始,b-一共查几行
  • 角标:从0开始
  • 格式:SELECT * FROM 表名 LIMIT 0,5;
  • 分页思路:
int curPage=1;-- 当前页
int pageSize=3;-- 每页多少条数据
SELECT * FROM employee LIMIT (curPage-1)*pageSize,pageSize;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值