基础查询
语法: select 查询列表(可以是多个字段) from 表名;
1. 起别名:select 查询列表 as(或者是空格) 别名名字;
2. 查询表达式(/运算时保留4位小数)
select 100/17;
select 100%98;
条件查询
语法: select 查询列表 from 表名 where 筛选条件;
-
按条件表达式筛选:
简单条件运算符:> 、<、 =、 !=、 <>、 >=、 <= -
按逻辑表达式筛选:
逻辑运算符:
作用:用于连接条件表达式
&&, || ,!
and,or,not -
模糊查询:
like 特点: ①一般和通配符搭配使用 通配符: % 任意多个字符,包含0个字符 _ 任意单个字符 between and 特点: ①使用between and 可以提高语句的简洁度 ②包含临界值 ③两个临界值不要调换顺序 例:employee_id >= 120 AND employee_id<=100; 和 employee_id BETWEEN 120 AND 100; 作用一样 in 特点: 含义:判断某字段的值是否属于in列表中的某一项 特点: ①使用in提高语句简洁度 ②in列表的值类型必须一致或兼容 ③in列表中不支持通配符 例:job_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='AD_PRES'; 和 job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES'); 作用一样 is null 特点: =或<>不能用于判断null值 is null或is not null 可以判断null值 例:commission_pct IS NULL; commission_pct IS NOT NULL;
排序查询
语法: select 查询列表 from 表名 where 筛选条件 order by 排序列表 asc(默认升序) / desc(降序);
1. 按单个字段排序:
SELECT * FROM employees ORDER BY salary DESC;
2. 添加筛选条件再排序:
SELECT * FROM employees WHERE department_id >= 90 ORDER
BY employee_id DESC;
3. 按表达式排序:
SELECT *,salary*12*(1+IFNULL(commission_pct,0))
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
4. 按别名排序:
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROM employees
ORDER BY 年薪 ASC;
5. 按函数排序:
SELECT LENGTH(first_name) as 姓名长度,first_name
FROM employees
ORDER BY LENGTH(first_name) DESC;
6. 按多个字段排序:
SELECT *
FROM employees
ORDER BY salary DESC,employee_id ASC
分组查询:
语法:
1. select 查询列表 , 分组字段
from 表名
where 条件
group by 分组的字段
having 筛选条件
order by 排序的字段;
(分组后的筛选:有having,分组前的筛选:where)
针对的表 | 位置 | 连接的关键字 | |
---|---|---|---|
分组前的筛选 | 原始表 | group by前 | where |
分组后的筛选 | group by 后的结果集 | group by后 | having |
连接查询
用处: 当查询的字段来自于多个表时
sql92语法:
select (查询列表)
from (表1 别名,表2 别名)
where (连接条件)
and [筛选条件]
group by [分组]
having [筛选条件]
order by [排序列表]
sql92标准:
1、等值连接
① 多表等值连接的结果为多表的交集部分
②n表连接,至少需要n-1个连接条件
③ 多表的顺序没有要求
④一般需要为表起别名
⑤可以搭配前面介绍的所有子句使用,比如排序、分组、筛选
2、注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
sql99语法:
select (查询列表)
from (表1 别名 [连接类型])
join (表2 别名)
on (连接条件)
where [筛选条件]
group by [分组]
having [筛选条件]
order by [排序列表]
外连接
特点:
1. 外连接的查询结果为主表的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2. 左外连接,left join左边的是主表(前面)
右外连接,right join右边的是主表 (后表)
3. 左外和右外交换两个表的顺序,可以实现同样的效果
4. 全外连接=内连接的结果+表1中有但表2没有的+表2中有但表1没有的,即交集和并集
5. 主表和从表的判定:要查询的信息主要来自于哪个表,则哪个表是主表
语法:
SELECT COUNT(*) 个数,city
FROM departments d,locations l
WHERE d.location_id=l.location_id //链接条件
GROUP BY city;
子查询
含义: 出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查询或外查询
分类:
按子查询出现的位置:
select后面:
仅仅支持标量子查询
from后面:
支持表子查询
where或having后面:★
标量子查询(单行) √
列子查询 (多行) √
行子查询
exists后面(相关子查询)
表子查询
用法:
一、where或having后面
/*
1、标量子查询(单行子查询)
2、列子查询(多行子查询)
3、行子查询(多列多行)
特点:
①子查询放在小括号内
②子查询一般放在条件的右侧
③标量子查询,一般搭配着单行操作符使用
> < >= <= = <>
列子查询,一般搭配着多行操作符使用
in、any/some、all
标量子查询:
#②查询员工的信息,满足 salary>①结果
SELECT *
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
#③查询员工的姓名,job_id 和工资,要求job_id=①并且salary>②
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 141
) AND salary>(
SELECT salary
FROM employees
WHERE employee_id = 143
);
列子查询(多行子查询,即结果是单列多行):
#②查询员工姓名,要求部门号是①列表中的某一个
SELECT last_name
FROM employees
WHERE department_id in(
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
#②查询员工号、姓名、job_id 以及salary,salary<(①)的任意一个
SELECT last_name,employee_id,job_id,salary
FROM employees
WHERE salary<ANY(
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
行子查询(结果集一行多列或多行多列):
#3、行子查询(结果集一行多列或多行多列)
SELECT *
FROM employees
WHERE employee_id=(
SELECT MIN(employee_id)
FROM employees
)AND salary=(
SELECT MAX(salary)
FROM employees
);
from后子查询(查询结果充当table):
select * from 表1 a, (select 字段1, 字段2 from 表2 where ...) b
/*子查询充当一张表b*/
select name, add_time
from goods g, (select price, id from orders where...) a
where...;
exists查询(判断后面的条件是否成立,成立则执行前面语法)
#查询orders表中是否存在goods_id值为5的记录,
#如果存在,则查询goods表中id值小于5的记录。
select *
from goods
where id < 5
exists (select * from orders where goods_id = 5);