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
原文地址:https://www.cnblogs.com/qian-shan/p/12940229.html