数据库常用语句

1 MySQL安装--->mysql启动
2 基本sql
  create table
  create database
  select
  insert
  update
  delete

3 select
  模糊查询 like
  分组查询 group by
  排序     order by
  聚合函数 sum count avg min max
  分页     limit index,count

  为什么要分页:数据量比较大 如果全部查询 出现一下问题:
  1 全部数据都展示用户 数据量太大 用户难以接受
  2 数据量大  查询慢
  3 如果将大量数据读取到java内存中 可能存储崩溃
 (  4GB
     1GB = 1024MB
     1MB = 1024KB 
     1KB = 1024B
     1B  = 8b
     
     int a = 10    4字节
 )
  
  分页:(链接数据库查询 是非常占用资源)
  A  全部查询 在前台展示的时候 只展示 其中的一部分(js)
     (数据库较少) 
  B  数据库获取数据的时候 就只查询部分数据(当前页展示的数据)然后前台直接展示
     (数据量大)

  B : 在查询的时候 只查询部分数据 -----》 limit  index,length

       select *  from product  limit 0,5 -- 1 5
       select *  from product  limit 1,5 -- 2 6
       select *  from product  limit 3,7 -- 4 10

       首页 上一页 1 2 3 4 5 6 下一页 尾页 跳转【】页  每页【5】条 共20页

   问题1 :  第一页   limit  0,5
             第二页   limit  5,5
             第三页   limit  10,5
             第四页   limit  15,5

             第n页 每页x条 limit (n-1)* x  ,x

   问题2 : 100条 5 总:20
            101条 5 总:21
            105条 5 总:21
            106条 5 总:22
            t条  x  总:(t+x-1)/x

4 多表查询

  1 为什么会多表 (主键,外键)
   
   学生表
   id    name   age   grade
    1    张三   18    QY97
    2    李四   18    QY97
    3    王五   60    QY98
    4    马六   61    QY98
  
  领导通知: QY97 ----》 最强97
  班主任 : update student set grade = 最强97 where grade = QY97 (80亿)
  数据库数据冗余(减少冗余)
   
   学生表                            班级表
   id    name  age  gid                 id   gname
   1     张三   18   1                   1    QY97
   2     李四   18   1                   2    QY98
   3     王五   18   2
   4     马六   18   2
   
   班主任: update grade set gname=最强97 where id = 1

   2 两张表如何查询数据?
        
      select * from student

1    张三     18    1
2    李四    18    1
3    吴昂无    18    2
4    王阿斯顿18    2
5    阿斯顿    19    3
6    暗室逢灯19    3

    班级我们其实希望看到 是 班级的名字 并不是班级的编号(我们需要将数据多表存储 又需要在查询的时候 将多表的数据 全部查询出来)

多表查询会出现  "笛卡尔乘积"问题 
(a,b) (c,d) ===> ac,ad,bc,bd

(哪几张表,各个表之间的联系)
内连接

  隐式内连接
  SELECT
    s.id,s.name,s.age,g.gname
  FROM
    student s,
    grade g
  WHERE
    s.gid = g.id  ==>消除笛卡尔乘积

  显示内连接
  SELECT
    s.id,
    s. NAME,
    s.age,
    g.gname
   FROM
    student s
   INNER JOIN grade g ON s.gid = g.id

   select 列名 from 表1 inner join 表2 on 表1.列 = 表2.列

外连接

  左外(需求:查询所有学生信息 如果有班级显示班级名称)
   SELECT
    s.id,
    s. NAME,
    s.age,
    g.gname
   FROM
    student s  
   left JOIN grade g ON s.gid = g.id
  右外
  SELECT
    s.id,
    s. NAME,
    s.age,
    g.gname
   FROM
    student s  
  right JOIN grade g ON s.gid = g.id

  内连接查询的是多个表的交集 
  外连接查询的是一张表的全部数据和另一张表满足要求的数据

5 子查询
  需求: 查询张三的同班同学

  1 查询张三是哪个班?
    select gid from student WHERE name = "张三"

  2 查询和张三班级一样的同学
    select *  from student where gid = 1

  SELECT
    *
  FROM
    student
  WHERE
    gid = (
        SELECT
            gid
        FROM
            student
        WHERE
            NAME = "张三"
    )
数据库范式(数据库设计的规范):
注意:后面的范式一定满足前面

第一范式: 原子性(范式、事务ACID、线程)(不可再分 列不能再分)

表:存储用户信息  手机号 (需求 一个用户可能没有手机号 也可能有多个手机号)

错误一:(
关系型数据库(列固定 行多个)MySQL oracle sqlserver 
非关系型数据库NoSQL 是关系型数据库的补充(基于内存)缓存服务 redis 
)
id name age sex tel tel1 tel2 tel3 tel4 tel5

错误二:
id  name age sex   tel
 1  张三 182  李四 18  男    110
 3  王五 18  男    120,130,140

正确
User                       telephone
id  name  age  sex          id   uid  tel
1   张三   18   男           1    2   120             
2   李四   19   男           2    3   130
3   王五   19   男           3    3   140


第二范式:唯一性 

设计:  学生  选修课  成绩

id  姓名  年龄   选修课  成绩
 1  张三  18     化学     99
 2  张三  18     毛概     66
 3  李四  18     物理     99
 4  李四  18     java     59

 学生表                成绩表
id  姓名  年龄        id sid  课程  成绩
1   张三  18           1  1    化学  99              
2   李四  18           2  1    毛概  66 
                       3  2    物理  99
                       4  2    java  59


第三方式:减少冗余

 id  name age  gname  班主任
  1  张三 18   QY97   罗
  2  李四 18   QY97   罗
  3  王五 18   QY98   罗
  4  赵六 18   QY98   萝

  id name age gid      id gname
  1  张三 18   1        1  QY97
  2  李四 18   1        2  QY98
  3  王五 18   2
  4  赵六 18   2

  问题: 主外键  总结 哪张表应该加外键 
  一对多   一个班级 有 多个学生
           一个用户 有 多个手机号
           一个学生 有 多个课程


反三范式:在实际开发中,适当的冗余能提高开发效率

 

posted @ 2019-04-28 20:13  芯-觞  阅读(226)  评论(0编辑  收藏  举报