MySQL学习总结1

1、SQL、DB和DBMS的介绍

SQL:结构化查询语言,保准的sql适用于所有的数据库产品。

DB:指的是数据库,数据库实际上以文件的形式存在于硬盘中。

DBMS:数据库管理系统。

我们常说的MySQL数据库其实指的是MySQL数据库管理系统。

2、SQL语句的分类

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

3、sql脚本:

拓展名是.sql,并且该文件中编写了大量的sql语句

4、对数据库的常见操作命令

# 登录mysql数据库管理系统  
mysql -uroot -p
# 查看有哪些数据库
show databases;  # 这个不是SQL语句,属于MySQL的命令。
# 创建数据库
create database bjpowernode; # 这个不是SQL语句,属于MySQL的命令。
# 切换到bjpowernode数据库
use bjpowernode; # 这个不是SQL语句,属于MySQL的命令。
# 查看当前数据库下的表
show tables; # 这个不是SQL语句,属于MySQL的命令。
# 导入sql脚本,初始化数据
source D:\course\05-MySQL\resources\bjpowernode.sql
# 删除数据库
drop database bjpowernode;
# 查看表结构
desc emp;
# 查看当前使用的是哪个数据库
select database();
# 查看数据库版本
select version();
# 查看建表语句
show create table emp;
# 结束一条SQL语句
\c
# 退出mysql
exit;

5、sql规范

规范1:任何一条sql以“;”结尾;

规范2:推荐sql语句使用大写;

规范3:标准sql语句中要求字符串使用单引号括起来。虽然mysql支持双引号,尽量别用。

6、DQL总结

普通查询语法格式

select
​      字段1,字段2,...
from
​      表名

查询员工的年薪

select ename,sal*12 from emp; # 字段可以参与数学运算
select ename,sal*12 as yearsal from emp; # 使用as给查询结果的列重命名
select ename,sal*12 yearsal from emp; # as可以省略
select ename,sal*12 '年薪' from emp; # 别名中有中文需要使用引号括起来

条件查询语法格式

select
​      字段1,字段2,...
from
​      表名
where
​      条件;

执行顺序:先执行from,然后where,最后select

# 查询工资等于5000的员工姓名
select ename from emp where sal = 5000;
# 查询SMITH的工资
select sal from emp where ename = 'SMITH';
# 找出工资高于3000的员工
select ename,sal from emp where sal > 3000;
# 找出工资不等于3000的
select ename,sal from emp where sal != 3000;
# 找出工资在1100和3000之间的员工,包括1100和3000
select ename,sal from emp where sal >= 1100 and sal <= 3000;
select ename,sal from emp where sal between 1100 and 3000; 
# 找出哪些人津贴为NULL
select ename,comm from emp where comm is null;
# 找出哪些人津贴不为NULL
select ename,comm from emp where comm is not null;
# 找出哪些人没有津贴 
select ename,comm from emp where comm is null or comm = 0;
# 找出工作岗位是MANAGER和SALESMAN的员工
select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
select ename,job from emp where job in('SALESMAN','MANAGER');
# 找出工作岗位不是MANAGER和SALESMAN的员工
select ename,job from emp where job != 'SALESMAN' and job != 'MANAGER';
select ename,job from emp where job not in('SALESMAN','MANAGER');

between and的使用注意事项

注意1:between and在使用的时候必须左小右大

between 3000 and 1100; # 查询不到任何数据

注意2:between and使用在数字方面表示闭区间

between 1100 and 3000; # 是闭区间 [1100 ~ 3000]

注意3:between and使用在字符串方面表示左闭右开

注意:and和or联合起来如果不确定运算符的优先级的时候加小括号。

7、模糊查询like

在模糊查询当中,必须掌握两个特殊的符号,一个是%,一个是_。

%代表任意个字符,_代表任意1个字符。

# 找出名字当中含有O的
select ename from emp where ename like '%O%'; # 注意不要忘记单引号
# 找出名字中第二个字母是A的
select ename from emp where ename like '_A%';
# 找出名字中有下划线的
select ename from emp where ename like '%\_%';
# 找出名字中最后一个字母是T的
select ename from emp where ename like '%T';

8、排序

使用order by关键字,默认是升序。

怎么指定升序或者降序呢?asc表示升序,desc表示降序。

# 按照工资升序,找出员工名和薪资
select ename,sal from emp order by sal;
select ename,sal from emp order by sal asc;
# 按照工资降序,找出员工名和薪资
select ename,sal from emp order by sal desc;
# 按照工资的降序排列,当工资相同的时候再按照名字的升序排列。
select ename,sal from emp order by sal desc, ename asc; # 注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。
# 找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。
select ename,job,sal from emp where job = 'SALESMAN' order by sal desc;

执行顺序

select 
		字段						3
from
		表名						1
where
		条件						2
order by
		....						4
	
order by是最后执行的。

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

特点:输入多行,最终输出的结果是1行。

函数介绍
count计数
sum求和
avg平均值
min最小值
max最大值

注意1:所有的分组函数都是对“某一组”数据进行操作的。
注意2:分组函数自动忽略NULL。

# 找出工资总和
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(ename) from emp;
# 找出工资高于平均工资的员工
select ename,sal from emp group by sal having sal > (select avg(sal) from emp);

找出工资高于平均工资的员工

select ename,sal from emp where sal > avg(sal);  //ERROR 1111 (HY000): Invalid use of group function
错误信息:无效的使用了分组函数
原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中。
解释:因为group by是在where执行之后才会执行的。
select		     5
	..			
from			 1
	..
where			 2
	..
group by		 3
	..
having		     4
	..
order by		 6
	..	

count(*)和count(具体的某个字段),他们有什么区别?

count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)

count(comm): 表示统计comm字段中不为NULL的数据总数量

10、单行处理函数

特点:输入一行,输出一行

# 计算每个员工的年薪
select ename,(sal+comm)*12 as yearsal from emp;  # NULL
重点:所有数据库都是这样规定的,只要有NULL参与的运算结果一定是NULL。
使用ifnull函数:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

11、group by 和 having

关键字介绍
group by对某个字段进行分组
having对分组之后的数据进行再次过滤
  • 分组函数一般都会和group by联合使用,这也是它叫分组函数的原因
  • 任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
  • 当一条sql语句没有group by的话,整张表的数据会自成一组。
    select ename,max(sal),job from emp group by job;
    以上在mysql当中,查询结果是有的,但是结果没有意义,在Oracle数据库当中会报错。语法错误。
    Oracle的语法规则比MySQL语法规则严谨。

记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段

# 每个工作岗位的平均薪资
select job,avg(sal) from emp group by job;
# 出每个部门不同工作岗位的最高薪资
select deptno,job,max(sal) from emp group by deptno, job;
# 找出每个部门的最高薪资,要求显示薪资大于2900的数据
select deptno,max(sal) from emp group by deptno having max(sal) > 2900; # 效率低,不推荐
select deptno,max(sal) from emp where sal > 2900 group by deptno; # 效率较高,建议能够使用where过滤的尽量使用where
# 找出每个部门的平均薪资,要求显示薪资大于2000的数据
select deptno,avg(sal) from emp group by deptno having max(sal) > 2000;

12、一个完整SQL的写法和执行顺序 (重要)

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

13、去重

使用distinct关键字进行去重
注意:distinct只能出现在所有关键字的前面。

# 统计岗位数量
select count(distinct job) from emp;
select distinct job from emp; # 对job字段进行去重
select distinct job,deptno from emp; # 对job和deptno的联合结果进行去重
错误写法:select job, distinct deptno from emp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值