DQL(数据查询语言)学习
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;
为表起别名
①提高语句的简洁度
②区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定