MySql&多表

MySql概述

   MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。
   MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

CURD操作

   MySql中的CURD操作就是对数据表的增删改查
   C:create             创建
   U:update           修改
   R:read               读|检索  查询
   D:delete            删除

Sql语句中的分类

   DDL:数据定义语言
        操作对象:数据库和表
        关键词:create  alter    drop    
   DML:数据操作语言
    操作对象:记录    
   DQL:数据查询语言(非官方)
   DCL:数据控制语言
    操作对象:用户    事务        权限

分类对应的关键字

 - DDL
   操作对象:数据库和表
   关键词:create  alter    drop
 - DML
   操作对象:记录(行)
   关键词:insert update delete
 - DQL
   操作对象:数据表中数据
   关键词:select
 - DCL
   主要包括创建用户、给用户授权、对用户撤销授权、查询用户授权和删除用户等。

多表

多表设计常见关系:
一对多:   
   用户和订单    

   用户就是主表,用户id就是主键,订单就是从表,需要添加一个用户id的字段作为外键

多对多:
   订单和商品

   需要在两个表中建一张数据表作为两者的主表,在主表需要添加订单的字段和商品的字段

一对一:
   一般不会使用,直接可以添加对应的字段


一对多:
    在开发中,在多表的一方添加一个外键,外键的名称一般为主表的名称_id,字段类型一般和主表的主键的类型保持一致
    为了保证数据的有效性和完整性
    在多表的一方添加外键约束(不是必须的,也可以通过java程序来控制)
    格式:
        alter table 多表名称 add foreign key(外键名称) references 主表名称(主键名称);

多对多:
    在开发中,一般引入一个中间表,在中间表中存放另外两张表的主键.这样就可以将多对多的关系拆分两个一对多关系
    为了保证数据的有效性和完整性
    在多表的一方添加外键约束(不是必须的,也可以通过java程序来控制)        
    外键约束的特点:
    1.主表中不能删除从表中已引用的数据
    2.从表中不能添加主表中不存在的数据            
一对一:
    在开发中,例如:person idcard(人和身份证)
    思路1:将两个实体合二为一
    思路2:在一个表上将这个表的主键设置成外键且添加外键约束.

多表查询

   笛卡尔积: -- a和b表示不同的表,[]表示可以省略的

笛卡尔积图示: 将aaa表和bbb两张表的 列相加,行相乘,得出多表(此步为全连接,由于没有链接条件过滤所以有数据是错误)如图二,再经过连接条件后过滤才得出正确的笛卡尔积后的表才是数据没有没问题的表

图一:

图二:


   多张表无条件的联合查询.(格式是a.星号通配符,文章的原因不显示)
   select a.* , b.* from a,b;
 内连接:  link: on和where区别
   格式1:显示的内链接
       select a.* , b.*  from a [inner] join b on a.id=b.id (链接条件,后面还可以加where条件)
   格式2:隐式的内连接
       select a.* , b.* from a,b where ab的链接条件
 外连接:
   左右外链接两种方式

左外链接:
      select a.* , b.* from a left [outer] join b on 链接条件
   意义: 先展示join左边的(a)表的所有数据,然后根据条件关联查询 join 右边的表(b),符合条件则展示出来,不符合以null值展示.
右外链接:
      selecta.* , b.* from b right [outer] join a on 链接条件
   意义:先展示join右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示

 子查询:
   概念: 一个查询依赖另一个查询.
   1.获取所有订单价格大于300的所有订单信息
     select * from orders where price>300;
   2.将第1步获取的订单信息作为一张临时表(临时命名tmp),给表起别名:
     as tmp
   3.然后使用内连接获取所有订单信息
     select user.* , tmp.* from user,where user.id=tmp.user_id
   两个合二为一
       select user.* , tmp.* from user,(select * from orders where price>300) as tmp where ser.id=tmp.user_id;

outer,inner,on,as关键字

outer关键字:
    可以不写
inner关键字:
    显示内连接的关键字inner join:两张表都查询,只显示两张表的链接的部分,如果不写inner join不能使用on作为判断只能使用where判断关键字就是隐式内连接(写的话就是显性内连接)(left和right就是外链接的左右查询)
on关键字:
    on和where都是判断但是on关键字是左链接(右链接相反)中不会过滤左链接的表只会根据条件过滤右表
    where条件是先生成临时表都过滤
as关键字:
    需要查询的表或者字段取一个别名(给字段取别名,查询出来字段名为别名)

内连接和外链接的区别

显性内连接只能使用on判断只会查询到两张表有相交部分的数据(行).
左外链接(右外链接相反)使用on判断则是左边的表的数据都会展示,在对应左表的数据后面会跟上右表满足条件的数据.右表没有满足条件或者没有对应值以null展示


  [1]: https://www.cnblogs.com/ajianbeyourself/p/5598131.html
原文地址:https://www.cnblogs.com/sybk/p/10004745.html