zoukankan      html  css  js  c++  java
  • DAY26

            第11章 多表查询(重点,难点)

    11.1 基本介绍

     多表查询是指基于两个和两个以上的表或是视图的查询.在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp)

    11.2 看一个实际的需求

    •  显示雇员名(ename),雇员工资(sal)及所在部门的名字(dname)?
    •  分析

    (1) 因为字段的信息来自于两个表 emp, dept 表,因此对其联合查询

    (2) 如果直接对两个联查,将会得到这样的结果=>笛卡尔集

    •  笛卡尔集

    当我们对多表进行联查时,我们就会得到的 1记录数 * 2的记录数,如图:

    •  对这个需求的完成和分析

     

    •  关于笛卡尔集的说明

    规定:多表查询的条件是 至少不能少于 表的个数-1

    •  多表查询的练习

     

    11.3 自连接

    •  基本介绍: 自连接是指在同一张表的连接查询
    •  案例:

    ?显示某个员工的上级领导的姓名,比如显示’FORD’的上级.

     

    •  案例:

     

    • 分析:

     

    11.4 子查询

    •  基本的介绍

    子查询是指嵌入在其它sql查询语句中的select语句,也叫嵌套查询

    •  单行子查询

    单行子查询是指只返回一行数据的子查询语句

    请思考:如何显示与SMITH同一部门的所有员工?

    •  多行子查询

    多行子查询指返回多行数据的子查询   使用关键字 in

    案例:

     

    分析

    (1) 应该查询到10号部门有哪些工作

    select  distinct job  from  emp where deptno =10;

    (2) 有哪些雇员是这样的工作

    select * from emp where job in (select  distinct job  from  emp where deptno =10) and deptno <> 10;

     11.5 作业练习-查询ecshop表的ecs_goods表的各个类别的价格最高商品信息

     

     11.6 多列子查询

    •  基本介绍

    如果我们的一个子查询,返回的结果是多列的,我们就把这个子查询叫做多列子查询.

    select math, english, chinese from student where name = '宋江';

    select * from student where (math, english, chinese) = (select math, english, chinese from student where name = '宋江');

     

      11.7 在from子句中使用子查询

    如果我们的子查询他是在,from子句中出现的,则我们就叫from子句的子查询.

    案例:

    请思考:如何显示高于自己部门平均工资的员工的信息(名字,薪水,和该部门的平均薪水)

    (1) 查出各个部门的平均工资

    select avg(sal) as myavg , deptno from emp group by deptno;

    (2) 就把上面的查询当做一个临时表来使用

    select ename, sal, temp. myavg,emp.deptno  from

    emp, (select avg(sal) as myavg , deptno from emp group by deptno) as temp

    where

    emp.deptno = temp.deptno

    AND

    emp.sal > temp. myavg;

     

    案例

    查找每个部门工资最高的人的详细资料(雇员们,薪水,部门编号,最高工资

    (1) 查询出各个部门的最高工资

    select max(sal) as mymax, deptno from emp group by deptno;

    (2) 把上面的查询当做一个临时表

    select ename, sal, emp.deptno, temp.mymax from

    emp , (select max(sal) as mymax, deptno from emp group by deptno) AS temp

    where emp.deptno = temp.deptno and sal = temp.mymax;

       11.8 课后练习

       11.9 自我复制数据

    有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以使用此法为表创建海量数据. 如快速的创建一张海量表.1000w [实践...工科]

    (1) 创建一张结构相同的表

    create table temp_emp like emp;

    (2) emp的数据导入的temp_emp

    (3) 自我复制

     

     

    11.10 如何对一张表去复制

    •  student表的数据去重.

    (1) 创建一张结构相同的表

     

    (2) 将过滤distinct 数据导入的 temp_stu.

     

    (3) 删除stu->temp_stu改名student

     

    11.11 合并查询

    •  基本介绍: 合并查询有两种,union / union all
    •  union 合并查询

    基本语法:

    select 语句1 union select语句2 ....;

    将第一个sql语句的结果和第二个sql语句结果合并返回,而且会去掉重复的记录.

    •  举例说明

    •  union all

    union all 和  union 的用法一样,但是union all 不会去掉重复记录.

     


            第12章 多mysql表的内连接和外连接

     12.1 mysql表的内连接

    •  基本介绍:内连接实际上就是利用 where 子句对两张(多表)表形成的笛卡尔积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中用的最多的连接查询。
    •  基本语法

    (1) 前面我们使用的那种语法.

    (2) 还有一种写法

    select 列名 from 1  inner  join  2  inner  join 3  ON 条件 ....

    <=等价==>

    select 列名 from 1  ,  2  , 3  WHERE  条件 ....

    举例说明

    雇员的名字,薪水,部门的名称.

     12.2 基本介绍mysql的外连接

    mysql的外连接有两种,左外连接右外连接。【完全外连接[mysql中支持语法,但是没有实际用处]

    •  左外连接

    基本介绍: 如果左侧的表完全显示我们就说是左外连接

    基本语法:

    select 列名 from 1  left  join  2  ON 条件 .....

    案例说明:

    (1) 创建两张表,并添加了数据

    (2)显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id,成绩显示为空

     

    •  右外连接

    基本介绍: 如果右侧的表完全显示我们就说是右外连接

    基本语法:

    select 列名 from 1  right  join  2  ON 条件 .....

    案例说明:

      查询结果要求:如果一个成绩,没有对应的人,则显示 '无名' , '未知id'

     

    •  练习题

     

    (1) 先将学生的信息全部显示

    select stu.id,name,grade from stu left join exam on stu.id = exam.id;

    (2) 将考试成绩都显示出来

    select stu.id,name,grade from stu right join exam on stu.id = exam.id;

    (3) union

    select stu.id,name,grade from stu left join exam on stu.id = exam.id union

    select stu.id,name,grade from stu right join exam on stu.id = exam.id;

     练习2

     

    (1) 使用左外连接

    (2) 使用右外连接

     


            第13章 mysql的结束

      13.1 基本的介绍

    约束是用于维护数据的完整性, 所谓数据的完整性指的是,就是根据业务逻辑的需要,我们将表的某些字段设置成一种约束,从而保证数据的合理性和完整性,比如身份证编号就是唯一,我们就可以使用unique 这个约束.

      13.2 mysql的约束分类

    主要有五种

    (1) 主键约束: primary key

    (2) 唯一约束: unique

    (3) not null

    (4) check :检查约束,很多数据库都有,但是mysql支持语法,并没有实际作用

    (5) 外键约束: foreign key

     

      13.3 主键约束

    •  基本语法

    说明

    (1) 主键约束一般在int , 字符型设置

    (2) 一旦一个字段被设置成主键约束,则该字段不能重复,也不能为null

    案例

      13.4 基主键的使用细节说明(使用陷进)

    (1) primary key不但不能重复而且不能为null

    (2) 一张表最多只能有一个主键, 但可以是复合主键

    举例:

    举例2:

     

    (3) 一般来说一张表总有primary key ,而且是整数类型的, 以后同学们这样使用 即可.

    看一个:ecs_goods  ecs_vote;

    (4) 主键的指定方式 有两种

    在字段后面直接定义

    在字段定义完毕后,在后面写.

    (5) 如果有一个主键后,还希望其它字段达到not null 并且  unique 的效果,则可以如下定义表

     

       13.5 not null约束

    not null 前面已经使用很多次,这里我们就不讲了.

     

      13.6 unique约束(唯一约束)

    当我们希望某个字段的值不能出现重复值时,我们就可以将该字段设置成unique.

    •  基本语法

    字段名 字段类型  unique,

    •  举例说明

      13.7 unique细节

    (1) 如果我们将某个字段设置为 unique ,但是没有设置  not null, 那么该字段可以为null,并且可以有多个null

    (2) 如果你要某个字段不能重复,而且不能为 null, 我们可以这样定义字段

    字段名 字段类型 not null  unique

    (3) 一个表中,可以有多个unique约束.

      13.8 外键约束

    •  基本的介绍

    用于定义主表和从表之间的关系: 外键约束要定义在从表上,主表则必须具有主键约束或是unique约束.,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null

    •  外键的基本语法

    foreign key (外键字段)  references 主表(字段);

    说明:

    (1) 红字是关键字,规定好.

    (2) 外键字段 在本表定义的。

    (3) 外键字段是指向另外一张表的某个字段.

    看一个实际的需求

     

    •  基本案例说明

    (1) 先创建主表/从表

    (2) 当有外键有,在使用的时候有如下注意事项

    ü 当给从表添加记录时,要外键的值已经在主表中存在,否则不能添加成功

    ü 如果我们的外键没有设置 not null, 那么外键的值可以是 null, 而且可以有多个.

    (3)使用一把

     

    (4) 外键的使用细节

    ü 外键指向的表的字段,要求是primary key 或者是 unique

    ü 表的类型是innodb, 这样的表才支持外键

    ü 外键字段的类型要和主键/unqiue字段的类型一致(长度可以不同)

    ü 外键字段的值,必须在主键字段中出现过,或者为null [前提是外键可以为null]

     

    ü 一旦建立主外键的关系,数据不能随意删除和修改了[参照完整性]

    不指定外键,同样可以有不同表的字段相关联的关系,只是这种关系的维护,要由程序员自己维护(php)mysql数据库不会去检查了

     13.9 check约束(了解)

    说明:

    check约束在mysql中,支持语法,但是没有作用!

     

      13.10 约束的综合练习题-练习约束

     

     

      13.11 练习题

     晚上把下面这个综合案例完成

     

      13.12 如何对约束进行管理(增、删、改、查)

    在实际开发中,对表的约束的管理是重要的,因此要求大家必须掌握.

     

    create table customer2 (

    customer_id char(8) not null default '',

    name varchar(20),

    address varchar(30) not null default '',

    email varchar(30) ,

    sex enum('','') not null);

     

    上面这个表有问题 ,看看需求

    (1) 客户号设为的主键;

    alter table  customer2  add primary key (customer_id);

    (2) 客户的姓名不能为空值;

    alter table customer2 modify name varchar(20) not null default '';

    (3) 电邮不能够重复;--增加身份证也不重复

    alter table customer2 add unique(email);

    (4) 客户的住址默认是'泰牛学生宿舍'

    alter table customer2 modify address varchar(30) not null default '泰牛学生宿舍';

      13.13 晚上练习

    13.14 删除约束的讲解

    当不再需要某个约束时,可以删除

    (1) 删除主键约束

    因为一个表只有一个主键,所以主键的删除非常的简单.

    alter  table customer2  drop  primary key;

    (2) 删除not null, unique , 修改字段

    (3) 删除外键约束

    第一步先查询外键的名称

    删除:

    alter table stu drop foreign key stu_ibfk_1;

     

  • 相关阅读:
    PHP中this,self,parent的区别
    phpcms 模块之间 调用 常用操作列表(二次开发)
    Eclipse快捷键大全(转载)
    phpcms v9 数据库操作函数
    调试 写日志
    phpcms头部代码详细分析
    PHPCMS V9构建模块方法介绍 (二次开发)
    phpcms v9 URL访问中的MVC 2
    【tensorflow】重置/清除计算图
    【今日CV 视觉论文速览】14 Nov 2018
  • 原文地址:https://www.cnblogs.com/qianjilou/p/6403811.html
Copyright © 2011-2022 走看看