MySQL中的DQL语句

DQL 查询表中数据

  • 查询不会对数据库中的数据进行修改,只是一种显示数据的方式
准备数据
-- 创建员工表
CREATE TABLE emp(
    eid INT,
    ename VARCHAR(20),
    sex CHAR(1),
    salary DOUBLE,
    hire_date DATE,
    dept_name VARCHAR(20)
);

-- 添加数据
INSERT INTO emp VALUES(1,'孙悟空','男',7200,'2013-02-04','教学部');
INSERT INTO emp VALUES(2,'猪八戒','男',3600,'2010-12-02','教学部');
INSERT INTO emp VALUES(3,'唐僧','男',9000,'2008-08-08','教学部');
INSERT INTO emp VALUES(4,'白骨精','女',5000,'2015-10-07','市场部');
INSERT INTO emp VALUES(5,'蜘蛛精','女',5000,'2011-03-14','市场部');
INSERT INTO emp VALUES(6,'玉兔精','女',200,'2000-03-14','市场部');
INSERT INTO emp VALUES(7,'林黛玉','女',10000,'2019-10-07','财务部');
INSERT INTO emp VALUES(8,'黄蓉','女',3500,'2011-09-14','财务部');
INSERT INTO emp VALUES(9,'吴承恩','男',20000,'2000-03-14',NULL);
INSERT INTO emp VALUES(10,'孙悟饭','男', 10,'2020-03-14','财务部');
INSERT INTO emp VALUES(11,'兔八哥','女', 300,'2010-03-14','财务部');
简单查询
-- 查询emp中的 所有数据
SELECT * FROM emp; -- 使用 * 表示所有列

-- 查询emp表中的所有记录,仅显示id和name字段
SELECT eid,ename FROM emp;

-- 别名查询 使用关键字 as
-- 将所有的员工信息查询出来,并将列名改为中文
SELECT 
	eid AS '编号',
	ename AS '姓名',
	sex AS '性别',
	salary AS '薪资',
	hire_date AS '入职时间',
	dept_name '部门名称'  -- as 可以省略
FROM emp;

-- 查询一共有几个部门
-- 去重操作 关键字 distinct
SELECT DISTINCT dept_name FROM emp;

-- 将我们的员工薪资数据 +1000 进行展示
SELECT ename, salary+1000 AS salary FROM emp;
条件查询
  • 如果查询语句中没有设置条件,就会查询所有的行信息,在实际应用中,一定要指定查询条件,对记录进行过滤
运算符
-- 查询员工姓名为黄蓉的员工信息
-- 1.查哪张表	2.查哪些字段	3.查询条件
SELECT * FROM emp WHERE ename = '黄蓉'

-- 查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary = 5000;

-- 查询薪水价格不是5000的所有员工信息
SELECT * FROM emp WHERE salary != 5000;
SELECT * FROM emp WHERE salary <> 5000;

-- 查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary > 6000;

-- 查询薪水价格在5000到10000之间所有员工信息
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
SELECT * FROM emp WHERE salary >= 5000 AND salary  <= 10000;

-- 查询薪水价格是3600或7200或者20000的所有员工信息
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
-- 方式2 使用 in() 匹配括号中的参数
SELECT * FROM emp WHERE salary IN(3600,7200,20000);

-- 查询没有部门的员工信息
-- select * from emp where dept_name = null; 错误方式
SELECT * FROM emp WHERE dept_name IS NULL;

-- 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;
模糊查询
-- 查询含有'精'字的所有员工信息
SELECT * FROM emp WHERE ename LIKE '%精%'; -- % 表示匹配任意多个字符串

-- 查询以'孙'开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE '孙%';

-- 查询第二个字为'兔'的所有员工信息
SELECT * FROM emp WHERE ename LIKE '_兔%'; -- _ 表示匹配一个字符
排序
单列排序
  • 只按照某一个字段进行排序,就是单列排序

    -- 使用 salary 字段,对emp 表数据进行排序 (升序/降序)
    -- 默认升序排序 ASC
    SELECT * FROM emp ORDER BY salary;
    -- 降序排序
    SELECT * FROM emp ORDER BY salary DESC;
    
组合排序
  • 同时对多个字段进行排序,如果第一个字段相同,就按照第二个字段进行排序,以此类推

    -- 在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
    SELECT * FROM emp ORDER BY salary DESC, eid DESC;
    
聚合函数
  • 之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断
  • 而使用聚合函数查询是纵向查询,它是对某一列的值进行计算,然后返回一个单一的值(另外聚合函数会忽略null空值)
-- 查询员工的总数
-- 统计表中的记录条数 使用 count()
SELECT COUNT(eid) FROM emp; -- 使用某一个字段
SELECT COUNT(*) FROM emp; -- 使用 *
SELECT COUNT(1) FROM emp; -- 使用 1,与 * 效果一样
-- 下面这条SQL 得到的总条数不准确,因为count函数忽略了空值
-- 所以使用时注意不要使用带有null的列进行统计
SELECT COUNT(dept_name) FROM emp;

-- 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
-- sum函数求和, max函数求最大, min函数求最小, avg函数求平均值
SELECT
    SUM(salary) AS '总薪水',
    MAX(salary) AS '最高薪水',
    MIN(salary) AS '最低薪水',
    AVG(salary) AS '平均薪水'
FROM emp;

-- 查询薪水大于4000员工的个数
SELECT COUNT(*) FROM emp WHERE salary > 4000;

-- 查询部门为'教学部'的所有员工的个数
SELECT COUNT(*) FROM emp WHERE dept_name = '教学部';

-- 查询部门为'市场部'所有员工的平均薪水
SELECT
    AVG(salary) AS '市场部平均薪资'
    FROM emp
WHERE dept_name = '市场部';
分组

在这里插入图片描述

-- 按照性别进行分组操作
SELECT * FROM emp GROUP BY sex; -- 注意 这样写没有意义

-- 通过性别字段 进行分组,求各组的平均薪资
SELECT sex, AVG(salary) FROM emp GROUP BY sex;

-- 查询每个部门的平均薪资, 部门名称不能为null
SELECT
    dept_name AS '部门名称',
    AVG(salary) AS '平均薪资'
FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name;

-- 查询平均薪资大于6000的部门
-- 需要在分组后再次进行过滤,使用 having
SELECT
    dept_name ,
    AVG(salary)
FROM emp WHERE dept_name IS NOT NULL 
GROUP BY dept_name HAVING AVG(salary) > 6000 ;
  • where 与 having 的区别

    过滤方式特点
    wherewhere 进行分组前的过滤
    where 后面不能写 聚合函数
    havinghaving 是分组后的过滤
    having 后面可以写 聚合函数
limit关键字
  • limit是限制的意思,用于限制返回的查询结果的行数 (可以通过limit指定查询多少行数据)
  • limit 语法是 MySql的方言,用来完成分页
-- 查询emp表中的前 5条数据
-- 参数1 起始值(默认是0) 参数2 要查询的条数
SELECT * FROM emp LIMIT 5;
SELECT * FROM emp LIMIT 0 , 5;

-- 查询emp表中 从第4条开始,查询6条
SELECT * FROM emp LIMIT 3 , 6;


-- 分页操作 每页显示3条数据
SELECT * FROM emp LIMIT 0,3; -- 第1页
SELECT * FROM emp LIMIT 3,3; -- 第2页 2-1=1 1*3=3
SELECT * FROM emp LIMIT 6,3; -- 第三页
-- 分页公式 起始索引 = (当前页 - 1) * 每页条数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值