系统学习数据库day05

多行子查询

all

表示和子查询的所有行进行比较, 每一行必须都满足条件

  • < ALL 表示小于子查询结果集合中的所有行, 即小于最小值
  • 大于 ALL 表示大于子查询结果集合中的所有行, 即大于最大值就可以
  • = ALL表示等于子查询结果集合中的所有行, 即等于所有值, 通常无意义
-- 查询部门编号不为20,且工资比20部门所有员工工资高的
-- 员工编号,姓名,职位,工资。
SELECT EMPNO, ename, JOB, SAL from emp
WHERE sal > ALL(SELECT SAL from emp where DEPTNO=20)
and DEPTNO<>20;
  • 查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
SELECT * from emp where HIREDATE>
any(SELECT HIREDATE from emp where deptno=10) AND deptno <>10;  

  • 查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
SELECT * from emp where HIREDATE>
all(SELECT HIREDATE from emp where deptno=10) AND deptno <>10;  

  • 查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
SELECT * from emp where JOB=
any(SELECT JOB from emp where deptno=10) AND deptno <>10;

  • 子查询中有空的情况
SELECT ename, sal from emp
WHERE EMPNO  NOT in (SELECT MGR from emp)

在这里插入图片描述
子查询中结果有空值, 会导致主查询没有结果
结论:只要空值有可能成为子查询的一部分, 就不能使用not in

在from 中使用子查询

  • 查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资
    在这里插入图片描述
SELECT e.ENAME, e.SAL, e.DEPTNO, deptavg.avgsal from emp e, (SELECT DEPTNO, avg(sal) avgsal FROM emp GROUP BY DEPTNO ) deptavg
WHERE e.DEPTNO = deptavg.deptno AND e.SAL > deptavg.avgsal

  • 查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。
SELECT
    e.job, 
    sum(e.sal) 
FROM
    emp e
WHERE
    e.job <> 'SALESMAN'
GROUP BY
    e.job
HAVING
    sum(e.sal) >= 2500;

  • 显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序
SELECT manager.EMPNO 经理号码, manager.ENAME 经理姓名, 
MIN(worker.SAL) 管理员工的最低工资 from emp worker LEFT 
 OUTER  JOIN  emp manager ON
worker.mgr=manager.EMPNO GROUP BY manager.EMPNO, manager.ENAME
HAVING MIN(worker.SAL) >=3000 ORDER BY 3 DESC

  • 查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
SELECT
	e.EMPNO,
	e.ENAME,
	e.SAL
FROM
	emp e
WHERE
	SAL > (
		SELECT
			sal
		FROM
			emp
		WHERE
			EMPNO = 7782
	)
AND job = (
	SELECT
		job
	FROM
		emp
	WHERE
		EMPNO = 7369
)

  • 查询工资最高的员工姓名和工资。
select ename,sal from emp where sal=(select max(sal) from emp)

  • 查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
select d.deptno, d.dname , min(e.sal)
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno
having  min(e.sal) > (select min(sal) from emp where deptno = 10);

  • 查询员工工资为其部门最低工资的员工的编号和姓名及工资。
SELECT
	e.empno,
	e.ename,
	e.sal
FROM
	emp e,
	(
		SELECT
			deptno,
			min(sal) minsal
		FROM
			emp
		GROUP BY
			deptno
	) deptminsal
WHERE
	e.deptno = deptminsal.deptno
AND e.sal = deptminsal.minsal;

  • 显示经理是KING的员工姓名,工资。
select ename,sal from emp where mgr=(select empno from emp where ename='king')

不用子查询

select worker.ename, worker.sal from emp worker,emp manager  
WHERE worker.MGR = manager.EMPNO and manager.ENAME = 'king'

  • 显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间
SELECT HIREDATE,ENAME,SAL FROM EMP WHERE HIREDATE>(SELECT HIREDATE FROM EMP WHERE ENAME='SMITH')

数据库的管理

  • 创建表
CREATE TABLE 表名(
字段名1 数据类型 [约束条件],
字段名2 数据类型 [约束条件],
…
[其他约束条件],
[其他约束条件]
)其他选项(例如存储引擎、字符集等选项)

创建一个表

CREATE TABLE Person (
	id INT (4) NOT NULL,
	NAME VARCHAR (20) NOT NULL,
	address VARCHAR (20)
);

数据类型


在这里插入图片描述

时间戳: 返回1970年1月1号到现在的毫秒数
在这里插入图片描述# 约束

CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIREDATE` date DEFAULT NULL,
  `SAL` int(7) DEFAULT NULL,
  `COMM` int(7) DEFAULT NULL,
  `DEPTNO` int(2) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`),
  KEY `FK_DEPTNO` (`DEPTNO`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值