我要精通数据库😶

mysql

  1. 设计数据库的原则:
    1. 数据表的个数越少越好
    2. 数据表中的字段越少越好: 在数据冗余和检索效率中进行平衡
    3. 数据表中联合主键的字段越少越好: 索引开销大
    4. 是否多用外键有待商榷.
  2. 数据库约束
    1. 主键约束
    2. 外键约束
    3. 唯一性约束
    4. 字段约束: not null, default, check
  3. 关键字顺序及执行顺序
    1
    2
    3
    4
    5
    6
    7
    8

    SELECT DISTINCT player_id, player_name, count(*) as num #顺序5
    FROM player JOIN team ON player.team_id = team.team_id #顺序1
    WHERE height > 1.80 #顺序2
    GROUP BY player.team_id #顺序3
    HAVING num > 2 #顺序4
    ORDER BY num DESC #顺序6
    LIMIT 2 #顺序7
  4. 函数
    1. 内置函数
      1. 算术函数
        1. ABS() 取绝对值
        2. MOD() 取余
        3. ROUND() 四舍五入为指定的小数位数, 有两个参数:字段名称和小数位数
      2. 字符串函数
        1. CONCAT() 将多个字符串连接起来
        2. LENGTH() 计算字段长度, 一个汉字算三个字节, 一个字母或数字算一个.
        3. CHAR_LENGTH() 计算字段的长度, 汉字也算一个字符
        4. LOWER() 大写转小写
        5. UPPER() 小写转大写
        6. REPLACE(‘asdf’, ‘sd’, 123) 结果:a123d 替换函数, 有三个参数: 要替换的表达式或字段名, 想要查找的被替换字符串, 替换成哪个字符串
        7. SUBSTRING() 截取字符串, 有三个参数: 带截取的表达式或字段名, 开始截取的位置, 想要截取的字符串长度
      3. 日期函数
        1. CURRENT_DATE() 系统当前日期
        2. CURRENT_TIME() 系统当前时间
        3. CURRENT_TIMESTAMP() 系统当前日期 + 时间.
        4. EXTRACT() 抽取具体的年,月,日, 有一个参数为字符串
        5. DATE(‘2019-04-01 12:00:05’) 返回时间的日期部分, 有一个参数为字符串
        6. YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOUND(), 均类似, 返回时间字符串的XX部分
      4. 转换函数()
        1. CAST() 数据类型转换, 参数是表达式, 表达式通过AS关键词分割了2个参数, 分别是原始数据和目标数据类型, CAST 函数在转换数据类型的时候,不会四舍五入, 可以用DECIMAL(a,b)来指定,其中 a 代表整数部分和小数部分加起来最大的位数,b 代表小数位数
        2. COALESCE() 返回第一个非空数值
    2. 聚集函数
      1. COUNT() 总行数
      2. MAX() 最大值
      3. MIN() 最小值
      4. SUM() 求和
      5. AVG() 求平均值
  5. 子查询
    1. 子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询。
    2. 同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为关联子查询。
    3. 集合比较子查询
      1. IN
      2. ANY
      3. ALL
      4. SOME(= ANY)
  6. sql标准, 最常用: sql92, sql99.
  7. join
    1. 集合运算
    2. 等值连接
    3. 非等值连接
    4. 外连接
    5. 子连接
  8. 视图(虚拟表)
    1. 创建视图:CREATE VIEW view_name AS SELECT …
    2. 修改视图:ALTER VIEW view_name AS SELECT …
    3. 删除视图:DROP VIEW view_name
    4. 安全性:虚拟表是基于底层数据表的,我们在使用视图时,一般不会轻易通过视图对底层数据进行修改,即使是使用单表的视图,也会受到限制,比如计算字段,类型转换等是无法通过视图来对底层数据进行修改的,这也在一定程度上保证了数据表的数据安全性。同时,我们还可以针对不同用户开放不同的数据查询权限,比如人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其他人的查询视图中则不提供这个字段
    5. 简单清晰:视图是对 SQL 查询的封装,它可以将原本复杂的 SQL 查询简化,在编写好查询之后,我们就可以直接重用它而不必要知道基本的查询细节。同时我们还可以在视图之上再嵌套视图。这样就好比我们在进行模块化编程一样,不仅结构清晰,还提升了代码的复用率。
    6. 试图是虚拟表, 临时表是真实存在的数据表, 只不过用完了就删除, 临时表只在当前连接存在, 连接关闭后自动释放