zoukankan      html  css  js  c++  java
  • day04 mysql

    
    

    day04_mysql

    今日目标

    • 排序查询

    • 聚合查询

    • 分组、分页查询

    • 克隆表与数据

    • 多表操作

    DQL 查询语句

    排序查询

    # 语法格式
    SELECT * FROM 表名 ORDER BY 排序字段 ASC 或 DESC;
    ASC 升序 (默认)
    DESC 降序
    #根据价格降序排列
    select * from product order by price desc;
    #根据价格降序排列,根据分类降序排列
    select * from product order by price desc,category_id desc;
    #根据价格去重之后的降序排列
    select distinct price from product order by price desc;
    distinct * 去重所有字段内容一样的 比如3个去重后剩2个  其中2个重复
     

    聚合函数

     

    • 介绍的常用的五种聚合函数

      • 案例 count 记录行数的案例

    #3 查询分类为'c001'的所有商品价格的总和
    select sum(price) as 总额 from product where category_id='c001';
    #4 查询分类为'c002'所有商品的平均价格
    select avg(price) as 平均价格 from product where category_id='c002';
    #5 查询分类为'c002' 的商品最高的价格
    select max(price) as 最高价格 from product where category_id='c002';
    #6 查询分类为'c002' 的商品最小的价格
    select min(price) as 最小价格 from product where category_id='c002';

    分组查询

    • 分组查询的定义

      分组查询是指使用group by字句对查询信息进行分组。

    • 案例

      #1 统计各个分类商品的个数
      select p.category_id,count(1) as 分类个数
      from product p
      group by p.category_id;
      #2 统计各个分类商品的个数,且只显示个数大于1的信息
      select p.category_id,count(1) as 分类个数
      from product p
      group by p.category_id
      having count(1)>1
    • where 和 having 的区别

      1. where 需要在from之后,group by 之前,不能用于 分组条件,而having 需要在group by 之后

      2. where 不能和聚合函数一起使用,having 搭配聚合函数使用

    分页查询

    • 定义

      limit 分页查询在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。

      # 例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
      select * from product limit 0,5;
      # 第二页
      select * from product limit 5,5;
      # 第三页
      select * from product limit 10,5;

      (页数-1)*每页的个数,每页的个数
      #查询product表的前5条记录
      SELECT *  FROM product LIMIT 0,5
      SELECT * FROM product limit 5
    • 总结:基础查询关键字的执行顺序

       

    • 克隆表和数据

    • 定义: 克隆表结构及表数据

    • 案例_ like insert

      # 创建一张和 t_customer 相同表结构的表,目标表和源表的约束不会丢失,也会被克隆。
      CREATE TABLE t_customer_bak LIKE t_customer;
      # 创建一张和 product 相同表结构的表信息
      create table t_product like product;

      # 将数据插入到 t_customer_bak 表中
      INSERT INTO t_customer_bak SELECT * FROM t_customer;
      # 克隆表数据
      insert into t_product(pid,pname) select pid,pname from product;
    • 案例_ create table 表名 as select

      # 备份 product 中的数据到 t_product_bak
      # 会丢失表约束
      create table t_product_bak as select * from product;

    多表操作

    表与表之间的关系

    一对一关系

    人和身份证关系、和档案的关系

    一对多关系

    分类表和商品表之间的关系

    此时“分类表category”称为:主表,“cid”我们称为主键。“商品表products”称为:从表,category_id称为外键。我们通过主表的主键和从表的外键来描述主外键关系,呈现就是一对多关系。

    外键特点:

    1. 从表外键的值是对主表主键的引用。

    2. 从表外键类型,必须与主表主键类型一致。

    • 创建外键约束定义:

    alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
    • 创建外键约束的目的:

      保证数据的完整性。

    • 案例:

    # 创建数据表 分类和商品表
    create table category(
    cid varchar(32) PRIMARY KEY ,
    cname varchar(100) #分类名称
    );

    # 商品表
    CREATE TABLE products (
    pid varchar(32) PRIMARY KEY,
    name VARCHAR(40) ,
    price DOUBLE ,
    category_id varchar(32)
    );
    # 添加外键约束
    alter table products add constraint c_products_category_cid foreign key (category_id) references category(cid);
    #1 向分类表中添加数据
    INSERT INTO category (cid ,cname) VALUES('c001','服装');

    #2 向商品表添加普通数据,没有外键数据,默认为null
    INSERT INTO products (pid,pname) VALUES('p001','商品名称');

    #3 向商品表添加普通数据,含有外键信息(category表中存在这条数据)
    INSERT INTO products (pid ,pname ,category_id) VALUES('p002','商品名称2','c001');

    #4 向商品表添加普通数据,含有外键信息(category表中不存在这条数据) -- 失败,异常
    INSERT INTO products (pid ,pname ,category_id) VALUES('p003','商品名称2','c999');

    #5 删除指定分类(分类被商品使用) -- 执行异常
    DELETE FROM category WHERE cid = 'c001';

    #6 删除外键约束
    alter table products drop foreign key c_products_category_cid;

    #7 如果外键约束名称忘记怎么办
    ## 查询一下外键约束的元数据表
    select CONSTRAINT_NAME from information_schema.key_column_usage where TABLE_NAME='products';
    • 外键约束报错信息。

    外键约束总结:

    1. 外键约束主要是为了保证数据的完整性;

    2. 外键是在从表中建的,关联上主表的主键;

    3. 如果主表主键中不存在,从表中不允许插入不存在的数据的;

    4. 如果从表中还有指定的外键数据主表不能删除对应的记录。

     

    多对多关系(可不掌握)

    • 学生和课程之间的关系,一个学生可以选多门课,一门课可以被多个学生选择。

    • 案例

      # 产品和订单之间的关系
      ### 商品表[已存在]
      ### 订单表
      create table `orders`(
      `oid` varchar(32) PRIMARY KEY ,
      `totalprice` double #总计
      );
      ### 订单项表
      create table orderitem(
      rid varchar(50),
      oid varchar(50),-- 订单id
      pid varchar(50)-- 商品id
      );

      alter table `orderitem` add constraint orderitem_orders_fk foreign key (oid) references orders(oid);
      ###---- 商品表和订单项表的主外键关系
      alter table `orderitem` add constraint orderitem_product_fk foreign key (pid) references products(pid);

      #1 向商品表中添加数据
      INSERT INTO products (pid,pname) VALUES('p003','商品名称');
      #2 向订单表中添加数据
      INSERT INTO orders (oid ,totalprice) VALUES('x001','998');
      INSERT INTO orders (oid ,totalprice) VALUES('x002','100');
      #3向中间表添加数据(数据存在)
      INSERT INTO orderitem(pid,oid) VALUES('p001','x001');
      INSERT INTO orderitem(pid,oid) VALUES('p001','x002');
      INSERT INTO orderitem(pid,oid) VALUES('p002','x002');
      #4删除中间表的数据
      DELETE FROM orderitem WHERE pid='p002' AND oid = 'x002';
      #5向中间表添加数据(数据不存在) -- 执行异常
      INSERT INTO orderitem(pid,oid) VALUES('p002','x003');
      #6删除商品表的数据 -- 执行异常
      DELETE FROM products WHERE pid = 'p001';
      
      
      image-20200921160224014

     

     

    问题集锦

    • select distinct * from product 过滤是根据第一个字段还是所有字段

       

       

    • group by 加深理解

      # 统计每个分类的个数 product
      select category_id,count(1) from product group by category_id;

    完毕。

  • 相关阅读:
    ASP.NET MVC 3 Performance – on par with MVC 2
    delete obj$
    什么是软件架构设计
    MySQL 5.7版本安装教程-踩坑总结
    Linux操作系统Centos7.2版本搭建Apache+PHP+Mysql环境
    如何给DropDownList控件设置样式(ASP.NET MVC)
    小白如何写需求文档
    List和string之间的互相转换
    五线谱知识
    js字符串与字符数组之间的转换
  • 原文地址:https://www.cnblogs.com/shan13936/p/13706766.html
Copyright © 2011-2022 走看看