MySQL【DQL语言(数据查询语言)】

进阶1:基础查询

1、

语法:
SELECT 要查询的东西
【FROM 表名】;

类似于Java中 :System.out.println(要打印的东西);
特点:
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、可以是表达式、可以是字段、可以是函数
USE myemployees;
SELECT `first_name`,`job_id`,`salary` FROM employees;
SELECT *FROM `employees`;
运行F9,格式化代码;
//查询常量值
SELECT 1;
SELECT `rose`;
//查询表达式
SELECT `100%98`;

2、起别名:便于理解,如果查询的字段有重名的情况,使用别名可以区分开来。

#方式一:使用
SELECT 100%98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
方式二:
SELECT last_name 姓,first_name 名 FROM employees;
注意:
查询salary,显示结果为 out put,尽量加个引号
SELECT salary AS ‘out put’ FROM employees;

3、去重:
案例:查询员工表中涉及到的所有部门编号

select department_id FROM employees;

4、mysql中的+号:
仅仅只有一个功能,运算符
select 100+90;两个操作数都为数值型,则作加法运算;
select ‘123’+90;其中一个为字符型,试图将字符型数值转换成数值型,如果转换成功,则继续做加法运算;如果转换失败,则将字符型数值转换成0.
select null+10; 只要一方为null,则结果就位null;
在这里插入图片描述

进阶2:条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
select 
	要查询的字段|表达式|常量值|函数
from 
	表
where 
	条件 ;

分类:
一、条件表达式
	示例:salary>10000
	条件运算符:
	> < >= <= = != <>

二、逻辑表达式
示例:salary>10000 && salary<20000

逻辑运算符:

	and(&&):两个条件如果同时成立,结果为true,否则为false
	or(||):两个条件只要有一个成立,结果为true,否则为false
	not(!):如果条件成立,则not后为false,否则为true

三、模糊查询
示例:last_name like 'a%'

进阶2:条件查询

条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
select 
	要查询的字段|表达式|常量值|函数
from 
	表
where 
	条件 ;

分类:
一、条件表达式
	示例:salary>10000
	条件运算符:
	> < >= <= = != <>

二、逻辑表达式
示例:salary>10000 && salary<20000

逻辑运算符:

	and(&&):两个条件如果同时成立,结果为true,否则为false
	or(||):两个条件只要有一个成立,结果为true,否则为false
	not(!):如果条件成立,则not后为false,否则为true

三、模糊查询
示例:last_name like '%a%' -------找包含a的字符
#案例1:查询员工名中包含字符a的员工信息
SELECT 
     *
FROM
    `employees`
WHERE
    last_name LIKE '%a%' ;
    通配符:%  任意多个字符,包含0个字符;
           —  任意单个字符

#案例2:查询员工名第三个字符为e,第五个字符为a的与员工名和工资
SELECT 
  last_name,
  salary 
FROM
  employees 
WHERE  
  last_name LIKE '__n_l%' ;
#案例3:查询员工名中第二个字符为_的员工名  
SELECT 
  last_name 
FROM
  employees 
WHERE 
   last_name LIKE '_\_%' ;
   #last_name LIKE '_$_%' escape '$';  或者这样;用escape转义;

小Tips:
1、BETWEEN ~ AND ~

> 查询员工编号在100200之间的员工信息
  SELECT 
    	    * 
     FROM
          employees 
     WHERE
     employee_id BETWEEN 100 AND 120;

2、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' ;
#--------------------------------------
  job_id IN ('IT_PROG','AD_VP' ,'AD_PRES');
#--------------------------------------

3、is null

#查询没有奖金的员工名和奖金率 
SELECT 
  last_name,
  commission_pct
FROM 
	employees
WHERE 
	commission_pct IS NULL;     没有奖金的人
	commission_pct IS NOT NULL;    有奖金的人
	commission_pct IS NULL;  //报错

4、安全等于 <=>

commission_pct <=> NULL;

5、is null PK <=>

 is null: 仅仅可以判断null的值
 <=>:    既可以判断null的值,又可以判断普通的数值

6、案例讲解 :
       (1)查询没有奖金,且工资小于18000的salary,last_name

SELECT 
  salary,
  last_name 
FROM
  employees 
WHERE commission_pct IS NULL 
  AND salary < 18000 ;

(2)查看employees表中,job_id不为 ‘IT’,或者工资为12000的员工信息

SELECT 
  * 
FROM
  `employees` 
WHERE 
job_id <> 'IT' 
  OR salary = 12000 ;

(3)查询部门department表中涉及到哪些位置编号

SELECT DISTINCT   //去重
  location_id 
FROM
  department ;

(4)
在这里插入图片描述
如果判断字符有null的值(commission_pct),则不一样。

进阶3:排序查询

语法:
select
	要查询的东西
from
	表
where 
	条件

order by 排序的字段|表达式|函数|别名 【asc|desc】 默认是升序
1、查询部门编号>=90的员工信息,按入职时间的先后顺序进行排序
SELECT 
  * 
FROM
  employees 
WHERE 
department_id >= 90 
ORDER BY hiredate ASC ;

2、按年薪的高低显示员工的信息和年薪【按表达式排序】
SELECT*,salary*12*(1+IFNULL(commission_pct,0))  年薪
FROM employees
ORDER BY  DESC;
2.1、按年薪的高低显示员工的信息和年薪【按别名排序】
SELECT*,salary*12*(1+IFNULL(commission_pct,0))
FROM employees
ORDER BY 年薪 DESC;
3、按姓名的长度显示员工的姓名和工资【按函数排序】
SELECT 
  LENGTH(last_name) 字节长度,
  last_name,
  salary 
FROM
  employees 
ORDER BY 
	LENGTH(last_name) DESC;

在这里插入图片描述

4、查询员工信息,要求先按工资排序,再按员工编号排序【按多个字段排序】
SELECT 
  * 
FROM
  employees 
ORDER BY 
	salary ASC,
	employee_id DESC ;

案例:

#1、查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序
SELECT 
  last_name,
  department_id,
  salary * 12 * (1+ IFNULL(commission_pct, 0)) 年薪
FROM
  employees 
ORDER BY 年薪 DESC,
	last_name ASC;  
  
#2、选择工资不在800017000的员工的姓名和工资,按工资降序
SELECT 
  last_name,
  salary 
FROM
  `employees` 
WHERE salary < 8000 
  OR salary > 17000 #where salary not between 8000 and 17000
ORDER BY 
	salary DESC ;

#3、查询邮箱中包含e的与员工信息,并先按邮箱的字节数降序,再按部门号升序   
SELECT 
  * 
FROM
  `employees` 
WHERE email LIKE '%e%' 
ORDER BY 
LENGTH(email) DESC,
  department_id ASC ;

进阶4:常见函数

​ 一、单行函数
​ 1、字符函数
​ concat拼接
​ substr截取子串
案例:姓名中首字母大写,其他字符小写然后用——拼接,显示出来

SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'-',LOWER(SUBSTR(last_name,2))) out_put
FROM employees;

​ upper转换成大写
​ lower转换成小写
​ trim去前后指定的空格和字符
​ ltrim去左边空格
​ rtrim去右边空格
​ replace替换
​ lpad左填充
​ rpad右填充
​ instr返回子串第一次出现的索引
​ length 获取字节个数

2、数学函数
round 四舍五入
rand 随机数
floor向下取整
ceil向上取整
mod取余
truncate截断
3、日期函数
now当前系统日期+时间
curdate当前系统日期
curtime当前系统时间
str_to_date 将字符转换成日期

#查询入职时间为1992--4-3的员工信息
SELECT * FROM `employees` WHERE hiredate='1992-4-3';
SELECT * FROM `employees` WHERE hiredate='4-3-1992';#你可能拿到的数据是,年份到后面去了。
SELECT * FROM `employees` WHERE hiredate=STR_TO_DATE('4-3-1992','%c-%d-%Y');

date_format将日期转换成字符

#查询有奖金的员工名和入职日期(xx月/xx日 xx年)
SELECT last_name ,DATE_FORMAT(hiredate,'%m月/%d日 %Y年') 入职日期 
FROM employees
WHERE 
	commission_pct IS NOT NULL;
4、流程控制函数
	if 处理双分支
	
	case语句 处理多分支
		情况1:处理等值判断
		情况2:处理条件判断
SELECT IF(10>9,1,2);
SELECT 
  last_name,
  commission_pct,
  IF(
    commission_pct IS NULL,
    '没奖金,呵呵!' , '有奖金,哈哈'
  ) 备注 
FROM
  employees;

case的两种用法:

SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
SELECT salary 原始工资,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 最终结果
FROM employees;
5、其他函数
	version版本
	database当前库
	user当前连接用户

案例讲解:

1、将员工的名字按首字母排序,并写出姓名的长度
SELECT
  last_name 姓名,
  LENGTH(last_name) 姓名长度,
  SUBSTR(last_name, 1, 1) AS 首字符
FROM
  employees 
ORDER BY 首字符 ; 

在这里插入图片描述
直接按last_name排z
在这里插入图片描述
二、分组函数

	sum 求和
	max 最大值
	min 最小值
	avg 平均值
	count 计数
SELECT SUM(salary),ROUND(AVG(salary),2)平均,MIN(salary)最小,MAX(salary)最大,COUNT(salary)总共  FROM `employees

在这里插入图片描述

	特点:
	1、以上五个分组函数都忽略null值,除了count(*)
	2、sum和avg一般用于处理数值型
		max、min、count可以处理任何数据类型
    3、都可以搭配distinct使用,用于统计去重后的结果
	4、count的参数可以支持:
		字段、*、常量值,一般放1

	   建议使用 count(*)

在这里插入图片描述

进阶5:分组查询

语法:
select 查询的字段,分组函数
from 表
group by 分组的字段
#查询每个工种的最高工资
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
#查询邮箱中带‘a’的,每个部门的平均工资
SELECT AVG(salary),department_id
FROM `employees`
WHERE `email` LIKE '%a%'
GROUP BY `department_id`;
特点:
1、可以按单个字段分组
2、和分组函数一同查询的字段最好是分组后的字段
3、分组筛选
		针对的表	位置			关键字
分组前筛选:	原始表		group by的前面		where
分组后筛选:	分组后的结果集	group by的后面		having

4、可以按多个字段分组,字段之间用逗号隔开
5、可以支持排序
6、having后可以支持别名

案例:

查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT MIN(salary),`manager_id`
FROM `employees`
WHERE `manager_id` IS NOT NULL
GROUP BY `manager_id`
HAVING MIN(salary)>=6000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值