Kbaor_2023_10_11_MySQL_ DQL 简单查询 条件查询

Kbaor_2023_10_11_MySQL_ DQL 简单查询 条件查询

简单查询

SELECT查询所有列

#  *号代表指定表中的所有列名;
SELECT  *  FROM  表名;
#   如果使用第二种方式,每个列名之间必须要用逗号分隔,最后一个列名后面不写逗号;
#   SQL语句的最后需要加分号;
SELECT  列名1,列名2,...列名n
FROM    table;

空值

空值的含义

空值用NULL表示,表示一种无效的、未知的值,空值不是零,也不是空格

空值参与运算

空值参与算术运算,运算后的结果仍为NULL

消除重复行

消除重复行是消除相同的查询结果,只保留一行重复数据,使用关键字 DISTINCT 来完成

SELECT DISTINCT 列名1,列名2,....列名n
FROM   表名;

条件查询

单条件查询

SELECT empno, ename, deptno 
FROM   emp 
WHERE  deptno=20;

特殊比较运算符

特殊比较运算符,分别是BETWEEN...AND...、IN、LIKE、IS NULL。

BETWEEN...AND...
SELECT   empno,ename,sal 
FROM     emp 
WHERE    sal BETWEEN 1000 AND 1500;

通过结果可以看出,工资等于1000和1500的员工也被查出来了,所以BETWEEN..AND..是闭区间查询。

IN

使用IN运算符可以查询出某列的值是否和给定集合内的任意一个值相等。

SELECT empno, ename, deptno 
FROM   emp 
WHERE  deptno  IN (10 , 20)

通过结果可以看出,部门编号为10或20的员工都被查出来了。

LIKE

使用LIKE运算符可以查询出某列的值是否满足关键字匹配,也叫模糊查询
先介绍两个通配符:
% : 百分号,代表匹配零个或任意个字符。
_ : 下划线,代表匹配1个任意字符。

#查询员工姓名中以S开头的员工。
SELECT   ename 
FROM     emp 
WHERE    ename LIKE 'S%';

#查询员工姓名中第二个字母是L的员工
SELECT   ename 
FROM     emp 
WHERE    ename LIKE '_L%';
IS NULL

如果要查询某列的值是否为NULL,使用 “列名 = NULL”是查询不出来的。只能使用 “列名 IS NULL”
注意:查询某列不为空,使用 “列名 IS NOT NULL”

SELECT  ename, mgr 
FROM    emp 
WHERE   mgr IS NULL;

多条件查询

多条件查询是按照多个条件同时进行查询,查询出的结果集要同时满足多个条件。多个条件之间需要使用逻辑运算符进行连接
逻辑运算符包含逻辑与 AND,逻辑或 OR,逻辑非 NOT

#本题查询出的员工,需要同时满足两个条件,条件1:工资>1100,条件2:职位='CLERK',因此本题可以用逻辑与来解决,SQL语句为:
SELECT empno, ename, job, sal 
FROM   emp 
WHERE  sal>=1100 
AND    job='CLERK';

#查询工资大于1100或职位为‘CLERK’的员工编号、姓名、职位、工资。
SELECT empno, ename, job, sal 
FROM   emp 
WHERE sal>=1100 
OR    job='CLERK';

#查询职位不为CLERK的员工编号、姓名、职位、工资。
SELECT empno, ename, job, sal 
FROM   emp 
WHERE   NOT (job='CLERK');

SELECT empno, ename, job, sal 
FROM   emp 
WHERE   job <> 'CLERK';

NOT运算符还可以和BETWEEN…AND、IN、LIKE、IS NULL一起使用,表示的含义分别为:
NOT BETWEEN .. AND .. :不在某个区间
NOT IN (集合):不在某个集合内
NOT LIKE :不像.....
IS NOT NULL: 不是空

运算符的优先级

优先级 运算分类
优先级 算术运算符
1 (最高) 比较运算符
2 特殊比较运算符
3 逻辑非
4 逻辑与
5 (最低) 逻辑或

课后作业

第三章

  1. 查询每名员工的员工姓名,入职时间。
  2. 查询部门表中部门名称及部门所在地。
  3. 查询所有员工的员工姓名,基本工资,试用期工资(基本工资的80%)显示的列名为员工姓名,基本工资,试用期工资。
  4. 查询所有员工的名字和领导编号,看看有哪些员工没有领导?
  5. 查询员工表中每种职位对应的薪资是多少(不要重复的数据)?

第四章

  1. 查询20号部门的部门名称和部门所在地。
  2. 使用两种写法查询员工工资在1500到2500(包括1500和2500)之间的员工姓名和员工工资。
  3. 查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
  4. 查询员工姓名的第三个字母是A的员工姓名。
  5. 查询10号和20号部门以外部门的员工姓名、部门编号。
  6. 查询没有上级的员工(经理号为空)的员工姓名。
  7. 查询工资大于等于4500并且部门为10和20的员工的姓名、工资、部门编号。
  8. 查询10号部门和20号部门工资在2500以上或者工资在1500以下的员工名字,员工工资和部门编号。

课后作业答案

#第三章
#1. 查询每名员工的员工姓名,入职时间。
SELECT ename, hiredate
FROM emp;
#2. 查询部门表中部门名称及部门所在地。
SELECT dname, loc
FROM dept;
#3. 查询所有员工的员工姓名,基本工资,试用期工资(基本工资的80%)显示的列名为员工姓名,基本工资,试用期工资。
SELECT ename 员工姓名, sal 基本工资, sal*0.8 试用期工资
FROM emp;
#4. 查询所有员工的名字和领导编号,看看有哪些员工没有领导?
SELECT ename, mgr
FROM emp
WHERE mgr IS NULL;
#5. 查询员工表中每种职位对应的薪资是多少(不要重复的数据)?
SELECT DISTINCT job, sal
FROM emp;
#第四章
#1. 查询20号部门的部门名称和部门所在地。
SELECT dname, loc
FROM dept
WHERE deptno = 20;
#2. 使用两种写法查询员工工资在1500到2500(包括1500和2500)之间的员工姓名和员工工资。
#方法一
SELECT ename, sal
FROM emp
WHERE  sal BETWEEN 1500 AND 2500 ;
#方法二
SELECT ename, sal
FROM emp
WHERE  sal >=1500 AND sal <=2500 ;
#3. 查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
#方法一
SELECT ename, hiredate, job
FROM emp
WHERE  hiredate >="1982-7-9"
AND job <>"SALESMAN" ;
#方法二
SELECT ename, hiredate, job
FROM emp
WHERE  hiredate >="1982-7-9"
AND NOT (job ="SALESMAN" );
#4. 查询员工姓名的第三个字母是A的员工姓名。
SELECT ename
FROM emp
WHERE ename LIKE "__A%";
#5. 查询10号和20号部门以外部门的员工姓名、部门编号。
#方法一
SELECT ename,deptno
FROM emp
WHERE deptno <>10 AND deptno <>20;
#方法一
SELECT ename,deptno
FROM emp
WHERE deptno NOT IN (10)AND deptno NOT IN (20);
#6. 查询没有上级的员工(经理号为空)的员工姓名。
SELECT ename
FROM emp
WHERE mgr IS NULL;
#7. 查询工资大于等于4500并且部门为10和20的员工的姓名、工资、部门编号。
SELECT ename,sal,deptno
FROM emp
WHERE mgr IS NULL;
#8. 查询10号部门和20号部门工资在2500以上或者工资在1500以下的员工名字,员工工资和部门编号。
SELECT ename,sal,deptno
FROM emp
WHERE deptno =10 OR deptno = 20
AND (sal >2500 OR sal <1500 );

加油加油!

posted @ 2023-10-11 21:21  Kbaor  阅读(67)  评论(0)    收藏  举报