1、去重distinct
去除查询结果中的重复记录
select distinct 字段 from 表名
distinct 关键字只能出现在所有字段的最前面
示例:
查询共有哪些工作岗位
统计工作岗位的种类
select distinct 字段1,字段2,字段3... from 表名
distinct 关键字后面跟多个字段表示所有字段联合去重
2、连接查询
即多张表联合查询,在实际中为了避免数据的大量重复,导致数据的冗余,会将数据分散存到不同的表中,而不同的表之间又存在着某种关系。
①、连接查询的分类
连
接
方
式
分
类
{
内
连
接
外
连
接
全
连
接
连接方式分类\left\{ \begin{matrix} 内连接 \\ 外连接 \\ 全连接 \end{matrix} \right.
连接方式分类⎩⎨⎧内连接外连接全连接
内
连
接
{
等
值
连
接
非
等
值
连
接
自
连
接
内连接\left\{ \begin{matrix} 等值连接\\ 非等值连接 \\ 自连接 \end{matrix} \right.
内连接⎩⎨⎧等值连接非等值连接自连接
外
连
接
{
左
外
连
接
(
左
连
接
)
右
外
连
接
(
有
连
接
)
外连接\left\{ \begin{matrix} 左外连接(左连接)\\ 右外连接 (有连接)\\ \end{matrix} \right.
外连接{左外连接(左连接)右外连接(有连接)
②、笛卡尔积现象
如有两个集合A和B,A = {0,1} B = {2,3,4}。
集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。基于以上的结果我们得到两个结论:
- 两个集合相乘,不满足交换率,既 A×B ≠ B×A;
- A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;
数据库表连接数据行匹配时所遵循的算法就是以上提到的笛卡尔积,表与表之间的连接可以看成是在做乘法运算。
比如:现在有两张表EMP员工表
和DEPT部门表
如下图,现要求找出每位员工的部门名称,并显示员工姓名和部门名。
看到题目我们首先可能想到的是这条语句。从emp表中找出员工的姓名,从dept表中找出员工所在部门的名称。SQL语句可能是这样select ename,dname from emp,dept;
执行结果如下:
mysql> select ename,dname from emp,dept;
±-------±-----------+
| ename | dname |
±-------±-----------+
| SMITH | ACCOUNTING |
| SMITH | RESEARCH |
| SMITH | SALES |
| SMITH | OPERATIONS |
|…………省略……………|
| MILLER | ACCOUNTING |
| MILLER | RESEARCH |
| MILLER | SALES |
| MILLER | OPERATIONS |
±-------±-----------+
56 rows in set (0.00 sec)
从运算结果来看,SQL在两张表之间连接查询时执行了乘法运算,表emp中共有员工14个,表dept中共有部门4个。因此执行上述语句后的结果就为14*4=56个组合。即:当两张表进行连接查询时,若没有任何条件进行限制,最终的查询结果是两张表记录条数的成绩。这种现象在SQL中被称作为笛卡尔积现象。
③、表的别名
# emp表中的字段为ename,dept表中的字段为dname
select ename,dname from emp as e(别名),dept as d(别名);
# as也可以省去
select ename,dname from emp e(别名),dept d(别名);
给表起别名好处:①、执行效率高 ②、直观,可读性好。
如下面该语句select e.ename,d.dname from emp e,dept d;
执行效率高是因为ename字段指定了在e(别名)表中,就不会在d表中再查找了。可读性好是因为看到该语句就知道ename在e表中,dname在d表中。
③、避免笛卡尔积现象
加条件过滤。还是上面的问题,现要求找出每位员工的部门名称,并显示员工姓名和部门名。先加上过滤条件
select e.ename,d.dname from emp e,dept d where e.deptno=p.deptno;
避免了笛卡尔积现象不会减少记录的匹配次数,匹配次数还是那么多只是对显示结果进行了过滤,只显示有效记录。
该语法为SQL92语法,不用。