zoukankan      html  css  js  c++  java
  • mysql学习手册

    约束

    外键约束

    为什么要有外键约束?

    在我们以后开发项目的过程中,操作的肯定不止一张表数据,所以当表与表之间的数据有相关联性的时候,如果没有相关的数据约束,则无法保证数据的准确性!

    外键约束的作用

    让表和表之间产生关系,从而保证数据的准确性!

    建表时添加外键约束

    CREATE TABLE 表名(
        列名1 数据类型1,
        列名2 数据类型2,
        ....
        列名n 数据类型n
       CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主表主键列名)
    );

    建表后添加外键约束

    ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名);

    删除外键约束

    ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

    外键的级联更新和级联删除

    什么是级联更新和级联删除?

     

    如图:比如我有一张用户表,有一张订单表,订单表关联着用户表,一个用户可以有好几个订单,如果我要把用户表的某个用户的信息删掉或者更新,我也希望与该用户关联的数据表的数据会也随着删除或者更新。所以这就是及联删除和及联更新。
    添加外键约束,同时添加级联更新

    ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE;

    添加外键约束,同时添加级联删除

    ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON DELETE CASCADE;

    添加外键约束,同时添加级联更新和级联删除

    ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (本表外键列名) REFERENCES 主表名(主键列名) ON UPDATE CASCADE ON DELETE CASCADE;

    提示:外键名你是可以根据自己的情况随便取的。

    多表设计

    多表的概念

    说白了就是多张表数据,而表与表直接是有一定的关联关系,这种关联关系是通过外键约束实现。

    一对一

    应用场景:

    人和身份证。一个人只有一个身份证,一个身份证只能对应一个人!

    建表原则:

    在任意一个表建立外键,去关联另外一个表的主键

    图解:

    一对多

    应用场景:

    用户和订单。一个用户可以有多个订单!商品分类和商品。一个分类下可以有多个商品!

    建表原则:

    在多的一方,建立外键约束,来关联一的一方主键

    图解:

    多对多

    应用场景:

    学生和课程。一个学生可以选择多个课程,一个课程也可以被多个学生选择!

    建表原则:

    需要借助第三张表中间表,中间表至少包含两个列,这两个列作为中间表的外键,分别关联两张表的主键

    图解:

    多表查询

    内连接查询

    查询原理:

    内连接查询的是两张表有交集的部分数据(有主外键关联的数据)

    显式内连接查询语法:

    SELECT 列名 FROM 表名1 [INNER] JOIN 表名2 ON 条件;

    隐式内连接查询语法:

    SELECT 列名 FROM 表名1,表名2 WHERE 条件;

    多表查询-外连接查询

    左外连接

    查询原理:

    查询左表的全部数据,和左右两张表有交集部分的数据

    左外连接查询语法:

    SELECT 列名 FROM 表名1 LEFT [OUTER] JOIN 表名2 ON 条件;

    右外连接

    查询原理:

    查询右表的全部数据,和左右两张表有交集部分的数据右外连接查询语法:

    SELECT 列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2 ON 条件;

    多表查询-子查询

    什么是子查询?

    查询语句中嵌套了查询语句。我们就将嵌套查询称为子查询!

    自查询的三种结果:

    1、结果是单行单列的可以作为条件,使用运算符进行判断!

    语法:

    SELECT 列名 FROM 表名 WHERE 列名=(SELECT 聚合函数(列名) FROM 表名 [WHERE 条件]);

    2、结果是多行单列的可以作为条件,使用运算符in或not in进行判断!

    语法:

    SELECT 列名 FROM 表名 WHERE 列名 [NOT] IN (SELECT 列名 FROM 表名 [WHERE 条件]);

    3、结果是多行多列的可以作为一张虚拟表参与查询!

    语法:

    SELECT 列名 FROM 表名 [别名],(SELECT 列名 FROM 表名 [WHERE 条件]) [别名] [WHERE 条件];

    语法提示:带[ ]表示可要可不要。 

    多表查询练习

    为了巩固大家对查询语句的掌握,还是需要多多联系
    建表语句:

    -- 创建user表
    CREATE TABLE USER(
      id INT PRIMARY KEY AUTO_INCREMENT,  -- 用户id
      NAME VARCHAR(20),              -- 用户姓名
      age INT                             -- 用户年龄
    );
    -- 添加数据
    INSERT INTO USER VALUES (1,'aa',23);
    INSERT INTO USER VALUES (2,'狗蛋',24);
    INSERT INTO USER VALUES (3,'阿花',25);
    INSERT INTO USER VALUES (4,'小明',26);
    
    
    -- 订单表
    CREATE TABLE orderlist(
      id INT PRIMARY KEY AUTO_INCREMENT,  -- 订单id
      number VARCHAR(30),          -- 订单编号
      uid INT,    -- 外键字段
      CONSTRAINT ou_fk1 FOREIGN KEY (uid) REFERENCES USER(id)
    );
    -- 添加数据
    INSERT INTO orderlist VALUES (1,'javaxuexi001',1);
    INSERT INTO orderlist VALUES (2,'javaxuexi002',1);
    INSERT INTO orderlist VALUES (3,'javaxuexi003',2);
    INSERT INTO orderlist VALUES (4,'javaxuexi004',2);
    INSERT INTO orderlist VALUES (5,'javaxuexi005',3);
    INSERT INTO orderlist VALUES (6,'javaxuexi006',3);
    INSERT INTO orderlist VALUES (7,'javaxuexi007',NULL);
    INSERT INTO orderlist VALUES (7,'javaxuexi008',NULL);
    INSERT INTO orderlist VALUES (7,'javaxuexi009',NULL);
    
    
    -- 商品分类表
    CREATE TABLE category(
      id INT PRIMARY KEY AUTO_INCREMENT,  -- 商品分类id
      NAME VARCHAR(10)                    -- 商品分类名称
    );
    -- 添加数据
    INSERT INTO category VALUES (1,'手机数码');
    INSERT INTO category VALUES (2,'电脑办公');
    INSERT INTO category VALUES (3,'烟酒茶糖');
    INSERT INTO category VALUES (4,'鞋靴箱包');
    
    
    -- 商品表
    CREATE TABLE product(
      id INT PRIMARY KEY AUTO_INCREMENT,   -- 商品id
      NAME VARCHAR(30),                    -- 商品名称
      cid INT, -- 外键字段
      CONSTRAINT cp_fk1 FOREIGN KEY (cid) REFERENCES category(id)
    );
    -- 添加数据
    INSERT INTO product VALUES (1,'华为手机',1);
    INSERT INTO product VALUES (2,'小米手机',1);
    INSERT INTO product VALUES (3,'联想电脑',2);
    INSERT INTO product VALUES (4,'苹果电脑',2);
    INSERT INTO product VALUES (5,'中华香烟',3);
    INSERT INTO product VALUES (6,'玉溪香烟',3);
    INSERT INTO product VALUES (7,'计生用品',NULL);
    
    
    -- 中间表
    CREATE TABLE us_pro(
      upid INT PRIMARY KEY AUTO_INCREMENT,  -- 中间表id
      uid INT, -- 外键字段。需要和用户表的主键产生关联
      pid INT, -- 外键字段。需要和商品表的主键产生关联
      CONSTRAINT up_fk1 FOREIGN KEY (uid) REFERENCES USER(id),
      CONSTRAINT up_fk2 FOREIGN KEY (pid) REFERENCES product(id)
    );
    -- 添加数据
    INSERT INTO us_pro VALUES (NULL,1,1);
    INSERT INTO us_pro VALUES (NULL,1,2);
    INSERT INTO us_pro VALUES (NULL,1,3);
    INSERT INTO us_pro VALUES (NULL,1,4);
    INSERT INTO us_pro VALUES (NULL,1,5);
    INSERT INTO us_pro VALUES (NULL,1,6);
    INSERT INTO us_pro VALUES (NULL,1,7);
    INSERT INTO us_pro VALUES (NULL,2,1);
    INSERT INTO us_pro VALUES (NULL,2,2);
    INSERT INTO us_pro VALUES (NULL,2,3);
    INSERT INTO us_pro VALUES (NULL,2,4);
    INSERT INTO us_pro VALUES (NULL,2,5);
    INSERT INTO us_pro VALUES (NULL,2,6);
    INSERT INTO us_pro VALUES (NULL,2,7);
    INSERT INTO us_pro VALUES (NULL,3,1);
    INSERT INTO us_pro VALUES (NULL,3,2);
    INSERT INTO us_pro VALUES (NULL,3,3);
    INSERT INTO us_pro VALUES (NULL,3,4);
    INSERT INTO us_pro VALUES (NULL,3,5);
    INSERT INTO us_pro VALUES (NULL,3,6);
    INSERT INTO us_pro VALUES (NULL,3,7);
    INSERT INTO us_pro VALUES (NULL,4,1);
    INSERT INTO us_pro VALUES (NULL,4,2);
    INSERT INTO us_pro VALUES (NULL,4,3);
    INSERT INTO us_pro VALUES (NULL,4,4);
    INSERT INTO us_pro VALUES (NULL,4,5);
    INSERT INTO us_pro VALUES (NULL,4,6);
    INSERT INTO us_pro VALUES (NULL,4,7);

    多表查询语句练习

    1.查询用户的编号、姓名、年龄。订单编号

    /*
    分析
      用户的编号、姓名、年龄  user表      订单编号 orderlist表
      条件:user.id=orderlist.uid
    */
    SELECT
      u.id,
      u.name,
      u.age,
      o.number
    FROM
      USER u,
      orderlist o
    WHERE
      u.id=o.uid;

    2.查询所有的用户。用户的编号、姓名、年龄。订单编号

    /*
    分析
      用户的编号、姓名、年龄  user表    订单编号 orderlist表
      条件:user.id=orderlist.uid
      查询所有的用户,左外连接
    */
    SELECT
      u.id,
      u.name,
      u.age,
      o.number
    FROM
      USER u
    LEFT OUTER JOIN
      orderlist o
    ON
      u.id=o.uid;

    3.查询所有的订单。用户的编号、姓名、年龄。订单编号

    /*
    分析
      用户的编号、姓名、年龄 user表    订单编号 orderlist表
      条件:user.id=orderlist.uid
      查询所有的订单,右外连接
    */
    SELECT
      u.id,
      u.name,
      u.age,
      o.number
    FROM
      USER u
    RIGHT OUTER JOIN
      orderlist o
    ON
      u.id=o.uid;

    4.查询用户年龄大于21岁的信息。显示用户的编号、姓名、年龄。订单编号

    /*
    分析
      用户的编号、姓名、年龄 user表    订单编号 orderlist表
      条件:user.id=orderlist.uid AND user.age > 23
    */
    SELECT
      u.id,
      u.name,
      u.age,
      o.number
    FROM
      USER u,
      orderlist o
    WHERE
      u.id=o.uid
      AND
      u.age > 23;

    5.查阿牛和阿花用户的信息。显示用户的编号、姓名、年龄。订单编号

    /*
    分析
      用户的编号、姓名、年龄 user表   订单编号 orderlist表
      条件:user.id=orderlist.uid AND user.name IN ('阿牛','阿花')
    */
    SELECT
      u.id,
      u.name,
      u.age,
      o.number
    FROM
      USER u,
      orderlist o
    WHERE
      u.id=o.uid
      AND
      u.name IN ('阿牛','阿花');

    6.查询商品分类的编号、分类名称。分类下的商品名称

    /*
    分析
      商品分类的编号、分类名称 category表    商品名称 product表
      条件:category.id=product.cid
    */
    SELECT
      c.id,
      c.name,
      p.name
    FROM
      category c,
      product p
    WHERE
      c.id=p.cid;

    7.查询所有的商品分类。商品分类的编号、分类名称。分类下的商品名称

    /*
    分析
      商品分类的编号、分类名称 category表    商品名称 product表
      条件:category.id=product.cid
      查询所有的商品分类,左外连接
    */
    SELECT
      c.id,
      c.name,
      p.name
    FROM
      category c
    LEFT OUTER JOIN
      product p
    ON
      c.id=p.cid;

    8.查询所有的商品信息。商品分类的编号、分类名称。分类下的商品名称

    /*
    分析
      商品分类的编号、分类名称  category表   商品名称 product表
      条件:category.id=product.cid
      查询所有的商品信息,右外连接
    */
    SELECT
      c.id,
      c.name,
      p.name
    FROM
      category c
    RIGHT OUTER JOIN
      product p
    ON
      c.id=p.cid;

    9.查询所有的用户和该用户能查看的所有的商品。显示用户的编号、姓名、年龄。商品名称

    -- 9.查询所有的用户和该用户能查看的所有的商品。显示用户的编号、姓名、年龄。商品名称
    /*
    分析
      用户的编号、姓名、年龄 user表   商品名称 product表    中间表 us_pro
      条件:us_pro.uid=user.id AND us_pro.pid=product.id
    */
    SELECT
      u.id,
      u.name,
      u.age,
      p.name
    FROM
      USER u,
      product p,
      us_pro up
    WHERE
      up.uid=u.id
      AND
      up.pid=p.id;

    10.查询阿牛和小明这两个用户可以看到的商品。显示用户的编号、姓名、年龄。商品名称

    /*
    分析
      用户的编号、姓名、年龄 user表   商品名称 product表   中间表 us_pro
      条件:us_pro.uid=user.id AND us_pro.pid=product.id AND user.name IN ('阿牛','小明') 
    */
    SELECT
      u.id,
      u.name,
      u.age,
      p.name
    FROM
      USER u,
      product p,
      us_pro up
    WHERE
      up.uid=u.id
      AND
      up.pid=p.id
      AND
      u.name IN ('阿牛','小明');

    视图

    视图的概念

    1、视图是一种虚拟存在的数据表

    2、这个虚拟的表并不在数据库中实际存在

    3、作用是将一些比较复杂的查询语句的结果,封装到一个虚拟表中。后期再有相同复杂查询时,直接查询这张虚拟表即可

    4、说白了,视图就是将一条SELECT查询语句的结果封装到了一个虚拟表中,所以我们在创建视图的时候,工作重心就要放在这条SELECT查询语句上

    视图的好处

    简单

    对于使用视图的用户不需要关心表的结构、关联条件和筛选条件。因为这张虚拟表中保存的就是已经过滤好条件的结果集

    安全

    视图可以设置权限 , 致使访问视图的用户只能访问他们被允许查询的结果集

    数据独立

    一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响

    视图的创建

    CREATE VIEW 视图名称 [(列名列表)] AS 查询语句;

    视图的查询

    查询视图中的数据

    SELECT * FROM 视图名称;

    查询视图创建语法

    SHOW CREATE VIEW 视图名称;

    视图的修改

    修改视图表中的数据

    UPDATE 视图名称 SET 列名=WHERE 条件;

    注意:修改视图中的数据,源数据表中的数据也会随着修改。

    修改视图表结构

    ALTER VIEW 视图名称 [(列名列表)] AS 查询语句;

    视图的删除

    DROP VIEW [IF EXISTS] 视图名称;

    备份与还原

    命令方式的备份(以你服务器的Linux为例):

    1、先远程连接你的linux系统

    2、使用SecureCRT工具连接到Linux系统

    3、输入:mysqldump -u root -p 数据库名称 > 文件保存路径数据库名称.sql

    4、输入数据库的密码即可操作命令:mysqldump -u root -p blog > /Users/javaxuexi/Desktop/blog.sql

    命令方式还原备份的数据库

    1、需要先登录数据库mysql -u root -p

    2、创建一个新的数据库create database java;

    3、使用该数据库use java;

    4、导入w文件执行还原数据库:source 备份文件的路径source /Users/javaxuexi/Desktop/blog.sql

    2、图形界面方式的备份和还原

    你可以通过navicat或者sqlyog工具进行备份或者还原,具体操作我这里就不操作了 。。

    MySQL存储过程和函数

    复习mysql的存储过程,看这个就够了 

    MySQL触发器

    复习mysql的触发器,看这个就够了

  • 相关阅读:
    XToDo未完成内容标记管理器
    FuzzyAutocomplete代码模糊匹配智能提示
    KSImageNamed项目图片智能提示
    Backlight当前行背景高亮显示
    VVDocumenter规范注释生成器
    window.frames[]在Firefox下无法兼容的解决方式
    加密算法(扩展知识:Base64编码)
    Single Pattern(单例模式)
    C语言的基本数据类型长度
    移位操作和二进制知识
  • 原文地址:https://www.cnblogs.com/cangqinglang/p/15024143.html
Copyright © 2011-2022 走看看