Mysql

Mysql命令启停

net start mysql;

net stop mysql;

Mysql命令行命令

  • 退出:exit
  • 显示密码登录mysql:mysql -uroot -proot
  • 隐藏密码登录mysql:mysql -uroot -p
  • 查看数据库:show databases;
  • 使用数据库:use test;
  • 查看表:show tables;
  • 查看表结构:desc 表名;
  • 查看版本号:select version();
  • 查看当前使用的数据库:select database();
  • \c 终止一条sql语句命令输入

SQL基本

  • 起别名:as(省略也可以,用个空格代替),若遇上别名有空格,则用单引号解决

SQL语句分类

  • DQL
    • 查询语言(select)
  • DML
    • 数据操作
    • insert:创建
    • update:修改
    • delete:删除
  • DDL
    • 表操作
    • create:创建
    • drop:删除
    • alter:修改
  • TCL
    • 事务提交:commit
    • 事务回滚:rollback
    • 事务开始:begin
  • DCL
    • 数据库控制语言:例如grant授权、revoke撤销授权

导入数据

  1. use 数据库
  2. source 路径 (路径不能有中文)

条件查询

  • between ... and ... 两个值之间,包含两个值
    • 注意:必须遵循左小右大原则
  • <> 或 != :不等于
  • is null, is not null
  • and,or
  • in
  • like :模糊查询
  • % :匹配任意个字符
  • _ :匹配一个字符 (\_转义)

函数

单行处理函数

一个输入,一个输出:处理完一行后,再处理下一行。

  • lower:转小写
  • upper:转大写
  • substr:截取字符串(被截取的字符串,起始下标,截取长度)
    • 下标从1开始,没有0
  • length:取字符串长度
  • concat:字符串拼接
  • trim:去前后空格
  • str_to_date:字符串转日期
  • date_format:格式化日期
  • format:设置千分位
  • round:四舍五入
    • round(123.123,0) 保留0位小数,
    • 注意:正数是小数,负数对应了十百千万... -2是百位
  • rand:随机数
  • case ... when ... then ... when ... then ... end:
    • select name,job,sal as oldsalary,(case job when 'MANAGER' then sal1.1 when 'SALEMAN' then sal1.5 end) as newsalary
  • ifnull:将null值转为一个具体的值
    • ifnull(数据,被当做那个值)
  • distinct:只能出现在所有字段的最前方

分组函数(多行处理函数)

多个输入,一个输出。

  • sum
  • count
  • avg
  • max
  • min

注意:

​ 1.分组函数在使用的时候必须先进行分组,然后才能调用。若没分组,则整张表默认为1组。

​ 2.分组函数自动忽略null,不需要提前对null进行处理

​ 3.分组函数中 count(*) 和 count(字段) 有什么区别?

​ count(具体字段) :统计所有不为null的行数

​ count(*) :统计所有行数

查询语句执行顺序

  1. from
  2. where
  3. group by
  4. having
  5. select
  6. order by

为什么分组函数不能直接使用在where后面?

  • 因为分组函数在使用的时候必须先分组。where执行的时候还没有分组。

分组查询

  • group by 之后可以跟多个字段
  • 参与分组的字段可以select,
  • 分组函数可以select,

having

  • having和group by必须联合使用
  • 能使用where的优先使用where(优化策略) where只适合使用表里面已知的字段

连接查询

  • 内连接

    • 等值连接:表之间有字段值相等
    • 非等值连接:表连接有字段值不相等
      • 例如:员工表[emp](name,salary)和工资登记表[sal_gra](salary_grade,low_grade,upper_grade)
      • select e.name,e.salary,sg.salary_grade from emp e inner join sal_gra sg on e.salary between sg.low_grade and sg.upper_grade;
    • 自连接:一张表看做事两张表
  • 外连接

    • 左连接
    • 右连接

子查询

select
	...(select).
from
	...(select).
where
	...(select).

where中的子查询

select * from emp where salary > (select min(salary) from emp)

from中的子查询

  • 注意:from后的子查询,可以将子查询的结果作为临时表

select j.job,t.avg_sal,grade from (select position,avg(salary) avg_sal from emp) t join job j on t.avg_sal between j.low_salary and j.high_salary

select中的子查询

  • 注意:select中的子查询只能返回一条结果,多余1条会报错。

select e.ename,e.deptno,(select dname from department where d.deptno = e.deptno) as dname from emp e;

union

合并查询结果集

案例:查询工作岗位是manege和salesman的员工信息

  • 方法一:

select ename,job from emp where job = 'manage' or job = 'salesman';

  • 方法二:

select ename,job from emp where job in ('manage','salesman');

  • 方法三:

(select ename,job from emp where job = 'manage') union (select ename,job from emp where job = 'salesman');

注意:union的效率更高,对于表连接来说,每连接一个新表,则匹配次数满足笛卡尔积,成倍的翻。但是union通过拼接结果集可以减少匹配次数,

匹配次数计算

连接查询

a 连接 b 连接 c

a 10条记录

b 10条记录

c 10条记录

匹配次数:101010=1000

union查询

a 连接 b : 10*10 = 100次

b 连接 c : 10*10 = 100次

union匹配次数 : 100 + 100 = 200

注意事项

  • union合并结果集,查询结果集列数相同
  • 列的数据类型不一致,在mysql允许。但在oracle不允许
posted @ 2021-06-15 00:02  胡一条  阅读(38)  评论(0)    收藏  举报