MySQL基础之DQL语言

DQL(Data Query Language):数据查询(select)语言。

1.基础查询

语法:select 查询列表 from 表名;
类似于:System.out.println(打印东西);

特点:
1、查询列表可以是:表中的字段、常量值、表达式、函数
2、查询的结果是一个虚拟的表格

建议在首句写上 “USE 库名;”语句。表示在此库中查询。

2.功能

  1. 查询表中的单个字段
SELECT last_name FROM employees;
  1. 查询表中的多个字段
SELECT last_name,email,salary FROM employees;
  1. 查询表中的所有字段
    方式一:
SELECT
 `first_name`,`last_name`,`email`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`
FROM 
 employees;

``不是单引号,是着重号,代表一个字段。可去掉。用于区分字段和关键字。
方式二:

SELECT * FROM employees;
  1. 查询常量值
SELECT 100;
SELECT 'join';   #MySQL中不区分字符和字符串
  1. 查询表达式
SELECT 100%98;
  1. 查询函数
SELECT VERSION();
  1. 为字段起别名

优点:
①便于理解
②如果要查询的字段有重名的情况,使用别名可以区分开来

方式一:

SELECT 100%98 AS 结果;
SELECT last_name AS,first_name ASFROM employees;

方式二:

SELECT last_name 姓 FROM employees;

案例:查询salary,显示结果为 out put

SELECT salary AS "out put" FROM employees;

out是关键字,所以要用双引号。

  1. 去重
    案例:查询员工表中涉及到的所有的部门编号
SELECT  DISTINCT department_id FROM employees;
  1. +号的作用
    Java中的+号:
    ①运算符,两个操作数都为数值型
    ②连接符,只要有一个操作数为字符串

MySQL中的+号:
只有一个功能:运算符

SELECT 100+90;   #190

两个操作数都为数值型,则做加法运算。

SELECT '123'+10;   #133
SELECT 'join'+90;  #90
SELECT null+10;    #null

只要其中一方为字符型,试图将字符型数值转换成数值型,如果转换成功,则继续做加法运算;如果转换失败,则将字符型数值转换成0;只要其中一方为null,则结果为null。

案例:查询员工名和姓连成一个字段,并显示为 姓名

SELECT 
 CONCAT(last_name,first_name) AS 姓名 	#CONCAT为一个函数
FROM
 employees;
  1. 显示表的结构
DESC  表名;

案例:显示出表employees的4列, 各列之间用逗号连接, 列头显示成OUT_PUT。

SELECT
 CONCAT(`first_name`,',',`phone_number`,',',`job_id`,',',IFNULL(`commission_pct`,0)) AS OUT_PUT
 #commission_pct可能为NULL,所以使用IFNULL函数使当commission_pct为NULL时显示为0
FROM 
 employees;

3.进阶查询1:条件查询

语法:

SELECT
	查询列表 #第三步
FROM	
	表名	#第一步
WHERE
	筛选条件; #第二步

分类:

  • 按条件表达式筛选
    简单条件运算符:>、 <、 =、!=(<>)、 >=、 <=
#案例一:查询工资>12000的员工信息
SELECT 
 *
FROM
 employees
WHERE
 salary>12000;
 
#案例二:查询部门标号不等于90的员工名和部门编号
SELECT 
 `first_name`,`department_id`
FROM 
 employees
WHERE
 department_id<>90;
  • 按逻辑表达式筛选
    逻辑运算符:&&、||、!或and、or、not(推荐使用)
    作用:用于连接条件表达式
    &&和and:两个条件都为true,结果为true,反之为false。
    ||和or:只要有一个条件为true,结果为true,反之为false。
    !和not如果连接的条件本身为false,结果为true,反之为false。
#案例三:查询工资再10000到20000之间的员工名、工资及奖金
SELECT 
 `first_name`,`salary`,`commission_pct`
FROM
 employees
WHERE
 salary>=10000
AND
 salary<=20000;
#案例四:查询部门编号不是在90到110之间,或工资高于15000的员工信息
SELECT
 *
FROM
 employees
WHERE
 `manager_id`<90 OR `manager_id`>110 OR `salary`>15000;
 
SELECT
 *
FROM
 employees
WHERE
 NOT(`manager_id`>=90 AND `manager_id`<=110) OR `salary`>15000;

4.进阶查询2:模糊查询

like、between and、in、is null

1.like
特点:

  • 一般和通配符搭配使用,可以判断字符型或数值型。
    通配符:
    ①%:任意多个字符,包含零个字符
    ②_ :任意单个字符

案例1:查询员工名中包含字符a的员工信息

SELECT
 *
FROM
 employees
WHERE 
 first_name LIKE '%a%';  #字符必须要使用单引号,%代表一种通配符,代表是任一个字符。默认不区分大小写。

案例二:查询员工名中第三个字符为e,第五个字符为a的员工名和工资。

SELECT
 first_name,
 salary
FROM
 employees
WHERE
 first_name LIKE '__e_a%';

案例三:查询员工中第二个字符为_的员工的姓

SELECT 
 last_name
FROM 
 employees
WHERE
 last_name LIKE '_\_%'; # 需要使用\进行转义
 #last_name LIKE '_$_%' ESCAPE '$'; 可使用$代替\

2.between…and
案例一:查询员工编号在100到120之间的员工信息

SELECT
 *
FROM
 employees
WHERE
 employee_id>=100 AND employee_id<=120;

#----------------------------
SELECT
 *
FROM
 employees
WHERE
 employee_id BETWEEN 100 AND 120;

Notice:
①可提高语句的简洁度
②包含临界值
③两个临界值不要调换位置

3.in

含义:判断某字段的值是否属于in列表中的某一项。

特点:
①使用in提高语句简洁度
②in列表的值类型必须统一或兼容(存在隐式转换)
③不支持通配符

案例:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工姓和工种编号

SELECT
 last_name,
 job_id
FROM
 employees
WHERE 
 job_id='IT_PROG' OR job_id='AD_VP' OR job_id='AD_PRES';
#------------------------------------------------------
SELECT
 last_name,
 job_id
FROM
 employees
WHERE 
 job_id IN ('IT_PROG','AD_VP','AD_PRES');

4.is null

=或<>不能用于判断null值,应使用 is null 或 is not null

案例:查询没有奖金的员工姓和奖金率

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.<=>安全等于
案例:查询没有奖金的员工姓和奖金率

SELECT 
 last_name,
 commission_pct
FROM
 employees
WHERE
 commission_pct <=> NULL;#不能用 =号直接判断,应用安全等于

案例:查询工资为12000的员工信息

SELECT 
 *
FROM
 employees
WHERE
 commission_pct <=> 12000;

is null PK <=>:

  • IS NULL:仅仅可以判断NULL值,可读性较高,建议使用;
  • <=>:既可以判断NULL值,又可以判断普通数值,可读性差。

5.练习

  • 案例:查询员工号为176的员工的姓和部门号和年薪
SELECT
 `last_name`,
 `department_id`,
 `salary`*12*(1+IFNULL(`commission_pct`,0)) AS 年薪
FROM 
 employees;
  • 案例:查询没有奖金,且工资小于18000的salary、last_name
SELECT
 `last_name`,
 `salary`,
 `commission_pct`
FROM 
 employees
WHERE
 `commission_pct` IS NULL AND `salary`<18000;
  • 案例:查询employees表中,jod_id不为‘IT’ 或者 工资为12000的员工信息
SELECT 
 *
FROM
 employees
WHERE
 job_id <> 'IT' OR salary=12000;
  • 案例:查看部门的departments表的结构
DESC departments;

效果如下:
在这里插入图片描述

  • 案例:查询departments表中涉及到了哪些位置编号
SELECT DISTINCT
 `location_id`
FROM
 departments;
  • 经典面试题:问:SELECT * FROM employees; 和 SELECT * FROM employees WHERE commission_pc LIKE ‘%%’ AND last_name LIKE ‘%%’;结果是否一样?
    答:如果判断的字段有null值,则结果不同。

6.进阶查询3:排序查询

1.引入

SELECT * FROM employees;

2.语法:

SELECT 查询列表	③
FROM 表		①
[WHERE 筛选条件]ORDER BY 排序列表 [ASC|DESC];

3.特点
(1)ASC代表升序,DESC代表降序,不写默认为升序;
(2)ORDER BY 子句中可以支持单个字段、多个字段、表达式、函数、别名;
(3)ORDER BY 子句一般放在查询语句的最后面,但LIMIT子句除外。

案例1:查询员工信息,要求按工资排序

SELECT * FROM employees ORDER BY salary DESC;#从高到低
SELECT * FROM employees ORDER BY salary ASC;#从低到高

案例2:查询部门编号>=90的员工信息,按入职时间的先后进行排序(添加筛选条件)

SELECT * 
FROM employees 
WHERE `department_id`>=90
ORDER BY `hiredate` ASC;

案例3:按年薪的高低显示员工的信息和年薪(按表达式排序)

SELECT *,salary*12*(1+IFNULL(`commission_pct`,0)) 年薪
FROM employees
ORDER BY salary*12*(1+IFNULL(`commission_pct`,0)) DESC;

案例4:按年薪的高低显示员工的信息和年薪(按别名排序)

SELECT *,salary*12*(1+IFNULL(`commission_pct`,0)) 年薪
FROM employees
ORDER BY 年薪 DESC;

案例5:按姓名的长度显示员工的姓和工资

SELECT LENGTH(`last_name`) 字节长度,last_name,salary
FROM employees
ORDER BY LENGTH(`last_name`) DESC;

案例6:查询员工信息,要求先按工资升序排序,再按员工编号降序排序(按多个字段排序)

SELECT * 
FROM employees 
ORDER BY `salary` ASC,`employee_id` DESC;

案例:查询员工的姓名和部门编号和年薪,按年薪降序,按姓名升序

SELECT `last_name`,`department_id`,salary*12*(1+IFNULL(`commission_pct`,0)) 年薪
FROM employees
ORDER BY 年薪 DESC,`last_name` ASC;

案例:选择工资不在8000到17000的员工的姓名和工资,按工资降序排序

SELECT last_name,salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC;

案例:查询邮箱中包含a的员工信息,并先按邮箱的字节数降序,再按部门号升序

SELECT *
FROM employees
WHERE email LIKE '%a%'
ORDER BY LENGTH(email) DESC,`department_id` ASC;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值