DQL(数据查询语言)学习

基本的SELECT语句

1、查询所有列。
①查询列表可以是:表中的字段、常量值、表达式、函数;
②查询的结果是一个虚拟的表格。

语法:select * from 表名

不推荐,*号效率不行,如果一定要查询所有,手动把*号替换成所有的列名,不过这有工具可以实现的。

2、查询特定的列
语法:select 查询列表 from 表名

3、列的别名
①便于理解,方便使用;
②在多表查询的时候,如果要查询的字段有重名,使用别名区分。

语法:select id from 表名 别名

4、字符串

日期和字符只能在单引号中出现。  每当返回一行时,字符串被输出一次。

5、显示表结构
DESC 表名;

MySQL中 的 “ + ” 号

java中的+号:
①运算符,两个操作数都为数值型
②连接符,只要有一个操作数为字符串

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

 两个操作数都为数值型,则做加法运算
select 100+90;

只要其中一方为字符型,试图将字符型数值转换成数值型,如果转换成功,则继续做加法运算
select '123'+90;
如果转换失败,则将字符型数值转换成0
select 'john'+90;	

只要其中一方为null,则结果肯定为null
select null+10; 

过滤和排序数据

过滤的三大分类

在过滤中使用到的关键字有:where、比较运算符、between and、 like、in、null、逻辑运算符

一、按条件表达式筛选

简单条件运算符:> < = != <> >= <=

<>是不等于的意思,虽然使用效果和 != 相同,但是在MySQL中还是使用<>的次数多。
#案例1:查询工资>12000的员工信息

SELECT 
	*
FROM
	employees
WHERE
	salary>12000;

#案例2:查询部门编号不等于90号的员工名和部门编号

SELECT 
	last_name,
	department_id
FROM
	t_mysql_employees
WHERE
	department_id<>90;

二、按逻辑表达式筛选
逻辑运算符:用于连接条件表达式

&& || !
and or not
	
&&和and:两个条件都为true,结果为true,反之为false
||或or: 只要有一个条件为true,结果为true,反之为false
!或not: 如果连接的条件本身为false,结果为true,反之为false

#案例1:查询工资在10000到20000之间的员工名、工资以及奖金

SELECT
	last_name,
	salary,
	commission_pct
FROM
	t_mysql_employees
WHERE
	salary>=10000 AND salary<=20000;

#案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息

SELECT
	*
FROM
	t_mysql_employees
WHERE
	NOT(department_id>=90 AND  department_id<=110) OR salary>15000;

三、模糊查询

like
between and
in
is null  |  is not null

1、like :一般和通配符搭配使用

%   表示 任意多个字符,包含0个字符
_   表示 任意单个字符
select 
	查询列表
from
	表名
where
	last_name like '%a%';
	#例如:
	last_name LIKE '__n_r%';  
	#例如:
	last_name LIKE '_$_%' ESCAPE '$';

注意:ESCAPE后单引号内修饰的任意字符,都被赋予了转义字符的功能,这个符号后跟随符号就表示符号本身的意思。
在这里插入图片描述2、between and
①使用between and 可以提高语句的简洁度
②包含临界值
③两个临界值不要调换顺序
这是查询id在100到120之间的

SELECT
	查询列表
FROM
	表名
WHERE
	id BETWEEN 100 AND 120;

3、in
含义:判断某字段的值是否属于in列表中的某一项
特点:
①使用in提高语句简洁度
②in列表的值类型必须一致或兼容
③in列表中不支持通配符

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

SELECT
	last_name,
	job_id
FROM
	employees
WHERE
	job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');

4、is null
=或<>不能用于判断null值
is null 或 is not null 判断null值

数据排序(ORDER BY)

语法:

select 查询列表
from 表名
[where  筛选条件]
order by 排序的字段或表达式;

特点:

1、asc代表的是升序,可以省略;desc代表的是降序
2、order by子句可以支持 单个字段、别名、表达式、函数、多个字段
3、order by在查询语句的最后面,除了limit子句

需要注意的是,order by后面的需要在select中也有。


分组查询

分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数

分类:
sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数

特点:
1、sum、avg一般用于处理数值型
   max、min、count可以处理任何类型
   
2、以上分组函数都忽略null值

3、可以和distinct搭配实现去重的运算

4、count函数的单独介绍
一般使用 count(*) 用作统计行数

5、和分组函数一同查询的字段要求是group by后的字段

3、和distinct搭配

SELECT SUM(DISTINCT salary),SUM(salary) FROM t_mysql_employees;

SELECT COUNT(DISTINCT salary),COUNT(salary) FROM t_mysql_employees;

4、count函数的详细介绍

SELECT COUNT(salary) FROM t_mysql_employees;

SELECT COUNT(*) FROM t_mysql_employees;

SELECT COUNT(1) FROM t_mysql_employees;

效率:

MYISAM存储引擎下  ,COUNT(*)的效率高
INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些

GROUP BY

语法:

select 
	查询列表
from 
	表名
[where 筛选条件]
group by 
	分组的字段
[order by 排序的字段];

特点:

1、和分组函数一同查询的字段必须是group by后出现的字段
2、筛选分为两类:分组前筛选和分组后筛选
针对的表位置连接的关键字
分组前筛选原始表group by前where
分组后筛选group by后的结果集group by后group by后 having

注意:

问题1:分组函数做筛选能不能放在where后面
答:不能

问题2:where——group  和  by——having

一般来讲,能用分组前筛选的,尽量使用分组前筛选,提高效率

分组前筛选
案例:查询邮箱中包含a字符的 每个部门的最高工资

SELECT
	max( salary ) m,
	department_id 
FROM
	t_mysql_employees 
WHERE
	email LIKE '%a%' 
GROUP BY
	department_id;

分组后筛选
案例:查询哪个部门的员工个数>5

SELECT
	count( * ) s,
	department_id 
FROM
	t_mysql_employees 
GROUP BY
	department_id 
HAVING
	s > 5;

多表查询

1、笛卡尔积

笛卡尔积会在下面条件下产生

– 省略连接条件
– 连接条件无效
– 所有表中的所有行互相连接

为了避免笛卡尔积, 可以在 WHERE 加入有效的连接条件。

2、等值连接

① 多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③ 多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选

#案例:查询员工名和员工对应的部门名

SELECT
	e.last_name,
	d.department_name 
FROM
	t_mysql_employees e,
	t_mysql_departments d 
WHERE
	e.department_id = d.department_id;
为表起别名
①提高语句的简洁度
②区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值