MySql操作「数据查询条件20211223

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql操作「数据查询条件20211223相关的知识,希望对你有一定的参考价值。

参考技术A

# SELECT 数据查询(二)


## 对查询结果排序 ORDER BY
ORDER BY 关键字主要用来将查询结果中的数据按照一定的顺序进行排序
1. 语法: - `order by 字段名> [asc|desc]`

- 说明 asc 按照升序排序【默认】, desc 按照降序排序

2. 注意:

- ORDER BY 关键字后可以跟子查询 - 当排序的字段中存在空值时,ORDER BY 会将该空值作为最小值来对待

- 当排序的字段中存在空值时,ORDER BY 会将该空值作为最小值来对待查询数据按字母升序进行排序(A Z),但数据的排序并不仅限于此,还可以使用 ORDER BY 中的 DESC 对查询结果进行降序排序(Z A)。


## 条件查询数据 WHERE
如果需要有条件的从数据表中查询数据,可以使用 WHERE 关键字来指定查询条件。
1. 语法 - `WHERE conditons`

- 带比较运算符和逻辑运算符的查询条件

- 带 BETWEEN AND 关键字的查询条件

- 带 IS NULL 关键字的查询条件

- 带 IN 关键字的查询条件 - 带 LIKE 关键字的查询条件


### 单条件查询


### 多条件查询
在 WHERE 关键词后可以有多个查询条件,这样能够使查询结果更加精确。

多个查询条件时用逻辑运算符 `AND(&&)、OR(||)` 或 `XOR` 隔开。


1. AND :记录 满足所有条件,才会被查询出结果

2. OR : 记录 满足任意一个查询条件,才会被查询出结果

3. XOR : 记录 满足其中一个条件,并且不满足另外一个条件是,才会被查询出结果


>OR、AND 和 XOR 可以一起使用,但是在使用时要注意运算符的优先级。

http://c.biancheng.net/view/7399.html


### 模糊查询 LIKE [新知识 4me]
1. 语法:

- `[NOT]LIKE`

- NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。

- 字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。


LIKE 关键字支持百分号` % `和下划线` _ `通配符。


#### 带有“%”通配符的查询
“%”是 mysql 中最常用的通配符,它能代表 **任何长度的字符串** ,字符串的长度可以为 0。

例如,a%b表示以字母 a 开头,以字母 b 结尾的任意长度的字符串。该字符串可以代表 ab、acb、accb、accrb 等字符串。


注意:匹配的字符串必须加 *单引号* *双引号*
#### 带有“_”通配符的查询
“_”只能代表单个字符,字符的长度不能为 0。 例如,a_b可以代表 acb、adb、aub 等字符串。


#### LIKE 区分大小写(默认不区分)

默认情况下,LIKE 关键字匹配字符的时候是 不 区分大小写的。如果需要 可以加入`BINARY`关键字


#### 使用通配符的注意事项和技巧


1. 注意事项:

- 注意大小写。MySQL 默认是不区分大小写的。如果区分大小写,像“Tom”这样的数据就不能被“t%”所匹配到。

- 注意尾部的空格 尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。

- 注意NULL。”%”通配符可以到匹配任意字符,但是不能匹配 NULL。也就是说 “%”匹配不到 tb_students_info 数据表中值为 NULL 的记录。

2. 使用技巧:

- 不要过度使用通配符,如果其它操作符能达到相同的目的,应该使用其它操作符。因为 MySQL 对通配符的处理一般会比其他操作符花费更长的时间。

- 在确定使用通配符后,除非绝对有必要,否则不要把它们用在字符串的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。

- 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。 ** *拓展* ** 如果查询内容中包含通配符,可以使用“”转义符。


*** 2021-12-23 今天先学到这里 明天继续 MySql 的查询 学习

MySQL—— 条件查询

3. 条件查询

3.1 什么是条件查询

  不是将表中所有数据都查出来,而是查询出来符合条件的。
  语法格式:

select
	字段1,字段2,字段3....
from 
	表名
where
	条件;

3.2 查询条件

  条件查询需要用到 where 语句,where 必须放到 from 语句表的后面。支持如下运算符:

3.2.1 =等号操作符

  • 查询薪水为 5000 的员工:select empno, ename, sal from emp where sal=5000;

  • 查询 job 为 MANAGER 的员工:select empno, ename from emp where job=manager;


      以上查询出现错误,因为 job 为字符串,所以出现了以上错误,将语句改为select empno, ename from emp where job="manager";


      也可以使用单引号select empno, ename from emp where job='manager';


      mysql 默认情况下大小写是不敏感的,所以也可以使用大写select empno, ename from emp where job='MANAGER';


      注意:MySQL 在 windows 下是不区分大小写的,将 script 文件导入 MySQL 后表名也会自动转化为小写,结果再想要将数据库导出放到 linux 服务器中使用时就出错了。因为在 linux 下表名区分大小写而找不到表,查了很多都是说在 linux 下更改 MySQL 的设置使其也不区分大小写。
      反过来也可以让 windows 下大小写敏感,做法是相应的更改 windows 中 MySQL 的设置。具体操作:在 MySQL 的配置文件 my.ini 中增加一行:lower_case_table_names = 0,其中 0:区分大小写,1:不区分大小写。
      MySQL 在 Linux 下数据库名、表名、列名、别名大小写规则是这样的:
       1. 数据库名与表名是严格区分大小写的;
       2. 表的别名是严格区分大小写的;
       3. 列名与列的别名在所有的情况下均是忽略大小写的;
       4. 变量名也是严格区分大小写的;MySQL 在 Windows 下都不区分大小写。

3.2.2 <>不等于操作符

  • 查询薪水不等于 5000 的员工:select empno, ename, sal from emp where sal <> 5000;


      也可以采用!=代替操作符<>select empno, ename, sal from emp where sal != 5000;
      数值也可以采用单引号引起来:select empno, ename, sal from emp where sal <> '5000';
      但是不推荐使用后两者写法。

  • 查询工作岗位不等于 MANAGER 的员工:select empno, ename from emp where job <> 'MANAGER';

3.2.3 < 小于操作符

  • 查询薪资小于2000的员工姓名和编号:select empno,ename,sal from emp where sal < 2000;

3.2.4 <= 小于等于操作符

  • 查询薪资小于等于3000的员工姓名和编号:select empno,ename,sal from emp where sal <= 3000;

3.2.5 > 大于操作符

  • 查询薪资大于3000的员工姓名和编号:select empno,ename,sal from emp where sal > 3000;

3.2.6 >= 大于等于操作符

  • 查询薪资大于等于3000的员工姓名和编号:select empno,ename,sal from emp where sal >= 3000;

3.2.7 between … and …. 操作符

  between … and …. 操作符:两个值之间,等同于 >= and <=

  • 查询薪资在2450和3000之间的员工信息(包括2450和3000)
    第一种方式:>= and <= (and是并且的意思)
    select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;

    第二种方式:between … and …
    select empno,ename,sal from emp where sal between 2450 and 3000;

      
    注意:使用between … and …的时候,必须遵循左小右大。
       between … and …是闭区间,包括两端的值。

3.2.8 is null 操作符

  Null 为空,但不是空串,为 null 可以设置这个字段不填值,如果查询为 null 的字段,采用 is null
  is null 为 null(is not null 不为空)。

  • 查询哪些员工的津贴/补助为null:select empno,ename,sal,comm from emp where comm = null;


     在数据库当中null不能使用等号进行衡量,需要使用is null。因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量。
     改为:select empno,ename,sal,comm from emp where comm is null;

  • 查询哪些员工的津贴/补助不为null:select empno,ename,sal,comm from emp where comm is not null;

3.2.9 and 并且操作符

  and 表示并且的含义,表示所有的条件必须满足。

  • 查询工作岗位是MANAGER并且工资大于2500的员工信息:select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;

3.2.10 or 或者操作符

  or,只要满足条件即可,相当于包含。

  • 查询工作岗位是MANAGER和SALESMAN的员工:select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';

3.2.11 表达式的优先级

  问题: andor同时出现的话,有优先级问题吗?

  • 查询工资大于2500,并且部门编号为10或20部门的员工:select * from emp where sal > 2500 and deptno = 10 or deptno = 20;

      
      分析以上语句的问题。
      以上输出不是预期结果,薪水小于 2500 的数据也被查询上来了,原因是表达式的优先级导致的,首先过滤 sal > 2500 and deptno = 10,然后再将 deptno = 20 员工合并过来,所以是不对的。
      and优先级比or高,以上语句会先执行and,然后执行or。以上这个语句表示什么含义?
      找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。
      改为:select * from emp where sal > 2500 and (deptno = 10 or deptno = 20);
      

      总结: andor同时出现,and优先级较高。如果想让or先执行,需要加“小括号”。以后在开发中,如果不确定优先级,就加小括号就行了。

3.2.12 in 包含操作符

  in包含,相当于多个ornot in不在这个范围中)。

  • 查询工作岗位是MANAGER和SALESMAN的员工:
    select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
    select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');


      注意:in不是一个区间,in后面跟的是具体的值。
  • 查询薪资是800和5000的员工信息:
    select ename,sal from emp where sal = 800 or sal = 5000;
    select ename,sal from emp where sal in(800, 5000);
  • 查询薪资是800,5000,3000的员工信息:select ename,sal from emp where sal in(800, 5000, 3000);

   not in 表示不在这几个值当中的数据。例如,select ename,sal from emp where sal not in(800, 5000, 3000);

3.2.13 not 取反操作符

  not 可以取非,主要用在 isin 中。例如,is not nullnot in

  • 第一种写法:查询出薪水不包含 1600 和薪水不包含 3000 的员工
    select * from emp where sal <> 1600 and sal <> 3000;

  • 第二种写法:查询出薪水不包含 1600 和薪水不包含 3000 的员工
    select * from emp where not (sal = 1600 or sal = 3000);

  • 第三种写法:查询出薪水不包含 1600 和薪水不包含 3000 的员工
    select * from emp where sal not in (1600, 3000);

  • 查询出津贴不为 null 的所有员工:select * from emp where comm is not null;

3.2.14 like操作符

  like 称为模糊查询,支持%或下划线匹配。% 匹配任意多个字符;下划线只匹配任意一个字符。(%是一个特殊的符号,_ 也是一个特殊符号)
  Like 中的表达式必须放到单引号或双引号中。

  • 找出名字中含有O的:select ename from emp where ename like '%O%';

  • 找出名字以T结尾的:select ename from emp where ename like '%T';

  • 找出名字以K开始的:select ename from emp where ename like 'K%';

  • 找出第二个字每是A的:select ename from emp where ename like '_A%';

  • 找出第三个字母是R的:select ename from emp where ename like '__R%';

  如果有一个t_student学生表,name字段包含zhangsan、lisi、wangwu、zhaoliu、jack_son,找出名字中有“_”的?
  select name from t_student where name like '%_%'; 是不行,需要包含\\转义字符:select name from t_student where name like '%\\_%';

以上是关于MySql操作「数据查询条件20211223的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询

MySQL之单表(增删改查)+ 基本命令

mysql数据库表的基本操作

mysql数据库查询操作

MySQL增删改查基本操作(入门宝典!!!)

MySQL增删改查基本操作(入门宝典!!!)