1、DBMS(数据库管理系统)
DBMS(数据库管理系统)负责执行sql语句,通过sql语句来操作DB当中的数据。可以理解为:DBMS -(执行) - > SQL - (操作) -> DB
2、什么是表?
表:table
表:table是数据库的基本组成单元,所有的数据都以表的形式组织,可读性强。
一个表包括行和列:
行:被称为数据/ 记录(data)
列:被称为字段(column)
每一个字段应该包括哪些属性?
字段名、数据类型、相关的约束
3、学习MySQL主要还是学习通用的SQL语句,SQL语句包括增删改查,该怎么分类呢?
DQL:(数据查询语言):查询语句,凡是select语句都是DQL。
DML:(数据操作语言):insert delete update,对表当中的数据进行增删改。
DDL:(数据定义语言):create drop alter,对表结构的增删改。
TCL:(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction)。
DCL:(数据控制语言):grant授权、revoke撤销授权等。
4、导入数据
第一步:登录mysql数据库管理系统
DOS命令窗口:
mysql - uroot -proot
第二步:查看有哪些数据库
show databases;(这个不是SQL语句,属于MySql的命令。)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
第三步:创建属于我们自己的数据库
create database bjpowernode;(这个不是SQL语句,属于MySql的命令)。
第四步:使用bjpowernode数据
use bjpowernode;(这个不是SQL语句,属于MySql的命令)。
第五步:查看当前使用的数据库中有那些表?
show tables;(这个不是SQL语句,属于MySql的命令)。
第六步:初始化数据
mysql> source source C:\Users\HP\Downloads\bjpowernode.sql
在初始化数据完成后,可以通过命令:show table来查看当前数据库的表。
5、****.sql
这个文件以sql结尾,这样的文件被称为“sql脚本”。什么是sql脚本呢?
当一个文件的扩展名是.sql,并且该文件中编写了大量的SQL语句,我们称这样的文件为sql文件。
注意:直接使用source命令可以直接执行sql脚本。
sql脚本中的数量太大的时候,无法打开,请使用source命令完成初始化。
6、删除数据库:drop database ***。
7、查看表结构:
mysql> use bjpowernode
Database changed
mysql> show tables;
±----------------------+
| Tables_in_bjpowernode |
±----------------------+
| dept |
| emp |
| salgrade |
mysql> desc dept;
±-------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±-------±------------±-----±----±--------±------+
| DEPTNO | int | NO | PRI | NULL | |
| DNAME | varchar(14) | YES | | NULL | |
| LOC | varchar(13) | YES | | NULL | |
±-------±------------±-----±----±--------±------+
mysql> desc emp;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| EMPNO | int | NO | PRI | NULL | |
| ENAME | varchar(10) | YES | | NULL | |
| JOB | varchar(9) | YES | | NULL | |
| MGR | int | YES | | NULL | |
| HIREDATE | date | YES | | NULL | |
| SAL | double(7,2) | YES | | NULL | |
| COMM | double(7,2) | YES | | NULL | |
| DEPTNO | int | YES | | NULL | |
±---------±------------±-----±----±--------±------+
8、查看表格数据
select * from dept
select * from “表名”;
查看某个表的信息。
9、常用命令
查看当前正在使用的数据库select database();
查看当前数据库版本select version();
\c 结束一条语句,exit退出MySQL;
10、查看创建表的语句
show create table tablename;
11、简单的查询语句(DQL)
语法格式:
select 字段名1,字段名2,字段名3......from 表名;
--查询多个字段用,隔开
提示:
1、任何一条sql语句以;结尾。
2、sql语句不区分任何大小写。
查询员工的年薪?
select ename,sal*12 from emp;
--ename为员工名字
--sal为月薪,乘以12即可得到年薪
对查询结果的列重命名?
select ename,sal * 12 as yesrsal from emp;
别名中有中文怎么办?
select ename,sal * 12 as '年薪' from emp;
--此处说明查询中,字段可以做数学运算
注意:标准sql语句中要求字符串用单括号括起来。MySQL支持双引号,Oracle会报错。
查询所有字段?
select * from emp;
--实际开发中不建议使用*,效率比较低。
12、条件查询
--语法格式:
select
字段,字段...
from
表名
where
条件;
--执行顺序:先from,然后where,最后select
查询工资等于5000的员工?
select ename,sal from emp where sal = 5000;
查询SMITH的工资?
select sal from emp where ename = 'SMITH';
找出工资大于3千的员工?
select ename,sal from emp where sal>=3000;
找出工资在1100到3000的员工,包括等于?
select ename,sal from emp where sal >= 1100 and sal <= 3000;
也可以使用between and完成查找
select ename,sal from emp where sal between 1100 and 3000;
--注意:between...and在使用时,and的左边一定要小于and右边的数,不然查询不到任何数据。(左小右大),between and是一个闭区间。
between and除了可以使用在数字方面,还可以使用在字符串方面。
select ename from emp where ename between 'A' and 'C';
--运用在字符方面表示左闭右开,左边的边界会被查询,右边不会。
找出哪些人津贴为null或者不为null?
select comm from emp where comm is null;
select comm from emp where comm is not null;
--在数据库中,不是一个值,什么也没有,代表什么也没有,不能说是空值。
--空不是一个值,不能用等号衡量。
--必须使用is null或者 is not null
找出哪些人没有津贴
select comm from emp where comm is null and comm = 0;
找出工作岗位是MANAGER和SALESMAN
select ename,job from emp where job = 'MANAGER' OR job = 'SALESMAN';
and和or联合起来用:找出薪资大于1000的并且部门编号是20或30的部门员工。
select ename,emptno,sal from emp where sal > 1000 and (emptno = 20 or emptno = 30);
--当and和or在同一个语句的时候,and的优先级高于or的优先级。当不确定运算符的优先级的时候,可以添加小括号,小括号里面的运算符优先级较高。
in等同于or:找出工作岗位是MANAGER和SALESMAN
select ename,job from emp where job='MANAGER' or job = 'SALESMAN';
select ename,job from emp where job in ('MANAGER' and 'SALESMAN');
not in:表示不在这个范围中的数据。
模糊查询:like
找出名字当中含有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';
13、排序(升序、排序)
select ename,sal from emp order by sal;
--默认升序。
怎么指定升序或者降序?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;--工资的降序排列
select ename,sal from emp order by sal desc,ename asc;
注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会根据后面的字段来。
找出工作岗位是salsman的员工,并且要求按照薪资的降序来排列。
select ename,sal from emp where job = 'salsman' order by sal desc;
select
字段 --3
from
表名 --1
where
条件 --2
order by
... --4
--order by是最后执行的。
14、分组函数
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(ename) from emp;
分组函数一共有五个。
分组函数还有另外一个名字:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。
分组函数自动忽略NULL,不需要使用ifnull()函数进行判断。
select ename,sal from emp where sal > avg(sal);
--⭐此处报错:因为SQL语句当中有一个语法规则,分组函数不可直接使用在where的子句当中。
--原因:因为grop by在where后面执行。
解决:select sal from emp where sal > (select avg(sal) from emp);
count() 和count(具体的某个字段) 有什么区别?
count():不是统计某个字段中数据的个数,而是统计总记录条数。
count(字段):标志统计某个字段中不为NULL的数据总数量。
分组函数也可以组合来用。
select count(*),sum(sal),max(sal) from emp;
15、单行处理函数
什么是单行处理函数?
输入一行,输出一行。
--计算每个员工的年薪?
select ename,(sal + comm)*12 as yearsal from emp;(出现NULL)
select ename,(sal + ifnull(comm,0))*12 as yearsal from emp;(正确处理)
--在所有的数据库中,当对NULL值进行计算后,得到的一定是个NULL值。
ifnull() --空处理函数?
ifnull(可能为NULL的是数据,被当作什么处理)
--ifnull属于单行处理函数。
select ename,ifnull(comm,0) as comm from emp;
16、group by 和 having
group by : 按照某个字段或者某些字段进行分组。
having:having是对分组之后的数据进行再次过滤。
案例:找出每个工作岗位的最高薪资。
select job,max(sal) from emp group by job;
--注意:分组函数一般都会和grop by联合使用,这也是为什么它被称为分组函数的原因。并且任何一个分组函数(count,max,min,avg)都是在group by语句执行结束之后才会执行的。当一条语句没有group by的话,整张表的数据会自成一组。
--⭐当一条语句中有group by时,前面的字段只能跟参加分组的字段以及分组函数,不能有其他字段。
每个岗位的平均薪资?
select job,avg(sal) from emp group by job;
多个字段能不能联合起来一起分组?
案例:找出每个部分不同工作岗位的最高薪资。
select deptno,job,max(sal) from emp grop by deptno,job;
找出每个部门的最高薪资,要求显示薪资大于2500的数据。
--第一步找出每个部门的最高薪资
select deptno,max(sal) from emp group by deptno;
--第二部:找出薪资大于2900
select deptno,max(sal) from emp group by deptno having(max(sal));
--效率高,尽量使用where
select deptno,max(sal) from emp where sal > 2500 group by deptno;
找出每个部门的平均薪资,要求显示薪资大于2000的数据。
--第一步:找出每个部门的平均薪资
select deptno,avg(sal) from emp group by deptno;
--第二步:找出薪资大于2000的数据
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;
17、总结一个完整的DQL语句怎么写?
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
18、回顾
表在数据库中是最基本的数据单元,行称为记录,列称为字段。
DQ
souce 导入sql脚本。
select version() 查看当前的数据库版本。