MySQL之DOS学习

![在这里插入图片描述](https://img-blog.csdnimg.cn/af625dcf519e4515b563589d238dea81.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluX0Rh5Yaw,size_12,color_FFFFFF,t_70,g_se,x_16#pic_center
MySQL之DOS学习_第1张图片
MySQL之DOS学习_第2张图片
MySQL之DOS学习_第3张图片
注:以下查询都是基于以上三张表

什么是表

表:是数据库的基本组成单元,所有的数据都以表格的形式组织,目的是可读性强,一个表包括行和列:

  	行:被称为数据/记录(data) 			列:被称为字段(colum)

每个字段应该包括哪些属性?

  1. 字段名
  2. 数组类型
  3. 相关约束

SQL语句分类

  1. DQL(数据查询语言):查询语句,凡是select语句都是DQL。
  2. DML(数据操作语言):insert delete update,对表当中的数据进行增删改。
  3. DDL(数据定义语言):create drop alert,对表结构的增删改。
  4. TCL(事务控制语言):commit提交事务,rollback回滚事务(TCL中的T是Transation)。
  5. DCL(数据控制语言):grant授权、revoke撤销权限等。

在DOS窗口下使用的一些命令

  1. 登录mysql:mysql -u用户名 -p密码
  2. 查看数据有哪些数据库:show databases; (这个不是SQL语句,是MySQL的命令)
  3. 创建自己的数据库:create database 数据库名
  4. 使用某个数据库:use 数据库名;(这个不是SQL语句,是MySQL的命令)
  5. 查看当前数据库有哪些表格:show tables;(这个不是SQL语句,是MySQL的命令)
  6. dos执行.sql文件:source 文件路径
  7. 查看某个表的结构:desc 表名;
  8. \c命令:结束一条语句
  9. exit退出mysql
  10. select version(); 查看mysql的版本号
  11. select database(); 查看当前使用的是哪个数据库

查询语句

简单的查询语句(DQL)

语法格式:

select 字段1,字段2,字段3,… from 表名;
提示
1、任何一条sql语句以“;”结尾
2、sql语句不区分大小写
3、字段可以参数数学运算
4、给查询结果的列重命名:select ename, sal * 12 as 别名(中文要用品哪个单引号包起来) from 表名(as关键字可以省略)

条件查询

语法格式:

select 字段,字段… from 表名 where 条件;
执行顺序:先from,然后where,最后select

条件查询字符表

运算符 说明
= 等于
<>或!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
between … and … 两个值之间,等同于>= and <=
is null 为null(is not null 不为空)
and 并且
or 或者
in 包含,相当于多个or(not in 不在这个范围中)
not not 可以去非,主要用在is 或 in 中
like like称为模糊查询,支持%(代表任意多个字符)或下划线(_代表任意1个字符)匹配

数据排序(升序、降序)

语法:

select 字段,字段… from 表名 order by 字段
注意:
默认是升序,怎么指定升序或者降序呢? asc表示升序,desc表示降序
select 字段,字段… from 表名 order by 字段 asc(指定升序排)
select 字段,字段… from 表名 order by 字段 desc(指定降序排)
例子:按照工资的降序排列,当工资相同的时候再按照名字的升序排列
select ename,sal from emp order by sal desc,ename asc;
注意:越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序的时候,才会启用后面的字段,order by是最后执行的

分组函数

  1. count 计数
  2. sum 求和
  3. avg 平均值
  4. max 最大值
  5. min 最小值
    注意:所有的分组函数都是对“某一组”数据进行操作的,分组函数会自动忽略Null

例子:找出工资总和?
select sum(sal) from emp;
例子:找出工资高于平均工资的员工?
注意:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中,因为group by 是在where之后执行的
select ename from emp where sal > (select avg(sal) from emp)

select (5)

from(1)

where(2)

group by(3)

having(4)

order by(6)

单行处理函数

1、单行处理函数是输入一行,输出一行
2、ifnull() 空处理函数:ifnull(可能为null的数据,被当做什么处理):属于单行处理函数

group by 和 having(它们是搭档)

group by:按照某个字段或者某些字段进行分组
having:是对分组之后的数据进行再次过滤

例子:找出每个工作岗位的最高薪资
select max(sal) from emp group by job;
注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因,并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的,当一条sql语句没有group by的话,整张表的数据会自成一组

例子:

> 1、找出每个部门的最高薪资,要求显示薪资大于2900的数据
> select max(sal),deptno from emp where sal > 2900 group by deptno;
> 2、找出每个部门的平均薪资,要求显示薪资大于2000的数据
> **注意where后面是不能使用分组函数的**
> select avg(sal),deptno from emp group by detpno having avg(sal) > 2000;

查询结果集的去重 distinct

select distinct job from emp;

distinct只能出现在所有字段的最前面,并且是所有字段联合去重

连接查询

1、什么是连接查询?
在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果
在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表
2、连接查询的分类
(1)根据语法出现的年代来划分的话,包括:SQL92(一些老的DBA可能还在使用这种语法。)、SQL99(比较新的语法)
(2)根据表的连接方式来划分,包括:

内连接:等值连接、非等值连接、自连接

1、等值连接:最大特点是:条件是等量关系
案例:查询每个员工的部门名称,要求显示员工名和部门名
//内连接:inner

  SQL(99):
  	select 
  		e.ename,d.dname #表显示的字段
  	form
  		emp e
  	inner(可省略)join #连接另一张表的名字
  		dept d
  	on #避免笛卡尔积现象的条件
  		e.deptno = d.deptno;(等值关系)

2、非等值连接:最大特点是:连接条件中的关系是非等量关系
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级

  select
  	e.ename,e.sal,s.grade
  from
  	emp e
  join 
  	salgrade s
  on
  	e.sal between s.losal and s.hisal;

3、自连接:最大特点是:一张表看作两张表。自己连自己
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名

  select
  	a.ename as '员工名',b.ename as '领导名'
  from
  	emp a
  join
  	emp b
  on
  	a.mgr = b.empno;
外连接:左外连接(左连接)、右外连接(右连接)

什么是外连接,和内连接有什么区别?

  内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查
  		询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的
  外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张时主表。一张是
  		副表,主要查询主表中的数据,捎带着查询副表,当副表找那个的数据没有
  		和主表中的数据匹配上,副表自动模拟出null与之匹配。

1、左连接:表示左边的这张表是主表
2、右连接:表示右边的这张表是主表
注意:左连接有右连接的写法,右连接也会有对应的左连接的写法
案例: 找出每个员工的上级领导?(所有员工必须全部查询出来:使用外连接)

   #内连接
  select
  	a.ename as '员工',b.ename as '领导'
  from
  	emp a
  join  
  	emp b
  on
  	a.mgr = b.empno;

  #外连接中的左连接
  select
  	a.ename as '员工',b.ename as '领导'
  from
  	emp a
  left outer(可省略) join  
  	emp b
  on
  	a.mgr = b.empno;

  #上面左连接改为右连接(右表为主表)
  select
  	a.ename as '员工',b.ename as '领导'
  from
  	emp b
  right join  
  	emp a
  on
  	a.mgr = b.empno;
全连接(少用)

3、笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件限制时,最终的查询结果条数是两张表记录条数的乘积,可以加条件进行过滤

3张表以上连接查询

案例:找出每一个员工的部门名称以及工资等级(1)、以及上级领导(2)

(1)
select 
	e.ename,d.dname,s.grade
from
	emp e
join
	dept d
on
	e.deptno = d.deptno
join
	salgrade s
on
	e.sal between s.losal and s.hisal;

(2)外加条件上级领导
select 
	e.ename '员工',d.dname,s.grade,el.ename '领导'
from
	emp e
join
	dept d
on
	e.deptno = d.deptno
join
	salgrade s
on
	e.sal between s.losal and s.hisal
left join
	emp el
on
	e.mgr = el.empno;

你可能感兴趣的:(后端小知识,mysql,数据库,database)