zoukankan      html  css  js  c++  java
  • mysql安装中的坑及学习笔记

    安装


    1. 打开mysql的安装目录,在安装目录的bin文件中,有一个mysqld的空文件,删除即可

    基础

    • sql语句以";"结尾
    • sql不区分大小写
    • 使用as设置小名,但是也可以省略。eg:my_table.name1 as '员工' 等于 my_table.name1 '员工'
    • 字符串使用单引号''标注

    1. 每一个字段包含的属性:字段名,数据类型,相关的约束

    2. SQL语句的分类:

    • DQL(数据查询语言): 查询语句,包含select的
    • DML(数据操作语言): insert, delete, update, 对表中数据的增,删,改
    • DDL(数据定义语言): create, drop, alter, 对表结构的增, 删,改
    • TCL(事务控制语言): commit提交事务,rollback回滚事务。(TCL中的T是transaction)
    • DCL(数据控制语言): grant授权,revoke撤销权限等。

    3. 基础操作:

    • mysql -umy_username -pmy_password
    • show databases: 查看所有数据库(不是sql语句,只是mysql的命令)
    • create database my_database: 创建数据库(不是sql语句,只是mysql的命令)
    • use my_database: 使用某个数据库(不是sql语句,只是mysql的命令)
    • select database(): 查看当前使用的数据库名(不是sql语句,只是mysql的命令)
    • select version(): 查看mysql的版本号(不是sql语句,只是mysql的命令)
    • show tables: 查看当前数据库中的所有表(不是sql语句,只是mysql的命令)
    • source 我的数据文件.sql:初始化数据,表的结构存储在sql文件中
    • drop database my_database: 删除数据库
    • desc my_table: 查看表的结构
    • c: 终止一条语句
    • exit: 推出mysql
    • show create table my_table: 查看创建表时执行的sql语句

    4. sql脚本:

    以sql为文件扩展名,在文件中编写sql语句,使用source命令执行sql文件(如上),来批量执行sql语句

    5. 查询语句:

    select 字段1 as 字段A,字段2 as 字段B ... from 表名 where 条件
    字段中可以进行数值计算
    条件中的运算符包括:

    • =
    • <>或!=
    • <
    • <=
    • >
    • >=
    • between ... and ...
    • is null
    • and
    • or
    • in: 后面的范围使用()标注而不是[]
    • not
    • like:迷糊查询,使用"%"匹配零或任意多的字符,使用"_"匹配任意一个字符
    • : 转义符
      数据库中NULL 不是一个值,为空,不能说空值,不能使用=号来衡量。必须使用is null 或者is not null
      使用"()"来控制优先级
    select distinct name1  from my_table  //distinct关键字删除结果集中重复的记录
    

    distinct只能放在所有字段的最前端,后面所有字段联合起来去重

    //统计岗位数量
    select count(distinct job) from emp
    

    6. 排序

    order by

    • select * from my_table order by name1 desc, name2 asc #先按照name1降序排序,name1相同时,按照name2升序排序
      order by 后面可以使用前面用as定义的别名

    7. 分组函数,多行处理函数(输入多行,输出1行)

    通常和group by一起使用,在group by执行后再执行。
    分组函数不可以直接出现在where子句当中。
    例如:找出工资高于平均工资的员工名子
    错误:selct name from my_table where sal > avg(sal); #此时会报错,因此分组函数在group by之后执行,而group by在where后执行,还没有分组就不能使用分组函数
    正确:```sql
    select name from my_table where sal > (select avg(sal) from my_table);

    自动忽略NULL,只要NULL参与运算,结果就是NULL。可以使用ifnull来处理
    * ifnull(name1, 0): 空处理函数,如果name1为null,则按0计算
    * count: 计数
    * sum: 求和
    * avg:求平均值
    * max: 最大值
    * min: 最小值
    count(*)和count(具体某个字段)的区别:
    * count(*): 统计总记录条数(和字段无关)
    * count(name1): 统计name1字段中不为NULL的数据总数
    ### 8. group by和having
    * group by: 按照某个字段或者某些字段进行分组
    没有group by时,整张表的数据自成一组
    * having: 对分组后的数据进行再次过滤,相当于低优先级的where,不同优先级有其不可替代的功能
    ####案例: 
    找出每个工作岗位的最高薪资
    ```select max(sal), job from emp group by job;```
    找出每个部门不同工作岗位的最高薪资
    

    select dep, job, max(sal) from emp group by dep, job;

    在sql语句中,有group by时,select的字段只能是分组函数和分组字段
    
    ```sql
    //找出每个部门的最高薪资,要求显示薪资大于2000的数据
    select dep, max(sal) from emp group by dep having max(sal) > 2900;  //这种方式效率低
    select dep, max(sal) from emp where sal > 2000 group by dep; //由于参加分组的数据变少,效率变高
    #找出每个部门的平均薪资,要求显示薪资大于2000的数据
    select dep, avg(sal) from emp group by dep having avg(sal) > 2900;   //只能使用having方式不能使用where
    

    总结完整的DQL语句的写法

    //按优先级
    select          // 6
          ...
    form            // 1
          ...
    where           // 2
          ...
    group by        // 3
          ...
    having          // 4
          ...
    order by        // 5
          ...
    

    连接查询

    笛卡尔积现象:两张表的连接查询如果没有条件限制的话,结果集的数量是两张表的数量的乘积

    1. 分类:

    • 内连接:
      等值连接
      非等值连接:between ... and ...
      自连接
    • 外连接:
      左外连接(左连接)
      右外连接(右连接)
    • 全连接(几乎不用)

    2. 内连接

    2.1 等值连接

    select
          e.ename, d.dname
    from
          emp e
    join                //join 相当于inner join,inner可以省略
          dep d
    on
          e.depid = d.depid
    where
          ...
    
    • join on用来关联两张表之间的关系的

    2.2 非等值连接

    连接条件中的关系是非等量关系

    //显示每个员工的薪资等级
    select
          e.ename, e.sal, s.grade
    from 
          emp e
    join
          salgrade s
    on 
          e.sal between s.losal and s.hisal;
    

    2.3 自连接

    一张表看作是两张表,自己连接自己

    //找出每个员工的上级领导,要求显示员工名和对应的领导名。所有人均在emp表中,且mgr字段指向上级领导的编号,empno字段指向所有人的编号
    select
          a.ename as '员工名', b.ename as '领导名'
    from 
          emp a
    join
          emp b
    on a.mgr = b.empno;
    

    3. 外连接

    内外连接的区别:表A和表B进行连接

    • 内连接:A和B没有主次之分,反是A表和B表能够匹配上的记录都查询出来
    • 外连接:A和B一张是主表,一张是副表,主要查询主表中的内容,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配
      分为两类:
    • 左外连接(左连接):左边的表是主表
    • 右外连接(右连接):右边的表是主表
    //查询每个员工的上级领导,显示员工名和领导名,有员工表和领导表(可能有的员工没有上级领导,但是也要显示员工)
    select 
          a.ename '员工',b.ename '领导'
    from
          emp a
    left join            //如果a中的记录在b中匹配不到,则使用null来代替,而不是过滤掉这个记录,left outer join 相当于left join 
          emp b
    on      
          a.mgr = b.empno;
    
    //查询没有员工的部门
    select
          d.*
    from
          emp e
    right join
          dep d
    on 
          e.depid = d.depid
    where
          e.empid id null
    

    4. 全连接

    类似左右连接,但是左右都是主表,A表中没有的记录不能影响B表的查询,B表中没有的记录不能影响A表的查询

    5. 多张表的连接

    //找出每一个员工的部门名称,工资等级,以及上级领导(有的员工没有上级领导,所以此处应该用外连接)
    select
          e. ename '员工', d.dname, s.grade, e1.ename '领导'
    from
          emp e
    join
          dep d
    on 
          e.depid = d.depid
    join
          salgrade s
    on
          e.sal between s.losal and s.hisal
    left join
          emp e1
    on
          e.mgr = e1.empid
    
  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/qian-shan/p/12940229.html
Copyright © 2011-2022 走看看