• 尚硅谷MySQL基础篇(P1~P95)


    尚硅谷--MySQL--基础篇(P1~P95)

    参考链接:https://www.bilibili.com/video/BV1iq4y1u7vj?p=199&spm_id_from=pageDriver

    尚硅谷非常好的视频之一,由于时间原因先学的高级篇,建议结合前面《JavaGuider-数据库篇》进行查漏补缺,整个Mysql完整系统性学下来还是非常有收获的。

    csdn csdn csdn csdn csdn


    1. Mysql基础篇

    1.1.基本概念
    1.1.1 数据库名词

    ​ DBMS:数据库管理系统(管理各个数据库)如:mysql Server,Oracle

    ​ DB:数据库

    ​ RDBMS:关系型数据库,即二维表格数据

    ​ 非RDBMS:非关系型数据库,如键值数据库,文档型数据库

    1.1.2 ER图与表关联关系

    ​ ER图:实体集(库表)、属性(字段)、联系集(库表之间关系)

    ​ 表关联关系:一对一、一对多、多对多、自我引用

    1.1.3 SQL名词
    1. DDL(data definition language):数据定义语言,操作库表, create, drop, alter
    2. DML(data manipulation language):数据操作语言, CRUD
    3. DCL(data control language):数据控制语言。commit ,rollback
    4. TCL(transaction control language): 单独抽取commit rollback
    1.1.4 笛卡尔积

    ​ 两张表的乘积个数。

    (表一旦取了别名就不能再用表原名)

    1.1.5 连接查询
    1. Mysql不支持满外连接

    2. union返回两个结果集并集并去重

    3. union all 返回两个结果并集不去重(若明确知道重复数据,则使用union all 可以提高查询效率)

    4. natural join

      1. -- 目前都是mysql采用SQL99语法: 自动查询两张表中所有字段相同,实现select * from emp join dept where emp.did = dept.did and emp.name = dept.name这种
        SELECT * FROM `emp` NATURAL join dept
        
        -- 等价于emp.did=dept.did中同名字段
        select * from emp join dept using(did)
        
    1.2 基本语法
    1.2.0 基本语法
    -- 算术运算符
    select 100 + 17.6, 10 * 5, 100 / 2;
    select * from user where id % 2 =0;
    
    -- <=>安全的等于
    select * from user where id <=> 1;
    -- 不等于
    select * from user where id <> 1;
    
    1.2.1 基本函数
    -- 数学:三角、进制函数
    -- 字符串函数
    /*日期函数:惭愧,以前还写了篇SQL高级用法博客,结果在尚硅谷这里也只是基本篇某个篇章,越是无知越自大啊。
     https://www.cnblogs.com/meditation5201314/p/15143702.html
     
     */
     
     -- 流程控制函数 if可以选择2种结果。 case when... else end类似于if else 
    select id, if(id >= 1, 'id大于等于1', 'id小于1'),
    case when id = 1 then 'id等于1'
    		 when id >1 and id <= 2  then 'id大于1小于2'
    		 else '大于2' end 'details'
     from emp 
     -- case ..when..else .. end 结合算术运算使用类似于switch..case
     select case id when 1 then id * 100
    				else id *200 end '新id'
    from emp				
    
    -- 	Mysql信息函数	
    select 
    VERSION() 'Mysql版本', 
    CONNECTION_ID() '连接id', 
    DATABASE() '数据库', 
    SCHEMA(),
    USER() '用户',
    CURRENT_USER() '当前用户',
    CHARSET('尚硅谷') '字符集',
    COLLATION('尚硅谷') '比较规则'
    
    
    
    1.2.2 聚集函数
    -- 可以单独使用sum, avg,count这些
    select sum(id) from emp;
    select avg(id) from emp
    
    
    -- 分组后可以统计组内其他字段
    SELECT name, sum(last_qr_user_id) FROM `user` group by name
    -- 多个字段分组
    -- varchar类型存储int数据,也是可以相加的
    SELECT name, last_qr_user_id, sum(last_transfer_time) FROM `user` group by name, last_qr_user_id
    -- select中非组函数字段必须申明在group by中
    -- with rollup,在分组后取一条不分组、所有数据的条件来做个比较
    SELECT name, sum(last_qr_user_id) FROM `user` group by name with ROLLUP
    -- Having必须在group后面使用
    SELECT name, sum(last_qr_user_id) FROM `user` group by name having max(last_qr_user_id) > 1
    
    
    -- 总体顺序 SQL执行原理:先多表join弄出一张虚拟表,然后根据条件查询
    select ....from ...join on 
    where .... 
    group ....
    having ....
    order by ....
    limit ...
    
    
    
    1.3 子查询
    1.3.1 基本概念

    ​ 一条SQL查询出来的值查询完后,供另一条SQL主查询使用。能用自连接尽量避免子查询,因为是对未知表先查询,mysql处理器对自连接做了优化。

    1.3.2 子查询分类
    1. 单行、多行子查询:看内查询返回的结果
    1. **相关、不相关子查询**:子查询和主查询是否相关
    
    1.3.3 单行子查询

    单行子查询就是只返回一行结果

    -- 成对,可以进行多字段子查询
    select * from user where (last_transfer_time, last_qr_user_id) in (
    select last_transfer_time, last_qr_user_id from user where id in(67, 69)
    )
    
    -- 子查询配合having使用
    select name, min(last_qr_user_id) from 
    user group by name having min(last_qr_user_id) < (
    select max(last_qr_user_id) from user
    )
    
    ##单行子查询-针对某个不确定的字段
    SELECT
    	id,
    	NAME,
    	(
    	CASE
    			name
    		WHEN ( SELECT name FROM USER WHERE NAME = 'a函数一' ) then '胡宇乔' 
    		ELSE '其他' END ) new_Name 
    FROM
    USER
    
    -- 错误用法!:不能重复嵌套聚合函数
    select sum(avg(last_qr_user_id)) from user group by name
    
    
    
    1.3.4 多行子查询

    多行子查询:返回多个子查询结果

    操作符:

    1. in: 列表任意一个
    1. any: 和单行比较
    
    -- NULL问题:无论是单行还是多行,对子查询的值小心NULL值,因为in 相当于or = ,in (1, null) 等价于 a = 1 or a = null,而=null在MYSQL中查询不到任何数据,只能用is null,记得剔除
    ##多行子查询-any,all,some。any,some类似找min,all类似找MAX
    #any
    SELECT
    	* 
    FROM
    USER
    where id > ANY (select id from user where id > 1)
    #all
    SELECT
    	* 
    FROM
    USER
    where id >= ALL (select id from user where id > 1)
    #some
    SELECT
    	* 
    FROM
    USER
    where id >= SOME (select id from user where id > 1)
    
    
    
    
    
    1.3.5 相关子查询(*)
    这个还是非常重要,比如查询一张用户-客户表中,所有用户最早添加客户的时间,就需要用到相关子查询
    select * from a 
    where a.add_time = (select min(add_time) from a2 where a.clientid = a2.clientid)
    
    
    /* 除了group by 和limit 后,其他地方都可以声明子查询
    select ..
    from ...
    where ...
    group by ...
    having ..
    order by ..
    limit ...
    
    
    */
    
    1.4 数据类型
    1.4.1 时间类型

    ​ 推荐datetime,会随着服务器地区变换而变化,但timestamp不会

    1.4.2 文本字符串类型

    ​ char, varchar(不要超过5000), text, enum

    ​ blob: 存储图片,音频,视频

    ​ json


    1.5 个人总结

    image-20220731120202523

    【MySQL上篇:基础篇】
    【第1子篇:数据库概述与MySQL安装篇】
    p01-p11
    学习建议:零基础同学必看,涉及理解和Windows系统下MySQL安装

    【第2子篇:SQL之SELECT使用篇】
    p12-p48
    学习建议:学习SQL的重点,必须重点掌握,建议课后练习多写

    【第3子篇:SQL之DDL、DML、DCL使用篇】
    p49-p73
    学习建议:学习SQL的重点,难度较SELECT低,练习写写就能掌握

    【第4子篇:其它数据库对象篇】
    p74-p93
    学习建议:对于希望早点学完MySQL基础,开始后续内容的同学,这个子篇可以略过。
    在工作中,根据公司需要进行学习即可。

    【第5子篇:MySQL8新特性篇】
    p94-p95
    学习建议:对于希望早点学完MySQL基础,开始后续内容的同学,这个子篇可以略过。
    在工作中,根据公司需要进行学习即可。

  • 相关阅读:
    DripRoad(点滴之路)
    如何写优雅的代码
    .Net 一直在改变
    Protobufnet的完美解决方案
    关于msgpack序列化后的消息包是否再压缩
    失眠
    创建一个比微软性能更好空间更少的GUID
    msgpack与protobuf的简单性能测试对比
    分布式游戏服务器的登陆流程
    对象池的实现与性能测试
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/16536826.html
Copyright © 2020-2023  润新知