第二章 DQL语言的学习1(基础、条件和排序查询)

1、myemployees.sql库的介绍

选中主机名称,右键执行SQL脚本,选择myemployees.sql数据库,点击执行,然后刷新就能看到该数据库了。

在这里插入图片描述 在这里插入图片描述

employees(员工表)、departments(部门表)、locations(位置表)、jobs(工种表)信息介绍:

在这里插入图片描述

2、数据查询语言(DQL)学习

在这里插入图片描述

  • 基础查询
  • 条件查询
  • 排序查询
  • 单行函数
  • 分组函数
  • 分组查询
  • 连接查询
  • 子查询
  • 分页查询
  • union联合查询

2.1 基础查询

#进阶1:基础查询
/*
语法:
SELECT 查询列表 from 表名;
特点:
1、通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
2、查询列表:表中的字段、常量值、表达式、函数
*/

USE myemployees;
#1、查询表中的单个字段
SELECT last_name FROM employees;

在这里插入图片描述

 #2、查询表中的多个字段
SELECT last_name,salary,email FROM employees;

在这里插入图片描述

#3、查询表中的所有字段
#(双击一下想查询的就行,不用自己输入,然后选中F12格式化格式,更好看)
#着重号(`)可以去掉,不去掉也行
SELECT 
  `first_name`,
  `last_name`,
  `email`,
  `phone_number`,
  `job_id`,
  `salary`,
  `commission_pct`,
  `manager_id`,
  `department_id`,
  `hiredate` 
FROM
  employees ;
  
#3、方法2(不足:查询的顺序和原始库中的一模一样)
SELECT * FROM employees;

在这里插入图片描述

#4、查询常量值
SELECT 100;
SELECT ‘john’;

在这里插入图片描述 在这里插入图片描述

#5、查询表达式
SELECT 100*98;

在这里插入图片描述

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

在这里插入图片描述

# 7、起别名
/*
1、便于理解
2、如果要查询的字段有重名的情况,使用别名可以区分开
*/
#方法1:使用as
SELECT 100*98 AS 结果;
SELECT last_name AS,first_name ASFROM employees;
#方法2:去掉as即可
SELECT last_name 姓,first_name 名 FROM employees;

在这里插入图片描述
在这里插入图片描述

#案例:查询salary,显示结果为out put
SELECT salary AS OUT put FROM employees;  # 报错
SELECT salary AS "OUT put" FROM employees;

在这里插入图片描述

#8、去重
# 案例:查询员工表中涉及到的所有的部门编号
SELECT department_id FROM employees;
SELECT DISTINCT department_id FROM employees;

在这里插入图片描述
在这里插入图片描述

#9、+号的作用
/*
mysql中的加号只有一个功能:运算符(两个操作数都为数值型)
select 100+90; 两个操作数都为数值型,则做加法
select '123'+90; 其中一方是字符型,将试图将字符型数值转换成数值型(这个可以转换成成功)
select 'john'+90; 如果转换失败,就将字符型转换成0
select null+90; 只要其中一方为null,则结果肯定为null
*/
#案例:查询员工名和姓连接成一个字段,并显示成 姓名
SELECT 
  last_name + first_name AS 姓名 
FROM
  employees ;
  
# mysql里面做拼接使用concat,不使用+号
SELECT CONCAT('a','b','c') AS 拼接;
  
SELECT 
  CONCAT(last_name, first_name) AS 姓名 
FROM
  employees ;

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

#10、显示表departments的表结构,并查询其中的全部数据
DESC departments;
SELECT * FROM departments;

在这里插入图片描述
在这里插入图片描述

#11、显示表employees中的部分列,各个列之间用逗号连接,列头显示成out_put
SELECT 
  CONCAT(
    `first_name`,
    ',',
    `last_name`,
    ',',
    `email`
  ) AS out_put 
FROM
  employees ;

在这里插入图片描述

#11.2 如果列中有数据是null,则利用concat返回的是null,所以需要判断一下
#用到ifnull函数,如果为null返回指定的值,否则返回原来的值
SELECT 
  IFNULL(`commission_pct`, 0) AS 奖金率,
  commission_pct 
FROM
  employees ;
  
  
SELECT 
  CONCAT(
    `first_name`,
    ',',
    `last_name`,
    ',',
    `email`,
    ',',
    IFNULL(`commission_pct`,0)
  ) AS out_put 
FROM
  employees ;

在这里插入图片描述
在这里插入图片描述

2.2 条件查询

#进阶2:条件查询
/*
语法:
	select
		查询列表
	from
		表名
	where
		筛选条件;

分类:
	一、按条件表达式筛选
	条件运算符:> < = !=(mysql独有的不等于<>,因此不建议使用!=) >= <=
	
	二、按逻辑表达式筛选
		and(&&):两个条件如果同时成立,结果为true,否则为false
		or(||):两个条件只要有一个成立,结果为true,否则为false
		not(!):如果条件成立,则not后为false,否则为true
		
	三、模糊查询
		like
		between and
		in
		is null	
*/

#一、按条件表达式筛选

#案例1:查询工资>120000的员工信息
SELECT
	*
FROM
	employees
WHERE
	salary>12000;

在这里插入图片描述

#案例2:查询部门编号不等于90号的员工名和部门编号
SELECT
	last_name,
	department_id
FROM
	employees
WHERE
	department_id<>90;

在这里插入图片描述

#二、按逻辑表达式筛选
#案例1:查询工资在10000到20000之间的员工名,工资以及奖金
SELECT
	last_name,
	salary,
	commission_pct
FROM
	employees
WHERE
	salary>=10000 AND salary<=20000;

在这里插入图片描述

#案例2:查询部门编号不是在90-110之间的,或者工资高于15000的员工信息
SELECT
	*
FROM
	employees
WHERE
	salary>=15000 OR NOT(department_id>=90 AND department_id<=110);

在这里插入图片描述

#三、模糊查询
/*
like:
一般与通配符搭配使用
	%(任意多个字符,包含0个)%
	_任意单个字符
*/
#案例1:查询员工名中包含字符au的员工信息
SELECT
	last_name
FROM
	employees
WHERE
	last_name LIKE '%au%'

在这里插入图片描述

#案例2:查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT
	last_name,
	salary
FROM
	employees
WHERE
	last_name LIKE '__n_l%';

#案例3:查询员工名中第2个字符为_的员工名和工资,自定义转义字符
SELECT
	last_name,
	salary
FROM
	employees
WHERE
	last_name LIKE '_$_%' ESCAPE '$';
	
#案例4:查询有奖金率的员工like会把null去掉的
SELECT
	`commission_pct`
FROM
	employees
WHERE
	`commission_pct` LIKE '%%';

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

#2.between and
/*
提高语句的简洁度;
包含临界值;
两个临界值不能调换顺序
*/
#案例1:查询员工编号在100-120之间的员工信息
SELECT 
  * 
FROM
  employees 
WHERE 
	#employee_id >= 120 and employee_i <= 100 ;
	employee_id BETWEEN 100 AND 120 ;

#3、in
/*
含义:判断某字段的值是否属于in列表中的某一项
特点:
	使用in更简洁
	in列表的值类型必须统一或者兼容
*/
#案例1:查询员工的工种编号IT_PROG\AD_VP\AD_PRES中的一个员工名和工种编号
SELECT 
  last_name,
  job_id 
FROM
  employees 
WHERE 
	#job_id = 'IT_PROT' OR job_id = 'AD_VP' OR job_id = 'AD_PRES' ;
	job_id IN('IT_PROG','AD_VP','AD_PRES');

在这里插入图片描述

在这里插入图片描述

#4、is null
/*
> < = <>不能判断null值,可以判断数值等其他类型的
is null 或者 is not null 仅仅可以判断null,不可以判断其他(is 1200)是不行的。
<=>:安全等于,既可以判断数值,也可以判断null(可读性差,不建议使用)
*/
#案例1:查询没有奖金的员工名和奖金率
SELECT
	last_name,
	commission_pct
FROM
	employees
WHERE
	commission_pct IS NULL;
	commission_pct <=>NULL;


#案例2:查询工资为12000的员工名和工资
SELECT
	last_name,
	salary
FROM
	employees
WHERE
	#salary IS 12000;  报错
	salary =12000;
	salary <=>12000;

在这里插入图片描述
在这里插入图片描述

#测试
# 1\查询员工工号为176的姓名,部门号,年薪
SELECT
	last_name,
	department_id,
	employee_id,
	salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
	employees
WHERE
	employee_id=176

在这里插入图片描述
注意:
ifnull:判断是否为null,如果是null,返回指定的值,否则返回原来的值;
isnull:判断是否为null,如果是返回1,否则返回0;

2.3 排序查询

# 进阶3:排序查询
/*
语法:
	select 查询列表
	from 表
	【where 筛选条件】
	order by 排序列表 【asc升序|desc降序】默认是升序
特点:
order by可以支持单个字段、多个字段、表达式、函数、别名
order by一般放在查询语句的最后面,limit子句除外
*/

# 案例1:查询员工信息,要求工资从高到低排序
SELECT last_name,salary FROM employees ORDER BY salary DESC;

# 案例2:查询部门编号>=90的员工信息,按入职时间先后排序
SELECT 
	last_name,
	department_id,
	hiredate
FROM 
	employees 
WHERE department_id>=90
ORDER BY hiredate ASC;
# 案例3:按照年薪的高低显示员工的信息和年薪(将by后面的表达式换成“年薪”也可以)
SELECT 
	last_name,
	salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
	employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

# 案例4:按照姓名的长度显示员工的姓名和工资(按函数排序)
SELECT 
	LENGTH(last_name) AS 字节长度,
	last_name,
	salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
	employees
ORDER BY 字节长度 DESC;
# 案例5:先按工资升序排序,再按照员工编号降序排序
SELECT 
	employee_id,
	last_name,
	salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
	employees
ORDER BY 年薪 ASC,employee_id DESC;

在这里插入图片描述
在这里插入图片描述

测试

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值