首页 > 数据库 >MySQL查询语句及练习题

MySQL查询语句及练习题

时间:2023-09-09 16:34:28浏览次数:47  
标签:练习题 语句 sal -- MySQL 查询 emp 表中 SELECT

查询记录

  • 查询数据库表中列的数据
SELECT *,列名
FROM 表名
WHERE 条件
GROUP BY 分组
HAVING 过滤
ORDER BY 排序
LIMIT 分页查询

分组查询

  • GROUP BY 子句用于根据一个或多个列对结果进行分组
-- 统计员工表中职位的分类信息
SELECT J职位 FROM 员工表 
GROUP BY 职位;

-- 统计员工表中每个职位有多少人
SELECT 职位,COUNT(员工编号) FROM 员工表
GROUP BY 职位;

过滤查询

  • WHERE不能和聚合函数一起使用
  • HAVING 子句用于指定分组的条件
-- 统计员工表中职位人数大于15的职位与数量
SELECT 职位,COUNT(员工编号) FROM 员工表
GROUP BY 职位
HAVING COUNT(员工编号)>15;

排序

SELECT /列名 FROM 表名 ORDER BY 列名1 ASC/DESC,列名2 ASC/DESC;
-- ASC升序(默认)
-- DESC 降序
-- 如果对多列进行排序的时候,首先排序第一列,第一列必须有相同列值,才会进行第二列排序

分页查询

SELECT */列名 FROM 表名 LIMIT 初始位置,行数;
-- 初始位置表示从哪一行开始,是一个可选值,默认值是0
-- 行数表示要查询的行数
-- 查询员工表中前5条记录
SELECT * 
FROM 员工表
LIMIT 5;

-- 查询员工表中,从第3条记录开始到第10条记录
SELECT *
FROM 员工表
LIMIT 2,8;

模糊查询

SELECT 列名 FROM 表名
WHERE 列名 LIKE 模糊条件 
OEDER BY 列名1 ASC/DESC,列名2 ASC/DESC;
-- % 表示0个或多个任意字符
-- _表示任意一个字符

例:查询emp表中,员工的姓名,第1个字母是S的,员工的姓名、职位、工资

select ename,job,sal from emp where ename like 'S%';

查询emp表中,姓名的最后1个字母是N,员工的姓名、职位、工资

select ename,job,sal from emp where ename like '%N';

查询student表中,姓名中含有唐的,学员的姓名、分数、班级

select sname,score,sclass from student where sname like '%唐%';

查询emp表中,倒数第2个字母是N的,员工的姓名、职位、入职时间

select ename,job,hiredate from emp where ename like '%N_';

分组查询

例:查询student表中,分数(score)在70--99分之间的,班级名称(sclass),班级的人数,班级的平均分数,根据班级的平均分数降序排列

select sclass,count(*),avg(score)
from student
where score >= 70 and score <= 99
group by sclass
order by avg(score) desc;

having子句

语法:

select 聚合函数/列名
from 表名
where 条件
group by 列名
having 条件
order by 列名1/聚合函数 asc/desc,列名2/聚合函数 asc/desc;

例:

-- 查询emp表中,部门的平均工资大于2000的,部门的编号(deptno),部门的平均工资
select deptno,avg(sal)
from emp
group by deptno
having avg(sal) > 2000;

-- 查询emp表中,工资(sal)在1000---5000之间的,员工的职位,职位的人数,职位的平均工资,职位的最高工资,要求职位的最高工资小于3000,根据职位的平均工资升序排列
select job, count(*), avg(sal), max(sal)
from emp
where sal >= 1000 and sal <= 5000
group by job
having max(sal) < 3000
order by avg(sal) asc;

连接

MySQL连接分为内连接、外连接、自连接

INNER JOIN称为内连接,语法如下:

SELECT 别名1.*/列名,别名2*/列名
FROM 表1 别名1 INNER JOIN 表2 别名2
ON 连接条件(关联的条件)

例:-- 查询EMP表中,员工姓名(ename),职位(job),工资(sal),以及dept表中,部门名称(dname),部门地址(loc)

SELECT e.ename,e.job,e.sal,d.dname,d.loc
FROM emp as e INNER JOIN dept as d
ON e.deptno = d.deptno;

-- 查询emp表中,员工姓名不包含字母K,员工的姓名ename,职位job,工资sal,以及dept表中全部列数据

SELECT e.ename,e.job,e.sal,d.*
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno AND NOT e.name LIKE '%K%';

-- 查询cou01表中,课程编号(cno),课程名称cname以及sco01表中,学员编号sno,课程分数score,要求课程分数在70-90之间

SELECT c.cno,c.cname,s.sno,s.score
FROM cou01 c INNER JOIN  sno01 s
ON c.cno = S.cno AND s.score BETWEEN 70 AND 90;

-- 查询cou01表中,课程编号(cno),课程名称cname以及sco01表中,学员编号sno,课程分数score,要求课程分数在70-90之间,根据课程分数降序排序

SELECT c.cno,c.cname,s.sno,s.score
FROM cou01 c INNER JOIN  sno01 s
ON c.cno = s.cno AND s.score BETWEEN 70 AND 90
ORDER BY s.score DESC;

-- 查询emp表中,员工姓名,职位,工资,以及salgrade表中,工资等级grade,最低工资losal,最高工资hisal

SELECT e.ename 员工姓名,e.job 职位,e.sal 工资,s.grade 工资等级,s.losal 最低工资,s.hisal 最高工资
FROM EMP e INNER JOIN SALGRADE s
ON e.sal BETWEEN s.LOSAL AND s.HISAL; 

外连接

命令:

SELECT 别名1.*/列名,别名2.*/列名2
FROM 左表 别名1 LEFT JOIN 右表 别名2
ON 连接条件;

例题如下:

-- 查询dept表中,所有部门的信息以及,该部门下 员工的编号,姓名,职位,入职时间(hiredate),根据入职时间升序排列(外连接)

SELECT d.*,e.EMPNO,e.ename,e.job,e.hiredate
FROM dept d LEFT JOIN emp e
ON e.deptno = d.deptno
ORDER BY e.hiredate ASC;

-- 查询emp表中,员工姓名不包含字母k的,所有的员工编号、姓名、职位、工资以及该员工所属的部门名称(dname),部门地址(loc),根据工资降序排列

SELECT e.empno,e.name,e.job,e.sal,d.dname,d.loc
FROM emp e LEFT JOIN dept d
ON e.deptno = d.deptno
WHERE NOT e.ename LIKE '%K%'
ORDER BY e.sal DESC;

右外连接

命令:

SELECT 别名1.*/列名,别名2.*/列名2
FROM 左表 别名1 RIGHT JOIN 右表 别名2
ON 连接条件;

例题:

-- 查询dept表中,所有部门的信息以及,该部门下 员工的编号,姓名,职位,入职时间(hiredate),根据入职时间升序排列(外连接)

SELECT d.*,e.EMPNO,e.ename,e.job,e.hiredate
FROM dept d RIGHT JOIN emp e
ON e.deptno = d.deptno;

-- 查询stu01表中所有学员的,编号(sno),姓名(sname),年龄(age),地址(address)以及该学员的分数(score),根据学院的编号降序排列

SELECT t.sno,t.sname,t.age,t.address,s.score
FROM sco01 s RIGHT JOIN stu01 t
ON s.sno = t.sno
ORDER BY t.sno desc;

自查询

命令:

SELECT 别名1.*/列名,别名2.*/列名
FROM 表名 别名1,表1 别名2

子查询

-- 查询emp表中,工资大于平均工资的,员工的编号(empno),姓名(ename),职位(job),工资(sal)
SELECT empno,ename,job,sal
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp);

-- 查询student表中,和唐家三少是同一个班级(sclass)的,学员信息
#查询学员信息
#班级=唐家三少的班级 
SELECT *
FROM student
WHERE sclass = (SELECT sclass FROM student WHERE sname='唐家三少');

-- 查询emp表中,和30号部门员工,工资相同的,员工信息
SELECT *
FROM emp
WHERE sal IN(SELECT sal FROM emp WHERE deptno=30) AND deptno <> 30;

视图

命令:

CREATE VIEW 视图名称 AS 查询语句;
-- 创建一个视图,名称为view_emp,查询emp表中全部列的数据,作为视图的结果
CREATE VIEW view_emp
AS
SELECT * FROM emp;

-- 创建一个视图,名称为view_emp_dept,
-- 查询emp表中全部列数据以及dept表中部门名称(dname),部门地址(loc)
做为视图结果
CREATE view_emp_dept,
AS
SELECT e.*,d.dept,d.dname,d.loc
FROM emp e INNER JOIN dept d
WHERE e.deptno = d.deptno;

-- 创建一个视图,名称为view_stu_cou_sco,查询stu01表中全部列数据以及cou01表中全部列数据,以及sco01表中课程分数(score),做为视图结果
CREATE VIEW view_stu_cou_sco
AS 
SELECT s.*,c.*,s.score
FROM sco01 s
INNER JOIN cou01 c ON s.cno = c.cno
INNER JOIN stu01 t ON s.cno = t.sno;


-- 查询视图view_emp,员工姓名,职位,工资,奖金,根据工资降序排列
SELECT ename,job,sal,comm
FROM view_emp
ORDER BY sal DESC;

-- 查询视图view_stu_cou_sco中,学员姓名(sname),地址(address),课程名称(cname),课程分数(score),根据学员姓名升序排列
SELECT sname,address,cname,score
FROM view_stu_cou_sco 
ORDER BY sname ASC;

删除视图

DROP VIEW 视图名称;

SHOW TABLES;
-- 检查有无删除

索引

创建索引

CREATE INDEX 索引名称 ON 表名(列名);

查看索引

SHOW INDEX FROM 表名;

删除索引

DROP INDEX 索引名称 ON 表名;

数据备份和恢复

数据备份

mysqldump -u 用户名 -p 仓库名 > 备份路径

-- 对test表所在的数据库进行备份 
mysqldump -u root -p test > D;/文件名称/文件名.sql

数据恢复

mysql -u 用户名 -p 仓库名称 < 本地sql文件路径
-- 将d盘中.sql文件恢复到test数据库中
mysql -u root -p test < D:文件名称/文件名.sql

日期处理函数

MySQL查询语句及练习题_数据

例题:

-- 获取系统当前日期

select curdate();

-- 案例:获取系统当前时间

select curtime();

-- 案例:获取系统当前日期和时间

select sysdate();

-- :获取当前系统年份

select year(curdate());

-- 案例:获取当前系统月份

select month(sysdate());

-- 查询emp表中,员工姓名,职位,入职时间,入职年份

select ename,job,hiredate,year(hiredate) from emp;

-- :将日期格式2023-01-01转换为对应的字符串

select date_format('2023-01-01','%m-%d-%Y');

-- 将日期格式的字符串2023-01-10,按照指定的格式,转换为日期类型的值

select str_to_date('2023-01-10 11:11:30','%Y-%m-%d %H:%i:%s');

数据库练习题

查询学习每门课程的课程名称,人数

select c.cname,count(*)
from cou01 c,sco01 s
where c.cno=s.cno
group by s.cno;
-- c和s是别名
-- group by是将其分组查询

计算出员工的年薪(sal*12),并且以年薪降序排序

select sal,sal*12 as ysal from emp order by ysal desc;
--年薪=工资sal*月份
-- order by 列名 desc    降序排列/asc为升序排列

计算员工的日薪(按30天)

select ename,round(sal/30,2) from emp;
-- 日薪等于工资除30
-- 2是保留两位小数

查询职位是CLERK的员工的编号、姓名、部门编号

SELECT EMPNO,ENAME,DEPTNO FROM EMP WHERE JOB='CLERK';
-- EMPNO员工编号
-- ename姓名
-- DEPTNO 部门编号
-- 条件查询

查询sco01表中,学员成绩在70~90之间的,学员的编号、学员成绩

select sno,score from sco01 where score between 70 and 90;
-- 在...之间   BETWEEN AND
-- sno为学员编号   score为学员成绩

查询stu01表中,学员姓名首字母以J开头的,学员编号、学员姓名

SELECT sno,sname FROM stu01 WHERE sname LIKE ‘J%’;
-- 模糊查询
-- sno为学员编号   score为学员成绩
-- 以...开头 LIKE '...%'
-- 以...结尾 LIKE '%...'

查询奖金多于工资60%的员工信息。

SELECT * FROM EMP WHERE COMM>SAL*0.6;
-- 多余工资60% 为大于sal*0.6
--comm 为奖金

查询10号部门的经理、20号部门的职员 或者既不是经理也不是职员但是工资高于2000元的员工信息

SELECT * FROM EMP WHERE (DEPTNO=10 AND JOB='MANAGER') OR (DEPTNO=20 AND JOB='CLECK')OR (JOB<>'MANAGER' AND JOB<>'CLECK' AND SAL>2000);
-- *员工信息
-- deptno部门  MANAGER 经理   JOB职位   CLERK 职员
-- <>不等于








标签:练习题,语句,sal,--,MySQL,查询,emp,表中,SELECT
From: https://blog.51cto.com/u_16239022/7420022

相关文章

  • MySQL配置中文编码GBK的重要性
    一、背景   在mysql数据库中,默认使用的是latin字符集,所以无法正常的支持中文字符。在my.ini文件中将配置支持GBK编码,方便于后续数据库操作而不会报错误。二、问题如下图所示通过上述图,存在以下几个问题:默认创建的数据库和表是latin1编码。my.ini配置文件中设置为:character-s......
  • MySQL查询命令练习(二)
    详细的命令总结及用法点这里就好了^_^      ⬇⬇⬇《MySQL命令总结》看完命令用法看看下面的题吧根据题目要求,写出SQL语句namecoursescore张三语文85张三数学82李四语文85李四数学81李四英语88王五语文75王五数学85王五化学99创建表并验证CREATETABLEstudent(name......
  • MySQL 8使用部分撤销做权限限制
     在MySQL8.0.16之前,不可能授予全局权限的同时,排除某些schema;从MySQL8.0.16开始,如果启用了partial_revokes系统变量,就可以做到这一点。具体来说,对于拥有全局权限的用户,partial_revokes可以撤销特定schema的权限,同时保留其他schema的权限。这样施加的权限限制可能有助于......
  • 迁移:mysql迁移dm8问题处理
    问题1表[xxxxx]中不能同时包含聚集KEY和大字段处理方法sp_set_para_value(1,'PK_WITH_CLUSTER',0);将迁移工具退回输入DM用户名密码的页面再继续下一步,或者关闭当前迁移窗口重新打开迁移任务(PK_WITH_CLUSTER是会话级参数,直接重试会因为本会话的参数未生效而依然报错)问题2第......
  • mysql时间段内查询
    mysql时间段内查询(第一种方法)SELECT*FROM 表名WHERE字段名>NOW()-INTERVAL2HOUR;(第二种方法)SELECT*FROM 表名WHERE 字段名>DATE_SUB(NOW(),INTERVAL60MINUTE);今天select*from表名whereto_days(时间字段名)=to_days(now());昨天SELECT* FROM 表名 ......
  • Mysql - WHERE子句
    今天想了解一下flowable是怎么样查询代办的,于是打断点结果发现有一个SQL语句有点意思SELECTDISTINCT RES.*FROM ACT_RU_TASKRESWHERE RES.ASSIGNEE_ISNULL ANDEXISTS( SELECT LINK.ID_ FROM ACT_RU_IDENTITYLINKLINK WHERE LINK.TYPE_='candidate'......
  • 处理MySQL高水位表的相关测试
    文档课题:处理MySQL高水位表的相关测试.数据库:MySQL5.7.21系统:rhel7.31、理论知识MySQL中使用delete删除数据后并不会回收存储空间,而是等待新数据填补该空洞,若无数据填补,则此部分存储空间会造成资源浪费。此时需使用optimizetable释放空间。对于写操作频繁的表,需根据实际情况......
  • 15.mysql数据库安全性
    MySQL数据库的安全性是一个复杂而广泛的主题,它涉及多个方面,包括访问控制、数据保护、身份验证、审计和防止常见的数据库攻击等。以下是一些常见的MySQL数据库安全性最佳实践和示例代码,以帮助您加强MySQL数据库的安全性。请注意,这只是一个起点,实际的安全措施可能因应用程序和......
  • JS基础-分支语句
    分支语句是流程控制语句当中的一种可以简单理解为是一种控制条件,当达到某个条件时,执行相应的代码IFIF多条件分支例如:当变量a>b时,则执行语句块1,如果a等于b时,则执行语句块2;最后,如果a>b时,则执行语句块3ifelse语句当中的语句块一般具有排斥作用。如果执行了......
  • mysql 开启cdc归档日志
    1、介绍mysql开启归档只需要在mysql的 my.ini 中添加几个配置即可(适用版本如下:)2、说明如下:#配置二进制日志,下面的路径logs文件夹需要提前建好log-bin=E:/mariadb-10.4.20-winx64/logs/mysql-bin.log#设置最大存储空间max-binlog-size=50000M#指定服务idser......