MySQL --- 基础入门到精通(一)

数据库的概述

1、SQL DB DBMS 分别是什么?他们之间的关系?

DB:
DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DMBS:
DataBase Mangement System(数据库管理系统,常见的有:MySQL,Oracle,DB2,SqlSever…)
SQL:
结构化查询语言,是一门标准通用的语言,标准的SQL适用于所有的数据库产品.
SQL属于高级语言,只要能看懂英语单词,写出来的SQL就能读懂.
SQL语句在执行的时候,实际上内部会先进行编译,然后执行SQL(sql语句的编译有DBMS完成)
DBMS负责执行SQL语句,通过执行的SQL语句来操作DB中的数据.

SQL语句的分类

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

MySQL常用命令

查看数据库:

show databases;

在这里插入图片描述

创建数据库:

create database 数据库名;

在这里插入图片描述

使用数据库:

use database 数据库名;

在这里插入图片描述

查看数据库中有那些表:

show tables;

在这里插入图片描述
删除数据库:

drop database 数据库名;

在这里插入图片描述

查看表结构:

desc 表名;

在这里插入图片描述在这里插入图片描述在这里插入图片描述
查看表中的数据:

select * from 表名;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看当前使用那个数据库:

select database();

查看MySQL的版本号:

select version();

结束一条语句:

\C

退出MySQL:

exit

查看创建表的语句:

show create table 表名;

注:以上不是SQL语句,属于SQL命令;

SQL语句

简单查询

语法格式:

select 字段名1,字段名2,字段名3,......from 表名;

在这里插入图片描述
在这里插入图片描述
查询员工的年薪(字段可以参与数学运算):

select enname,sal * 12 from emp;

在这里插入图片描述
查询结果的列重命名:

select ENNAME ,sal * 12 as yearsal from emp;
//如果含有中文字符需要用单引号括起来:
select ENNAME ,sal * 12 as '年薪' from emp;
//as 关键字可以省略
select ENNAME ,sal * 12 yearsal from emp;

在这里插入图片描述
在这里插入图片描述
查询所有字段:

select * from emp;
//实际开发中 不建议使用*,效率较低.

在这里插入图片描述

提示:任何一条SQL语句以";"结尾.

查看创建表的语句:

select create table 表名;

在这里插入图片描述

条件查询

语法格式:

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

查询工资等于5000的员工姓名:

select enname from emp where sal = 5000;

在这里插入图片描述
查询SMITH的工资:

select sal from emp where name = 'SMITH';

在这里插入图片描述
找出工资大于3000的员工:

select enname ,sal from emp where sal > 3000;

在这里插入图片描述
找出工资不等于3000的员工:

select enname,sal from emp where sal <> 3000;

在这里插入图片描述
找出工资在1100到3000的员工,包括1100和3000:

select enname ,sal from emp where sal >= 3000 and sal <=1100;
select enname ,sal from emp where sal between 1100 and 3000;
//between...and... 是闭区间[1100 ~ 3000]
//between...and...除了应在数字方面, 也可以用在字符串方面.

条件查询 is null 和is not null

找出那些人没有津贴:

select enname ,sal ,comm from emp where comm is null;
//在数据库中null不是一个值,代表什么也没有,为空,空不是一个值,不能赢等号衡量,必须是is null 或 is not null.

在这里插入图片描述
找出那些人没有津贴不为null:

select enname ,sal ,comm from emp where comm is not null;

在这里插入图片描述
找出工作岗位是MABAGER和SALESMAN的员工:

select enname,job from emp where job = 'MABAGER' or 'SALESMAN';

在这里插入图片描述

and 和 or 优先级问题

找出薪资大于1000并且部门编号是20或30部门的员工:

select enname,sal depyno from emp where sal > 1000 and (deptno = 20 or deptno = 30);
//当优先级不确定的时候加小括号

在这里插入图片描述

条件查询 In

找出工作岗位是MABAGER和SALESMAN的员工:

select enname,job from emp where job in ('MABAGER' , 'SALESMAN');
//in 等同于 or.
//in 后面不是区间 是具体的值

在这里插入图片描述

模糊查询like

找出第二个字母是A的:

select enname from emp where enname like '_A%';
//如果要查找name列中含有'_'的,需要加上转义字符'\';
//select enname from emp where enname like '\_';

在这里插入图片描述

数据排序(升序,降序)

select enname,sal from emp order by sal;//默认升序
select enname,sal from emp order by sal asc;//升序
select enname,sal from emp order by sal desc;//降序

在这里插入图片描述
在这里插入图片描述
按照工资的降序排列,当工资相同的时候再按名字升序排列:

select enname,sal from tmp order by sal desc,enname asc;
//越靠前面的字段越起到引导作用,只有当前面的字段无法排序的时候.才会启用后面的字段

在这里插入图片描述

select enname,sal from tmp order by 2;
//这里的2表示的是第二列;

在这里插入图片描述
找出工作岗位是SALESMAN的员工,并且要求按照薪资降序排列:

select 
    enname,job,sal      //3
from
    emp                 //1
where
    job = 'SALESMAN'    //2
order by 
    sal desc;           //4
    //按照顺序依次执行;

在这里插入图片描述

分组函数

count:计数
sum:求和
avg:平均值
max:最大值
min:最小值
注:所有的分组函数都是对某一组数据进行操作的

对薪资求和:

select sum(sal) from emp;

在这里插入图片描述

//找出最高工资
select max(sal) from emp;
//找出最低工资
select min(sal) from emp;
//找出平均工资
select avg(sal) from emp;
//找出总人数
select count(*) from emp;
select count(enname) from emp;

分组函数自动忽略NULL:

select count(comm) from emp;

在这里插入图片描述
计算每个员工的年薪:

select enname,(sal+comm)*12 as yearsal from emp;
//所有数据库中,只要是有null的运算,计算结果都是NULL

在这里插入图片描述
正确写法:

select enname,(sal+if null(comm,0))*12 as yearsal from emp;

在这里插入图片描述

count(*) 和count(具体某个字段)

在这里插入图片描述

count(*) :不是统计某个字段中数据的个数,二十统计总记录条数.(和某个字段无关)
count(comm):表示统计comm字段中不为null的数据总数量. 分组函数也能组合起来用:

select count(*),sum(sal),avg(sal),max(sal),min(sal) from emp;

在这里插入图片描述

select enname,sal from emp where sal > avg(sal);//ERROR

以上SQL语句错误信息:无效的使用了分组函数. 原因:SQL语句当中有一个语法规则,分组函数不可直接用在where字句当中. 因为group
by 是在where执行之后才会执行的.

group by 和 having

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

案例:找除每个工作岗位的最高薪资:

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

在这里插入图片描述
在这里插入图片描述

注意:分组函数一般都会和group by 联合使用,这也是为什么它被称为分组函数的原因.并且任何一个分组函数(count max min
sum avg)都是在group by 语句执行结束之后才会执行的,当一条SQL语句没有group by 的话,整张表的数据会自成一组.

找出工资高于平均工资的员工:
第一步:找出平均工资

select avg(sal) from emp;

在这里插入图片描述
第二步:找出高于平均工资的员工:

select enname,sal from emp where sal > 2073.214286;

在这里插入图片描述

联合起来嵌套 :

//子查询
select enname,sal from emp where sal > (select avg(sal) from emp);

在这里插入图片描述
每个工作岗位的平均薪资:

select job ,avg(sal) from emp group by job;

在这里插入图片描述

select enname,max(sal),job from emp group by job;
以上字段在MySQL中,查询结果是有的,但是结果没有意义,在Oracle数据库当中会报错,语法错误.
Oracle的语法规则比MySQL的语法规则更严谨.
记住一个规则:当一条语句中有group by 的话,select 后面只能跟分组函数和参与分组的字段.

多个字段能不能联合起来一起分组?
案例:找出每个部门不同工作岗位的最高薪资

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

在这里插入图片描述

having 和 where 的选择

找出每个部门的最高薪资,要求显示薪资大于2900的数据.
第一步:找出每个部门的最高薪资.
在这里插入图片描述
第二步:找出薪资大于2900.
在这里插入图片描述以上这种方式效率低;

正确写法:

select max(sal),deptno from emp where sal > 2900 group by deptno;
//效率较高,建议能够使用where 过滤的尽量使用where

在这里插入图片描述
找出每个部门的最高薪资,要求显示薪资大于2000的数据:
第一步:找出每个部门的最高薪资

select max(sal),deptno from emp group by deptno;

在这里插入图片描述
第二步:要求显示薪资大于2000的数据.

select max(sal),deptno from emp group by having avg(sal) > 2000;

在这里插入图片描述

where 后面不能使分组函数: select max(sal),deptno from emp where avg(sal) > 2000
group by deptno; //错误了. 这种情况只能使用having过滤.

关于查询结果集的去重

1、

select distinct job from emp;

在这里插入图片描述
注意:distinct 只能出现在所有字段的最前面.

select distinct deptno,job from emp;

在这里插入图片描述
案例:统计岗位的数量:

select count(distinct job) from emp;

在这里插入图片描述

连接查询

什么是连接查询? 在实际开发中,大多数情况下都是从单表中查询,一般都是多张表联合查询去除最终的结果
在实际开发中,一般一个业务都会对应多张表,比如:学省和班级,最起码两张表.
在这里插入图片描述
学生和班级存储到一张表中,结果就像上面一样,数据会存在大量的重复,导致数据的冗余.

猜你喜欢

转载自blog.csdn.net/m0_62764440/article/details/124144842