欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DQL(数据查询语言)学习

程序员文章站 2024-03-17 13:56:22
...

基本的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后单引号内修饰的任意字符,都被赋予了转义字符的功能,这个符号后跟随符号就表示符号本身的意思。
DQL(数据查询语言)学习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;
为表起别名
①提高语句的简洁度
②区分多个重名的字段

注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
相关标签: 笔记 mysql