五、DQL语言
文章目录
- 五、DQL语言
- 5.6.条件查询
- 5.6.1.按条件表达式
- 5.6.2.按逻辑表达式
- 5.6.3.按模糊查询
- 5.6.3.1.关键字like的使用
- 5.6.3.2.关键字 `between and`
- 5.6.3.3.关键字 `in`
- 5.6.3.4.关键字is null
- 5.6.3.4.1安全等于<=>
5.6.条件查询
select 查询列表
from
表名
where
筛选条件;
注:类似java的if语句
执行顺序
from找表
筛选条件
查询列表
- 分类
- 按条件表达式
- 条件运算符
- java中的不等于
!=
也支持
< >
<>(又大又小就是不等于),在MySQL中推荐使用
<= >=
- 按逻辑表达式
- 逻辑运算符
- && || !
- and or not
推荐使用
- 模糊查询
- like 像
- between and
- in
- is null
5.6.1.按条件表达式
- 条件表达式
- 找出
employees
中工资大于12000的员工信息
SELECT
*
FROM
employees
WHERE salary >12000;
- 部门编号不等于90的员工
SELECT
last_name,
department_id
FROM
employees
WHERE department_id <> 90
5.6.2.按逻辑表达式
常用于多个条件表达式的连接
- 找出工资在10000-20000的员工信息
SELECT
*
FROM
employees
WHERE
salary >=10000 AND salary <=20000;
- 部门编号不在90—100之间,或者工资大于15000的员工信息
SELECT
*
FROM
employees
WHERE
department_id<90 OR department_id>100 OR salary;
5.6.3.按模糊查询
模糊查询经常与通配符联合使用
5.6.3.1.关键字like的使用
- 查找出名中含有字母
a
的员工信息
- 显然使用条件表达式或者逻辑表达式无法操作,二者是精确查询,精确到具体
- 使用模糊查询
- 通配符
百分号
- 代表多个任意字符
- 包括0个字符
- %a%
- 字母
a
的前后还有任意字符
- 通配符下滑线
- 单个字符的通配符
select
*
from
employees
where
last_name like '%a%';
#在MySQL中,字符必须使用单引号括起来
#MySQL不区分大小写,所以结果中,last_name
#有大写字母A的也筛选出来了
#注意`a`使用通配符,因为人名不可以就一个字母
单个字符的通配符下划线
问题:
找出名第三个字符是a
员工和及工资
select last_name,salary
from employees
where last_name like '__a%';
注意:
- 找出第二个字符是下划线的名,怎么找?
- 使用转义字符
- 与java转义字符一致用
反斜杠
‘\_’
- 自己定义转义字符
(推荐使用)
+关键字escape
where last_name like '_$_%' escape '$'
#使用escape将美元符号定义为转义字符
5.6.3.2.关键字 between and
问题:
员工编号在50—100之间的员工信息?
between A and B
- A、B的位置颠倒结果不同,意义不同
- A、B数据类型要一致
- A、B数据类型不一致,但是可以相互转换
例如: between 10 and 20 等价于>=10且<=20,若颠倒顺序between 20 and 10 等价于>=20 且<=10,有满足这样的吗?没有,显然违背逻辑,但是在MySQL中不会报错,只不过是结果空的
- 思考: A=B 情况下,怎么样?
SELECT *
FROM employees
WHERE employee_id BETWEEN 50 AND 100;
注意:
- 员工ID可以=100,也就说
between and
是包含边界的
5.6.3.3.关键字 in
- in (A,B,C) 满足ABC三个条件中的其中一个的,给我找出来
- 判断某字段的值是否属于in()列表中的某一个
常用于代替or解决的问题
- in列表的类型要一致,不一致那就要相互兼容
(可以相互转换)
in查找的是符合在列表的,符合在列表,怎么样?自然也有不在列表的,怎么写?-----
非
嘛!
not in
select last_name,job_id from employees where job_id not in ('AD_VP','IT_VP')
注意:在输入命令时,若报错,请仔细检查,肯定有那个字符细节上处理不到位
想输入着重号,很难输入,反正就是不顺利,很可能此时是把(单引号)当做着重号了
- in不支持通配符,为什么?
in最像什么?java中的
switch case 语句
是与in列表的东西进行匹配,类似与等于
,就像switch case
一样
- 匹配上一个case,做出相应的操作,要求输入的类型和case的类型和大小一致
- 类型不同,可以怎么样?可以是字符、字符串转换为int型后,匹配上某一个case,便执行操作
- 不要忘记了,在一定范围内,遵循Unicode编码表,是可以将字符与int型进行等价的隐式转换
(自动转换)
问题:
找出工种编号是IT_PROT 、 AD_VP 、AD_PRES中的一个的,员工名及其工种编号
SELECT last_name,job_id
FROM employees
WHERE job_id IN ('AD_VD','PRES_VD','AD_VP');
思考:
为什么in里面的参数要用好、单引号?
并不是为了为了更好看,那些参数是什么?是字符串,在MySQL里,字符串就是用单引号或者双引号表示,
如果参数是整型,则不需要
5.6.3.4.关键字is null
- 注意:
-
is
和null
是搭配使用的,is not null
也是,不要拿去和别的对象使用 - 不要出现
is 12000
来找出工资12000的员工,这是错误使用 - 要找工资12000的员工,直接用等于号,条件表达式就可以了
问题:
给我把公司里没有奖金的员工找出来
select last_name,commission_pct
from employees
where commission_pct is null
思考:
逆向思维,给我找出有奖金的员工,怎么做?
- 逆向,在编程里,逆向,好办呀,非
select last_name,commission_pct
from employees
where commission_pct is not null;
5.6.3.4.1安全等于<=>
上面的问题, is null 还可以用
<=>
安全等于来代替
对比:
符号 | 用法 | 范围 |
is null | 判断有 | 固定使用 |
is not null | 判断没有 | 固定使用 |
<=> | 可以代替is null | 除了用于null,还可以用于普通的等于,机动灵活,比如工资12000 |
| 否定时,not的位置 |
SELECT last_name,commission_pct
FROM employees
WHERE NOT commission_pct <=> NULL;
练习:
查出工号176的员工年薪和所属部门编号
SELECT last_name,department_id,employee_id,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM employees
WHERE employee_id=176;