#多行子查询
#也成为集合比较子查询(有点绕口)
/*内查询返回
使用多行比较操作符
*/
/*
多行子查询比较操作符
IN等于列表中的任意一个
ANY需要和单行比较操作符一起使用。和子查询返回的某一个值比较;
ALL需要和单行比较操作符一起使用,和子查询返回的所有值比较。
SOME实际上是ANY的别名,一般常使用ANY
*/
# IN
SELECT employee_id,last_name
from employees
where salary in(
SELECT MIN(salary)
from employees
GROUP BY department_id
);
#ANY/ALL
#习题:返回其他job_id中比JOB_id为“IT_PROG”部门任意工资低的员工的员工号,姓名,job_id以及salary
SELECT employee_id,last_name,job_id,salary
from employees
where job_id != 'IT_PROG'
and salary < ANY(
SELECT job_id,salary
from employees
where job_id='IT_PROG'
);
#习题:返回公司工资最少的last_name,job_ID,salary
SELECT last_name,job_id,salary
from employees
where salary=(
SELECT MIN(salary)
from employees
);
#查询与141号员工的manger_id和department_id相同的其他员工的employees_id,manger_id,department_id。
SELECT manager_id,department_id,employee_id
from employees
where (manager_id,department_id)=(
SELECT manager_id,department_id
from employees
where employee_id=141
)
and employee_id !=141;
#习题:查询平均工资最低的部门ID
#mysql中聚合函数不能嵌套
SELECT avg(salary) avg_sal
from employees
GROUP BY department_id
SELECT AVG(salary) AVG_sal
from(
SELECT avg(salary) avg_sal
from employees
GROUP BY department_id
)t_dept_avg
#约束
/*
1,基础知识
1,1为什么要约束?是为了保证数据的完整性
1,2什么呢叫约束?是对表中字段的限制
1,3约束的分类
角度1 :约束的字段的个数
单列约束VS多列约束
角度2 :约束的作用范围
列级约束 :将此约束声明在对应字段的后面
表级约束 :在表中所有字段都声明完,在所有字段的后面声明约束
角度3 :约束的作用或功能
(1)not null 非空约束
(2)unique 唯一性约束
(3)primary key 主键约束
(4)foreign key 外键约束
(5)check (检查约束)
(6)default (默认值约束)
1,4如何添加、删除约束
CREATE TABLE 时添加约束
ALTER TABLE 时添加约束
如何查看表中的约束
*/
SELECT * FROM information_schema.table_constraints WHERE table_name='test1';
#not null (非空约束)只能用列级约束,不能表级约束
CREATE DATABASE dbtest;
use dbtest;
#3.1 在create table 时添加约束
CREATE TABLE test1(
id int not null,
last_name VARCHAR(10) not null,
email VARCHAR(20),
salary int
);
desc test1;