• 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
    
  • 相关阅读:
    J2EE规范
    Java Web 之 SSM笔记
    Spring 官方文档笔记
    Linux学习之路--常用配置
    Linux学习之路--常用命令讲解
    人工智能学习-第二天
    人工智能学习-第一天
    人工智能学习-专业英语单词积累
    20190603 (一)安装Scrapy的环境
    20190530 数据分析
  • 原文地址:https://www.cnblogs.com/qian-shan/p/12940229.html
Copyright © 2020-2023  润新知