Skr-Eric的Mysql课堂(五)——Mysql的外键和嵌套、多表、连接查询

外键(foreign key)

  1、定义 :让当前表的字段值在另一张表的范围内去选择

  2、语法格式

    foreign key(参考字段名)

    references 主表(被参考字段名)

    on delete 级联动作

    on update 级联动作;

  3、使用规则

    1、主表、从表字段数据类型要一致

    2、主表 :被参考字段是主键

  4、示例

    1、表1:缴费信息表(财务) :jftab

           id  姓名    班级  缴费金额

    1  唐伯虎  AID07    300

    2  点秋香  AID07    300

 

       表2:学生信息表(班主任) :bjtab

           stu_id  姓名   缴费金额

 

    2、创建表

      表1 :jftab

        create table jftab(

id int primary key,

name varchar(20) not null,

class char(5),

money smallint

)character set utf8;

 

insert into jftab values

(1,"唐伯虎","AID07",300),

(2,"点秋香","AID07",300),

(3,"文征明","AID07",300);

 

      表2 :bjtab

        create table bjtab(

stu_id int,

name varchar(20),

money smallint,

foreign key(stu_id) references jftab(id)

on delete cascade

on update cascade

)character set utf8;

    3、删除外键

      alter table 表名 drop foreign key 外键名;

      外键名查看 :show create table 表名;

    4、已有表添加外键

      alter table 表名 add

      foreign key(stu_id) references jftab(id)

      on delete 级联动作

      on update 级联动作;

    5、级联动作

      1、cascade

        数据级联删除,级联更新(参考字段)

      2、restrict(默认)

        从表中有相关联记录,不允许主表操作

      3、set null

        主表删除、更新,从表相关联记录字段值为NULL

 

嵌套查询(子查询)

  1、定义 :把内层的查询结果作为外层的查询条件

  2、语法

    select ... from 表名 where 字段名 运算符 (select ... from 表名 where 条件);

  3、练习

    1、把攻击值小于平均攻击值的名字和攻击值显示出来

      1、先求平均值

        select avg(gongji) from sanguo;

      2、找结果

        select name,gongji from sanguo where gongji<值;

      select name,gongji from sanguo where

      gongji<(select avg(gongji) from sanguo);

    2、找出每个国家攻击力最高的英雄的名字和攻击值

      # 有问题语句

      select name,gongji from sanguo

      where

      gongji in(select max(gongji) from sanguo group by country);

      # 无问题语句

      select name,gongji from sanguo

      where

      (country,gongji) in(select country,max(gongji) from sanguo group by country);

 

多表查询

  1、两种方式

    1、笛卡尔积 :不加where条件

      select ... from 表1,表2;

    2、加where条件

      select ... from 表1,表2 where 条件;

    3、

      1、记录多的表的每一条记录,去匹配另一张表的所有记录

      2、2张表记录条数相同,则后表的每一条记录去匹配前表的所有记录

  2、练习

    1、显示 省、市详细信息

      河北省   石家庄市

      河北省   廊坊市

      广东省   广州市

      广东省   深圳市

      select sheng.s_name,city.c_name from sheng,city where

      sheng.s_id=city.cfather_id;

    2、显示省、市、县详细信息

      select sheng.s_name,city.c_name,xian.x_name from

      sheng,city,xian

      where

      sheng.s_id=city.cfather_id and city.c_id=xian.xfather_id;

 

连接查询

  1、内连接(inner join)

    1、语法格式

      select 字段名列表 from 表1

      inner join 表2 on 条件

      inner join 表3 on 条件;

    2、练习

      1、显示省、市详细信息(只显示匹配到的)

        select sheng.s_name,city.c_name from sheng

        inner join city

        on sheng.s_id=city.cfather_id;

      2、显示省市县详细信息

        select sheng.s_name,city.c_name,xian.x_name from sheng

        inner join city on sheng.s_id=city.cfather_id

        inner join xian on city.c_id=xian.x_father_id;

  2、外连接

    1、左连接(left join)

      1、以 左表为主 显示查询结果

      2、select 字段名列表 from 表1

         left join 表2 on 条件

 left join 表3 on 条件;

      3、练习

        1、显示省、市详细信息,要求省全部显示

         2、显示省市县详细信息,要求省全部显示

  select sheng.s_name,city.c_name,xian.x_name from sheng

          left join city on sheng.s_id=city.cfather_id

          left join xian on city.c_id=xian.xfather_id;

    2、右连接(right join)

      以右表为主显示查询结果,用法同左连接

 

 

想要看更多的课程请微信关注SkrEric的编程课堂

你可能感兴趣的:(Skr-Eric的Mysql课堂(五)——Mysql的外键和嵌套、多表、连接查询)