MySQL基础篇 | 简单的查询条件查询排序查询

Posted @每天都要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础篇 | 简单的查询条件查询排序查询相关的知识,希望对你有一定的参考价值。

✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步!
📃个人主页:@每天都要敲代码的个人主页

🔥系列专栏:MySQL专栏

目录

一:简单的查询(DQL)

1. 查询一个字段

2. 查询多个字段 

3. 查询全部字段

4. 计算员工的年薪

5. 将查询出来的字段显示为中文

二:条件查询

1. = 操作符 

2. <> != 操作符

3. between … and …操作符

4. is null

5. and

6. or

7. and 和 or 联合使用

8. in

9. not

10. like

三:排序查询

1 .单一字段排序

2. 手动指定排序顺序

3. 多个字段排序

4.  使用字段的位置来排序


一:简单的查询

语法格式:  

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

注意:

(1)任何一条sql语句以 “;” 结尾
(2)sql语句不区分大小写

1. 查询一个字段

例如:查询员工的姓名

select ename from emp;

Select语句后面跟的是字段名称,select是关键字,select和字段名称之间采用空格隔开,from表示将要查询的表,它和字段之间采用空格隔开。

2. 查询多个字段 

例如:查询员工的编号和姓名

select empno, ename from emp;

查询多个字段,select中的字段采用逗号间隔即可,最后一个字段,也就是在from前面的字段不能使用逗号了。

3. 查询全部字段

例如:查询当前数据库中,emp表中的所有字段

select * from emp;

采用select * from emp,虽然简单,但是*号不是很明确,建议查询全部字段将相关字段写到select语句的后面;在以后java连接数据库的时候,是需要在java程序中编写SQL语句的,这个时候编写的SQL语句不建议使用select *  这种形式,建议写明字段,增强可读性!

4. 计算员工的年薪

例如:列出员工的编号,姓名和年薪

在select语句中可以使用运算符!但不会更改数据库中原始的数据!

select empno,ename,sal*12 from emp;

sal*12看着很不舒服,我们可以用as给查询结果的列重命名,as可省略

5. 将查询出来的字段显示为中文

采用as关键字重命名表字段,并且这里的as 是可以省略的!

注意:字符串必须添加单引号 或者 双引号;标准sql语句中要求字符串使用单引号括起来;虽然mysql支持双引号,尽量别用!

select empno as '员工编号',ename as '员工姓名',sal*12 as '年薪'from emp;
# 写成双引号的方式,只能在MySQL中运行,不通用;建议写成单引号的方式
select empno  "员工编号", ename  "员工姓名", sal*12  "年薪" from emp;

二:条件查询

条件查询需要用到where语句,where必须放到from语句表的后面!

语法格式:     

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

执行顺序:先from,然后where,最后select

支持如下运算符:

1. = 操作符 

(1)查询薪水为5000的员工

select empno, ename, sal from emp where sal=5000;

 (2)查询job为MANAGER的员工

注意:manager字符串,要用单引号或者双引号括起来!

select empno, ename from emp where job='manager';

2. <> != 操作符

(1)查询薪水不等于5000的员工

注意:对于数值也可以采用单引号或者双引号引起来的,例如5000写成'5000'或者“5000”都是可以的,但是不建议这样写!

select empno, ename, sal from emp where sal <> 5000;
select empno, ename, sal from emp where sal != 5000;

 (2)查询工作岗位不等于MANAGER的员工

 select empno, ename, sal from emp where job<>'manager';

3. between … and …操作符

①between and在使用的时候必须左小右大。

②between and除了可以使用在数字方面(左闭右闭)之外,还可以使用在字符串方面(左闭右开)!

(1)查询薪水为1600到3000的员工(左闭右闭)

第一种方法:使用between...and...

select empno, ename, sal from emp where sal between 1600 and 3000;

between … and …,它是包含最大值和最小值的;就等价于>= and <=

第二种方式:使用>= and <=

select empno, ename, sal from emp where sal >=1600 and sal<=3000;

(2)查看员工首字母是A到C开头的名字(左闭右开)

select ename from emp where ename between 'A' and 'C'; --包括A,不包括C

4. is null

①null为空,但不是空串,为null可以设置这个字段不填值,空不是一个值,不能用等号衡量。

②如果查询为null的字段,采用is null;不能采用 =null !

(1)查询津贴为空null的员工

(1)首先先使用select * from emp; 查询到所有的comm信息,发现有很多是NULL 

(2)如果直接只用 =null 是无法查询出符合条件的数据

 (3)应该采用 is null 作为查询条件

select * from emp where comm is null;
select * from emp where comm is not null;

(2)找出那些员工没有津贴:这就包括为null的和0的

select * from emp where comm is null or comm=0;

5. and

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

例如:查询工作岗位为MANAGER,薪水大于2500的员工

select * from emp where job='manager' and sal >= 2500;

6. or

or,只要满足条件即可,相当于包含;满足条件之一即可!

例如:查询出job为manager或者job为salesman的员工

select * from emp where job='manager' or job = 'salesman';

7. and 和 or 联合使用

找出薪资大于1000的并且部门编号是20或30部门的员工。

select ename,sal,deptno from emp where sal > 1000 and (deptno = 20 or deptno = 30);
-- and优先级比or高,要想让or先执行,必须加小括号

8. in

in表示包含的意思,完全可以采用or来表示,采用in会更简洁一些

(1)查询出job为manager或者job为salesman的员工

使用or:select * from emp where job='manager' or job = 'salesman'; 
使用in:select * from emp where job in ('manager','salesman');

(2)查询出薪水包含1600和薪水包含3000的员工

select * from emp where sal in(1600,3000);

9. not

(1)查询出薪水不包含1600和薪水不包含3000的员工

第一种写法:使用不等<>

select * from emp where sal<>1600 and sal <>3000;

第二种写法: 使用等于= 和 not 联合使用

select * from emp where not(sal=1600 or sal=3000);

第三种写法:使用not in

select * from emp where sal not in(1600,3000);

(2)查询出津贴不为null的所有员工

select * from emp where comm is not null;

10. like

Like可以实现模糊查询,like支持 % 和 下划线_ 匹配。

②Like中%和下划线的差别?

%匹配任意字符出现的个数;

_下划线只匹配一个字符;

Like 中的表达式必须放到单引号中或者双引号中。

 (1)查询姓名以M开头所有的员工

select * from emp where ename like 'M%';

 (2)查询姓名以N结尾的所有的员工

select * from emp where ename like '%N';

 (3)查询姓名中包含O的所有的员工

select * from emp where ename like '%O%';

 (4)查询姓名中第二个字符为A的所有员工

select * from emp where ename like '_A%';

(5)补充:找出名字中下划线_的;利用转义字符\\ !

select * from emp where ename like '%\\_%';

三:排序查询

1. 单一字段排序

排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序如果存在where子句那么order by必须放到where语句的后面!

(1)按照薪水由小到大排序

select * from emp order by sal;

(2)先取得job为MANAGER的员工,再按照薪水由小到大排序

select * from emp where job='manager' order by sal; 
-- 先执行from,然后执行where,再执行selelct,最后才执行order by按照sal进行排序输出

(3)按照多个字段排序,如:首先按照job排序,再按照sal排序;多个字段排序只有前面个字段相等时才会按照后面一个字段进行排序。

select * from emp order by job,sal;
-- 先按照job字段排序,当job相等才会按照sal排序

2. 手动指定排序顺序

(1)手动指定按照薪水由小到大排序:asc;默认也是asc从小到大排序的!

select * from emp order by sal asc;

 (2)手动指定按照薪水由大到小排序:desc

select * from emp order by sal desc;

3. 多个字段排序

(1)按照job和薪水倒序

select * from emp order by job desc,sal desc;

(2)按照工资的降序排列,当工资相同的时候再按照名字的升序排列

注意:越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候,才会启用后面的字段

select ename,sal from emp order by sal desc, ename asc;

4.  使用字段的位置(下标)来排序

也就是通过下标进行排序,默认是从1开始,例如:sal下标是6,那么按照薪水升序;不健壮,不建议使用

select * from emp order by 6; --下标从1开始

总结:一定要注意执行的顺序

select 
        字段                     3
from
        表名                     1
where
        条件                     2
order by
        ....                        4
    
order by是最后执行的!

MySQL查询(简单查询,条件查询,排序查询)

1.基础查询

/*------------------------------------基础查询-----------------------------------------*/
/*
语法:select 查询列表 
      from 表名;

类似于println()

特点:
1.查询表中的字段、常量、表达式、函数
2.查询的结果是一个虚拟的表格
*/

#使用指定的库,
USE myemployees;

#查询表结构,并查询其中的全部数据
DESC departments;

#1.查询单个字段
SELECT last_name 
FROM employees;

#2.查询多个字段
SELECT last_name,salary 
FROM employees;

#3.查询所有
SELECT * 
FROM departments;

#4.查询常量值
SELECT 100;
SELECT 'tom';

#5.查询表达式
SELECT 100/1;

#6.查询函数
SELECT VERSION();

#7.起别名
/*
起别名
  ①方便理解
  ②如果查询的字段有重名的情况,使用别名可以区分开来
  
  注意:当别名中有关键字的时候,得加上引号(单双都可)
*/

#方式1,使用as
SELECT 100%99 AS 结果;
SELECT last_name AS, first_name ASFROM employees;

#方式2,使用空格
SELECT last_name 姓,first_name 名 
FROM employees;

#8.去重,关键字distinct
SELECT DISTINCT department_id 
FROM employees;

#9.MySQL中 特殊字符 + 的作用
/*
  只有一个作用:做运算符
    select 1 + 2;两个操作数都是数值型,做加法运算
    select '1' + 2;其中一个为字符型,试图将字符型数值转换成数值型,
                   成功,做加法运算
    select 'na' + 1;失败,将字符型转换为0
    select null+1;  其中有一个null,则结果为null
*/

#10.连接,关键词:concat
SELECT CONCAT(last_name,first_name) AS 姓名
FROM employees;

#11.判断是否为空,关键字:ifnull
/*
  当时用concat拼接查询,其中某字段为空,则此行查询结果为空,如下
*/
SELECT CONCAT(last_name,first_name,commission_pct) AS out_put
FROM employees;
/*
  为了避免上述情况,使用关键字:ifnull
*/

SELECT  CONCAT(last_name , ',' , first_name , ',' , IFNULL (commission_pct,0) ) AS out_put
FROM employees;

2.条件查询

/*------------------------------------条件查询-----------------------------------------*/
/*
  语法:select 查询列表
        from 表名
        where 筛选条件;
        
  分类:
        ①按条件表达式筛选
		条件运算符:> < = != <> >= <=
	②逻辑表达式筛选
		逻辑运算符:&& || !
			    and or not
	③模糊查询
		like   between and    in    is null
*/

#1.按条件表达式筛选
SELECT *
FROM employees
WHERE salary >= 10000;

SELECT CONCAT(last_name,first_name) AS 姓名 , salary
FROM employees
WHERE salary >= 12000;

#2.按逻辑表达式筛选
/*
  注意:and优先级高于or
*/

SELECT CONCAT(last_name,first_name) AS 姓名 , salary  
FROM employees
WHERE salary >= 12000 AND salary <= 20000 OR salary <= 5000;

#3.模糊查询
/*
like

  ①搭配通配符
	通配符:
	  % 任意多个字符,包含0个
	  _ 任意单个字符
  
*/
SELECT *
FROM employees
WHERE last_name LIKE 'c%';

SELECT *
FROM employees
WHERE last_name LIKE 'c%e_';

SELECT last_name
FROM employees
WHERE last_name LIKE '_$_%' ESCAPE '$'; #等同于'_/_%',ESCAPE:指定转义字符(随意指定)

/*
between  and
  
  注意:两个临界值不能调换顺序,运行不会报错,但会导致结果出错
*/
SELECT * 
FROM employees
WHERE employee_id BETWEEN 99 AND 113; #等同于 >= 99 and <= 113

/*
in
  
  判断某字段的值是否属于in列表中的一项
  
  特点:
	①提高语句简洁度
	②in列表的值类型必须一致或兼容
	③列表值要加引号
*/

SELECT CONCAT(last_name,first_name) AS 姓名
FROM employees
WHERE job_id IN ('AD_PRES','IT_PROG','AD_VP');

/*
is null
  
  =不能判断null,得用 is null 或 is not null 判断 null
*/
SELECT CONCAT(last_name , ',' , first_name) 姓名
FROM employees
WHERE commission_pct IS NULL;

#4.安全等于 <=>
/*
  既可以判断null值,又可以判断普通数值
  可读性没有 is null 高
*/
SELECT CONCAT(last_name , ',' , first_name) 姓名
FROM employees
WHERE commission_pct <=> NULL;

SELECT CONCAT(last_name , ',' , first_name) 姓名
FROM employees
WHERE salary <=> 10000;

3.排序查询

/*------------------------------------排序查询-----------------------------------------*/
#1.ORDER BY ASC|DESC
/*
  ASD:升序查询,默认升序查询
  DESC:降序查询
  
  格式:
	select 查询列表
	from 表
	[where 筛选条件]
	order by 查询列表 [asc|desc]
*/
SELECT * 
FROM employees
WHERE commission_pct IS NULL
ORDER BY salary DESC;

SELECT *,salary*12*(1 + IFNULL(commission_pct,0)) AS 年薪 #表达式查询
FROM employees
ORDER BY salary*12*(1 + IFNULL(commission_pct,0)) DESC;

SELECT *,salary*12*(1 + IFNULL(commission_pct,0)) AS 年薪  
FROM employees
ORDER BY 年薪 DESC;                                       #别名查询

/*
length: 字节长度
*/
SELECT LENGTH(last_name) 字节长度,last_name 姓,salary 薪水
FROM employees
ORDER BY 字节长度 DESC;

SELECT * 
FROM employees
ORDER BY salary DESC,employee_id ASC;                     #多条件排序

以上是关于MySQL基础篇 | 简单的查询条件查询排序查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询(简单查询,条件查询,排序查询)

mysql 基础篇-数据查询

MySQL查询操作(基础篇)

条件查询+排序查询操作(MySQL)

MySql学习 —— where / having / group by / order by / limit 简单查询

MySQL之查询篇(简单查询以及条件)