### 9.1、SQL92语法
格式sleect 列 from 表名1[别名], 表名2[别名] where 条件 [group by [having]] [order by]
连接查询:也可以叫跨表查询,需要关联多个表进行查询
l 显示每个员工信息,并显示所属的部门名称
```
select ename, dname from emp, dept;
```
```
SQL> select ename, dname from emp, dept;
ENAME DNAME
\---------- --------------
SMITH ACCOUNTING
ALLEN ACCOUNTING
WARD ACCOUNTING
JONES ACCOUNTING
MARTIN ACCOUNTING
BLAKE ACCOUNTING
CLARK ACCOUNTING
SCOTT ACCOUNTING
KING ACCOUNTING
TURNER ACCOUNTING
ADAMS ACCOUNTING
JAMES ACCOUNTING
FORD ACCOUNTING
MILLER ACCOUNTING
SMITH RESEARCH
ALLEN RESEARCH
WARD RESEARCH
JONES RESEARCH
MARTIN RESEARCH
BLAKE RESEARCH
CLARK RESEARCH
SCOTT RESEARCH
KING RESEARCH
TURNER RESEARCH
ADAMS RESEARCH
JAMES RESEARCH
FORD RESEARCH
MILLER RESEARCH
SMITH SALES
ALLEN SALES
WARD SALES
JONES SALES
MARTIN SALES
BLAKE SALES
CLARK SALES
SCOTT SALES
KING SALES
TURNER SALES
ADAMS SALES
JAMES SALES
FORD SALES
MILLER SALES
SMITH OPERATIONS
ALLEN OPERATIONS
WARD OPERATIONS
JONES OPERATIONS
MARTIN OPERATIONS
BLAKE OPERATIONS
CLARK OPERATIONS
SCOTT OPERATIONS
KING OPERATIONS
TURNER OPERATIONS
ADAMS OPERATIONS
JAMES OPERATIONS
FORD OPERATIONS
MILLER OPERATIONS
已选择56行。
```
以上输出,不复合预期结果,输出了56条数据,其实就是两个表记录的成绩,这种情况我们称为:“笛卡儿乘积”,出现错误的原因是:没有指定连接条件
>[danger]笛卡儿乘积:所有数据的乘积,这种情况是严重的浪费资源,怎么解决呢?
在语句后面添加where 条件数量至少是n-1而且必须使用多个表之间的关联列
指定连接条件
```
select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno;
也可以使用别名
select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;
```
![](https://img.kancloud.cn/dc/54/dc545fc18567f91b487154faa171010a_642x355.png)
以上结果输出正确,因为加入了正确的连接条件
以上查询也称为 “内连接”,只查询相等的数据(连接条件相等的数据)
l 取得员工和所属的领导的姓名
```
select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;
```
```
SQL> select \* from emp;(普通员工)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
\---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月\-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月\-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月\-81 950 30
7902 FORD ANALYST 7566 03-12月\-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择14行。
SQL> select \* from emp;(管理者)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
\---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月\-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月\-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月\-81 950 30
7902 FORD ANALYST 7566 03-12月\-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择14行。
SQL> select e.ename, m.ename from emp e, emp m where e.mgr=m.empno;
ENAME ENAME
\---------- ----------
SMITH FORD
ALLEN BLAKE
WARD BLAKE
JONES KING
MARTIN BLAKE
BLAKE KING
CLARK KING
SCOTT JONES
TURNER BLAKE
ADAMS SCOTT
JAMES BLAKE
FORD JONES
MILLER CLARK
已选择13行。
```
以上称为“自连接”,只有一张表连接,具体的查询方法,把一张表看作两张表即可,如以上示例:第一个表emp e代表了员工表,emp m代表了领导表,相当于员工表和部门表一样
- 空白目录
- 1、数据库概述及数据准备
- 1.1、SQL概述
- 1.2、什么是数据库
- 1.3、MySql概述
- 1.4、MySql的安装
- 1.5、表
- 1.6、SQL的分类
- 1.7、导入演示数据
- 1.8、表结构描述
- 2、常用命令
- 2.1、查看msyql版本
- 2.2、创建数据库
- 2.3、查询当前使用的数据库
- 2.4、终止一条语句
- 2.5、退出mysql
- 3、查看“演示数据”的表结构
- 3.1、查看和指定现有的数据库
- 3.2、指定当前缺省数据库
- 3.3、查看当前使用的库
- 3.4、查看当前库中的表
- 3.5、查看其他库中的表
- 3.6、查看表的结构
- 3.7、查看表的创建语句
- 4、简单的查询
- 4.1、查询一个字段
- 4.2、查询多个字段
- 4.3、查询全部字段
- 4.4、计算员工的年薪
- 4.5、将查询出来的字段显示为中文
- 5、条件查询
- 5.1 概述
- 5.2 等号操作符
- 5.3不等号操作符
- 5.4 between … and …操作符
- 5.5 is null
- 5.6 and
- 5.7 or
- 5.8 表达式的优先级
- 5.9 in
- 5.10 not
- 5.11 like
- 6、排序数据
- 6.1、单一字段排序
- 6.2、手动指定排序顺序
- 6.3、多个字段排序
- 6.4、使用字段的位置来排序
- 7、分组函数/聚合函数/多行处理函数
- 7.1、count
- 7.2、sum
- 7.3、avg
- 7.4、max
- 7.5、min
- 7.6、组合聚合函数
- 7.7 函数总结(了解内容)
- 7.1数据处理函数(单行处理函数)
- 8、分组查询
- 8.1、group by
- 8.2、having
- 8.3、select语句总结
- 9、连接查询
- 9.1、SQL92语法
- 9.2、SQL99语法
- 10、子查询
- 10.1、在where语句中使用子查询,也就是在where语句中加入select语句
- 10.2、在from语句中使用子查询,可以将该子查询看做一张表
- 10.3、在select语句中使用子查询
- 11、union
- 11.1、union可以合并集合(相加)
- 12、limit 的使用
- 12.1、取得前5条数据
- 12.2、从第二条开始取两条数据
- 12.3、取得薪水最高的前5名
- 13、表
- 13.1、创建表
- 13.2、增加/删除/修改表结构
- 13.2.1、添加字段
- 13.2.2、修改字段
- 13.2.3、删除字段
- 13.3、添加、修改和删除
- 13.3.1、insert
- 13.3.2、update
- 13.3.3、delete
- 总结
- 13.4、创建表加入约束
- 13.4.1、非空约束,not null
- 13.4.2、唯一约束,unique
- 13.4.3、主键约束,primary key
- 13.4.4、外键约束,foreign key
- 13.4.5、级联更新与级联删除
- 13.4.5.1、on update cascade;
- 13.4.5.2、on delete cascade;
- 13.5、t_student和t_classes完整示例
- 14、存储引擎(了解)
- 14.1、存储引擎的使用
- 14.2、常用的存储引擎
- 14.2.1、MyISAM存储引擎
- 14.2.2、InnoDB存储引擎
- 14.2.3、MEMORY存储引擎
- 14.3、选择合适的存储引擎
- 15、事务
- 15.1、概述
- 15.2、事务的提交与回滚演示
- 15.3、自动提交模式
- 15.4、事务的隔离级别
- 15.4.1、隔离级别
- 15.4.2、四个隔离级别
- 15.4.3、隔离级别与一致性问题的关系
- 15.4.4、设置服务器缺省隔离级别
- 15.4.5、隔离级别的作用范围
- 15.4.6、查看隔离级别
- 15.4.7、并发事务与隔离级别示例
- 16、索引
- 16.1、索引原理
- 16.2、索引的应用
- 16.2.1、创建索引
- 16.2.2、查看索引
- 16.2.3、使用索引
- 16.2.4、删除索引
- 17、视图
- 17.1、什么是视图
- 17.2、创建视图
- 17.3、修改视图
- 17.4、删除视图
- 18、DBA命令(了解)
- 18.1、新建用户
- 18.2、授权
- 18.3、回收权限
- 18.4、导出导入
- 18.4.1、导出
- 18.4.1.1、导出整个数据库
- 18.4.1.2、导出指定库下的指定表
- 18.4.2、导入
- 19、数据库设计的三范式
- 19.1、第一范式
- 19.2、第二范式
- 19.3、第三范式
- 19.4、三范式总结
- 作业
- 1、取得每个部门最高薪水的人员名称
- 2、哪些人的薪水在部门的平均薪水之上
- 3、取得部门中(所有人的)平均的薪水等级
- 4、不准用组函数(Max),取得最高薪水
- 5、取得平均薪水最高的部门的部门编号
- 6、取得平均薪水最高的部门的部门名称
- 7、求平均薪水的等级最低的部门的部门名称
- 8、取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名
- 9、取得薪水最高的前五名员工
- 10、取得薪水最高的第六到第十名员工
- 11、取得最后入职的5名员工
- 12、取得每个薪水等级有多少员工
- 13、面试题
- 14、列出所有员工及领导的姓名
- 15、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
- 16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门.
- 17、列出至少有5个员工的所有部门
- 18、列出薪金比"SMITH"多的所有员工信息.
- 19、列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数.
- 20、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数.
- 21、列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部门编号.
- 22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级.
- 23、列出与"SCOTT"从事相同工作的所有员工及部门名称.
- 24、列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金.
- 25、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金.部门名称.
- 26、列出在每个部门工作的员工数量,平均工资和平均服务期限.
- 27、列出所有员工的姓名、部门名称和工资。
- 28、列出所有部门的详细信息和人数
- 29、列出各种工作的最低工资及从事此工作的雇员姓名
- 30、列出各个部门的MANAGER(领导)的最低薪金
- 31、列出所有员工的年工资,按年薪从低到高排序
- 32、求出员工领导的薪水超过3000的员工名称与领导名称
- 33、求出部门名称中,带'S'字符的部门员工的工资合计、部门人数.
- 34、给任职日期超过30年的员工加薪10%.
- 教务管理系统(项目)