五十五、MySQL全套核心大总结

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 五十五、MySQL全套核心大总结

数据库概念


什么是数据库?什么是数据库管理系统?什么是SQL?他们之间的关系是什么?


       数据库:英文单词DataBase,简称DB。按照一定格式存储数据的一些文件的组合。 顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。


       数据库管理系统:DataBaseManagement,简称DBMS。数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。


       常见的数据库管理系统:MySQL、Oracle、MS SqlServer、DB2、sybase等....


       SQL:结构化查询语言,学习者需要学习SQL语句,通过编写SQL语句,然后DBMS负责执行SQL 语句,最终来完成数据库中数据的增删改查操作。


       三者之间的关系:DBMS--执行--> SQL --操作--> DB        先安装数据库管理系统MySQL,然后学习SQL语句怎么写,编写SQL语句之后,DBMS对SQL语句进行执行,最终来完成数据库的数据管理。


安装MySQL数据库


       安装一般选择经典版进行安装,需要进行一些MySQL数据库实例配置,一般采用默认配置就可以,默认下一步安装完成


       注意事项:


端口号port是任何一个软件/应用都会有的,端口号是应用的唯一代表。在同一台计算机上,端口号不能重复,具有唯一性。


设置mysql数据库的字符编码方式为 UTF8

服务名称默认为MySQL

环境变量path=其它路径;C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin

mysql超级管理员用户名不能改,一定是:root


卸载MySQL数据库


       1、双击安装包进行卸载,用程序自带的卸载包卸载,残留文件会少很多


       2、删除目录:

               把C:\ProgramData下面的MySQL目录干掉。

               把C:\Program Files (x86)下面的MySQL目录干掉。


       3、卸载结束


关于MySQL服务


计算机-->右键-->管理-->服务和应用程序-->服务-->找mysql服务


MySQL的服务,默认是“启动”的状态,只有启动了mysql才能用。默认情况下是“自动”启动,自动启动表示下一次重启操作系统的时候自动启动该服务。

服务上点击右键:启动-->重启服务-->停止服务

改变服务的默认配置:服务上点击右键,属性,然后可以选择启动方式

在windows操作系统当中,如何使用命令来启动和关闭mysql服务


       net start 服务名称;

       net stop 服务名称;


其它服务的启停都可以采用以上的命令。


MySQL基础操作


使用客户端登录mysql数据库?


       使用bin目录下的mysql.exe命令来连接mysql数据库服务器


0a6092a1e5574834a774583c957c2cde.png


退出mysql客户端?


命令行输入exit退出客户端


7dcf19d22326493dab6da5e4412095ee.png


查看mysql中有哪些数据库?


show databases;


102562cae4c94c968bb74090468ab5b4.png


注意:以分号结尾,分号是英文的分号。


如何使用某个数据库?


use test;


f6d83c8e2a02437c88adac33e8d8fe80.png


如何查看某个数据库下有哪些表?


show tables;


ca921551a506444881d86ede74d01c7e.png


如何查看mysql数据库的版本号?


select version();


04fe1f3d46b447b6b3f889f524a56c6f.png


查看当前使用的是哪个数据库?


select database();


f511fcf64cdf4239bbaacae18de61496.png


       注:在MySQL中,\c用来终止一条命令的输入,不见分号(英文)不执行,分号(英文)表示语句的结束!


MySQL常识


数据库当中最基本的单元是表:table


什么是表table?为什么用表来存储数据呢?


姓名    性别    年龄(列:字段)

---------------------------------------------------------

张三    男        20                    ------->行(记录)

李四    女        21                    ------->行(记录)

王五    男        22                    ------->行(记录)


数据库当中是以表格的形式表示数据的,表具有简洁直观的效果。


任何一张表都有行和列:


行(row):被称为数据/记录。

列(column):被称为字段。

每一个字段都有:字段名、数据类型、约束等属性。


数据类型:字符串,数字,日期等。


约束:


非空约束:not null

唯一性约束: unique

主键约束: primary key (简称PK)

外键约束:foreign key(简称FK)

检查约束:check(mysql不支持,oracle支持)

主键:


       主键约束:一种约束。

       主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段。

       主键值:主键字段中的每一个值都叫做:主键值。


       主键的作用:主键值是每一行记录的唯一标识。任何一张表都应该有主键,没有主键,表可以称为无效!!


       主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)


外键:


       外键约束:一种约束(foreign key)。

       外键字段:该字段上添加了外键约束。

       外键值:外键字段当中的每一个值。


       外键的作用:防止数据冗余,空间浪费,使其字段更具科学性,唯一性


       外键的特征:子表中的外键引用的父表中的某个字段,被引用的这个字段不一定是主键,但至少具有unique约束,外键值可以为NULL。


       注:非空约束not null约束的字段不能为NULL,not null只有列级约束,没有表级约束!


唯一性约束unique约束的字段不能重复,但是可以为NULL。


MySQL语句分类:


DQL:数据查询语言(带有select关键字的都是查询语句) select...

DML:  数据操作语言(对表当中的数据进行增删改的都是DML)insert-->增   delete-->删  update-->改  主要进行的是对表中数据的操作

TCL:   事务控制语言 事务提交:commit ;  事务回滚:rollback;

DDL:   数据定义语言(带有create、drop、alter的都是DDL)create-->创建   drop-->删除   alter-->修改  主要进行的是对表结构的操作

DCL:   数据控制语言  授权grant、撤销权限revoke....


数据库DQL操作


         注:查询不会对数据库中的数据进行修改,只是一种显示数据的方式而已。


简单查询


查询数据表


SELECT 列名 FROM 表名 [WHERE 条件表达式]


#使用*表示所有列,字段
SELECT * FROM  表名;
#查询所有的学生信息:
select * from student;
#查询指定字段的数据,多个字段之间以逗号分隔
SELECT  字段名 1,  字段名 2,  字段名 3, ... FROM  表名;
#查询 student 表中的 name 和 age 字段
select name,age from student;


使用别名


SELECT  字段名1 AS  别名,  字段名2 AS  别名 FROM  表名;


对字段和表使用别名


SELECT  字段名1 AS  别名,  字段名2 AS  别名 FROM  表名 AS  表别名;


#使用别名
select name as 姓名,age as 年龄 from student;
#表使用别名
select st.name as 姓名,age as 年龄 from student as st


       注:表使用别名主要是用于多表联合查询,方便快捷,as关键字可以省略


数据去重


SELECT DISTINCT  字段名 FROM  表名;


#查询学生来自于哪些地方
select address from student;
#去掉重复的记录
select distinct address from student;


条件查询


条件查询:不需要将表中所有数据都查出来,只查询出来符合条件的,对记录进行过滤。


SELECT  字段名 FROM  表名 WHERE  条件;


数据表准备


CREATE DATABASE bjpowernode;
use bjpowernode;
CREATE TABLE DEPT(
    DEPTNO int(2) not null ,
  DNAME VARCHAR(14) ,
  LOC VARCHAR(13),
  primary key (DEPTNO));
CREATE TABLE EMP(
    EMPNO int(4)  not null ,
  ENAME VARCHAR(10),
  JOB VARCHAR(9),
  MGR INT(4),
  HIREDATE DATE  DEFAULT NULL,
  SAL DOUBLE(7,2),
  COMM DOUBLE(7,2),
  primary key (EMPNO),
  DEPTNO INT(2));
CREATE TABLE SALGRADE(
    GRADE INT,
  LOSAL INT,
  HISAL INT );
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
10, 'ACCOUNTING', 'NEW YORK'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
20, 'RESEARCH', 'DALLAS'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
30, 'SALES', 'CHICAGO'); 
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES ( 
40, 'OPERATIONS', 'BOSTON'); 
commit;
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7369, 'SMITH', 'CLERK', 7902,  '1980-12-17'
, 800, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7499, 'ALLEN', 'SALESMAN', 7698,  '1981-02-20'
, 1600, 300, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7521, 'WARD', 'SALESMAN', 7698,  '1981-02-22'
, 1250, 500, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7566, 'JONES', 'MANAGER', 7839,  '1981-04-02'
, 2975, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7654, 'MARTIN', 'SALESMAN', 7698,  '1981-09-28'
, 1250, 1400, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7698, 'BLAKE', 'MANAGER', 7839,  '1981-05-01'
, 2850, NULL, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7782, 'CLARK', 'MANAGER', 7839,  '1981-06-09'
, 2450, NULL, 10); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7788, 'SCOTT', 'ANALYST', 7566,  '1987-04-19'
, 3000, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7839, 'KING', 'PRESIDENT', NULL,  '1981-11-17'
, 5000, NULL, 10); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7844, 'TURNER', 'SALESMAN', 7698,  '1981-09-08'
, 1500, 0, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7876, 'ADAMS', 'CLERK', 7788,  '1987-05-23'
, 1100, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7900, 'JAMES', 'CLERK', 7698,  '1981-12-03'
, 950, NULL, 30); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7902, 'FORD', 'ANALYST', 7566,  '1981-12-03'
, 3000, NULL, 20); 
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES ( 
7934, 'MILLER', 'CLERK', 7782,  '1982-01-23'
, 1300, NULL, 10); 
commit;
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
1, 700, 1200); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
2, 1201, 1400); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
3, 1401, 2000); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
4, 2001, 3000); 
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES ( 
5, 3001, 9999); 
commit;

4fe82af5c9f8445c924882840a09afdf.png

73f672255f0148c9bb852e138b26d389.png

900b0da053c1478fba176393ba4c6bfa.png

7fffdabc20954d9a8339bb7442bd2ac2.png



        注:查看数据表内容


fbc3028549634020ba0f31351b644376.png

f1878cc9008f484393f426ae1c6cd47b.png

0a5113e7ef044a9394c5ea66123addb5.png

        注:查看数据表结构


1、计算员工年薪?


select ename,sal*12 from emp;


b7db1734176c4d73b027a408b9e52e7c.png


2、查询薪资等于800的员工姓名和编号?


select empno,ename from emp where sal = 800;


320febbaf4a143edaee786986003bcf7.png


3、查询SMITH的编号和薪资?


select empno,sal from emp where ename = 'SMITH';


ac0ce59342174cf0abf48b289bfe443f.png


4、查询薪资不等于800的员工姓名和编号?


select empno,ename from emp where sal <> 800;


49062e58710043308cbc131b6a8bfc48.png


5、查询薪资小于2000的员工姓名和编号?


select empno,ename,sal from emp where sal < 2000;


2326867cc08944b5944619093befa838.png


6、 查询薪资在2450和3000之间的员工信息?


select empno,ename,sal from emp where sal between 2450 and 3000;


217792e12e91406ba5288e216d4623dc.png


        注:between … and …. 两个值之间, 等同于 >= and <=   并且between and是闭区间,包括两端的值,必须遵循左小右大。


7、查询哪些员工的津贴/补助为null?


select empno,ename,sal,comm from emp where comm is null;


b49a0fb821b549aab76d63f57d325c1d.png


       注: is null 为 空(is not null 不为空),在数据库中null不能使用等号进行衡量,需要使用 is null 因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量。


8、查询哪些员工的津贴/补助不为null?


select empno,ename,sal,comm from emp where comm is not null;


61a22db8f30a4a489dcd5d3a29cec19d.png


9、查询工作岗位是MANAGER并且工资大于2500的员工信息?


select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;


62d10c8702934df38f3ed636f84b41b5.png


10、查询工作岗位是MANAGER和SALESMAN的员工?


select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';


ffdb2de520914ff3a159b33c7e73948f.png


11、查询工作岗位是MANAGER和SALESMAN的员工?


select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');


da838f3f6c8c4d9991280eec7b4c36d4.png


        注:in不是一个区间, in后面跟的是具体的值,相当于选择。


like关键字


       注:称为模糊查询,支持%或下划线匹配    %匹配任意多个字符    下划线:任意一个字符。(%是一个特殊的符号,_ 也是一个特殊符号)


1、找出名字中含有O的?


select ename from emp where ename like '%O%';


401a493bd87649928f55379558fa92f7.png


2、找出名字以T结尾的?


select ename from emp where ename like '%T';


ea27ac6392c34663acda7236a97e3aaa.png


3、找出第二个字每是A的?


select ename from emp where ename like '_A%';


24e5d82a8cf4442ab30bcf5a8789415b.png


排序


1、查询所有员工薪资,排序?(默认为升序)


select ename,sal from emp order by sal;


6f7708cfffc946ca8e253be778e5deb6.png


2、 查询所有员工薪资,排序?(降序)


select  ename,sal from emp order by sal desc;


f07e6084c6a942359f9501665e01d294.png


3、查询员工名字和薪资,要求按照薪资升序,如果薪资一样,再按照名字升序排列?


select  ename,sal from emp order by  sal asc, ename asc;


6a4eeb139f9f4d55b34989933694b021.png


4、 查询工资在1250到3000之间的员工信息,要求按照薪资降序排列?


select  ename,sal from  emp where sal between 1250 and 3000 order by  sal desc;


61741be490324880a4a52da600974f09.png


        注:执行顺序 from--> where--> select--> order by(排序最后执行)


分组函数


多行处理函数的特点:输入多行,最终输出一行。


count    计数

sum    求和

avg    平均值

max    最大值

min    最小值

       注:分组函数在使用的时候必须先进行分组,然后才能使用,如果没有对数据进行分组,整张表默认为一组。


1、找出最高工资?


select max(sal) from emp;


d9c14ca707af4f939f269e6ff9f252d0.png


2、找出最低工资?


select min(sal) from emp;


b57f76cc61b94b8c91eb76323e9ac37c.png


3、计算工资和?


select sum(sal) from emp;


bc97d9d0398a4b1da0fbfa87daf0cda9.png


4、计算平均工资?


select avg(sal) from emp;


ba32c4fdea9b44e5af575bd11885dd3a.png


5、 计算员工数量?


select count(ename) from emp;


567625692b1f4d0687ef6d29a52d1297.png


分组函数自动忽略NULL,你不需要提前对NULL进行处理。

count(具体字段):表示统计该字段下所有不为NULL的元素的总数。

count(*):统计表当中的总行数。

分组函数不能够直接使用在where子句中。

所有的分组函数可以组合起来一起用。


分组查询


       注:先进行分组,然后对每一组的数据进行操作。


select  ... from ... group by ...


1、查询每个工作岗位的工资和?


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


f9d93b69c7ae492d993d8ce4436bfd05.png


2、查询每个部门的最高薪资?


实现思路:按照部门编号分组,求每一组的最大值。


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


84d28f3257bb4fb3ad25510f48ac27f5.png


3、查询“每个部门,不同工作岗位”的最高薪资?


实现思路:两个字段联合成一个字段来看(两个字段联合分组)


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


91b538ea6ff44581a9b16f186ee43e29.png


having关键字


       注:使用having可以对分完组之后的数据进一步过滤,having不能单独使用,having不能代替where,having必须和group by联合使用。


1、查询每个部门最高薪资,要求显示最高薪资大于3000的?


第一步:找出每个部门最高薪资按照部门编号分组,求每一组最大值。


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


第二步:显示最高薪资大于3000的部门编号。


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


1e15013a628d4ae5aff947edcffbb18b.png


2、查询每个部门平均薪资,要求显示平均薪资高于2500的部门?


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


2e0732785a3f4e599f84c9f4fde029bf.png


注:此条案例单靠where是完成不了的,所以这时候引入了having关键字来进行进一步筛选。


思路优化:where和having,优先选择where,where完成不了需求,再选择 having。


连接查询


连接查询:从一张表中单独查询,称为单表查询。emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字, 这种跨表查询,多张表联合起来查询数据,被称为连接查询。


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

外连接:左连接,右连接

全连接:  了解


引入


当两张表进行连接查询时,没有任何条件的限制会发生什么现象?


1、查询每个员工所在部门名称?


select ename,deptno from emp;


15f02417b911434a86a9ac16e9df4b3a.png


select * from dept;


9792a65a91db49e5983ab8ecc3637295.png


两张表连接没有任何条件限制:


select ename,dname from emp, dept;


cdb0c4053a0e4acbb3cf96156f9ac80c.png


笛卡尔积现象:当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积 。


如何避免笛卡尔积现象?


连接时添加条件,满足这个条件的记录被筛选出来!


select  emp.ename,dept.dname  from emp, dept where emp.deptno = dept.deptno;


0551ce8bf9684d1eaa30c3f8f263947a.png


        注:最终查询的结果条数是14条,但是匹配的过程中,匹配的次数并没有减少还是56次,只不过进行了四选一,次数没有减少。


       总结:通过笛卡尔积现象得出,表的连接次数越多效率越低,所以尽量避免表的连接次数过多。


内连接和外连接


1、查询每个员工所在部门名称,显示员工名和部门名?(等值连接)


select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;


a719113199b84fefa9ecd6e25a568dcc.png


2、查询每个员工的薪资等级,要求显示员工名、薪资、薪资等级?(非等值连接)


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


5cd86d8a72a5472db26e605544e63275.png


       注:on后面 e.deptno = d.deptno 条件是等量关系,所以被称为等值连接。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;


1b7fe0b958074aa28ff89f07eeba6d3d.png


4、 (内连接)


select   e.ename,d.dname from  emp e join  dept d on e.deptno = d.deptno;


d42b6e85da0d4d2990a29a2b78458bed.png


5、(右外连接)


select   e.ename,d.dname from  emp e right join  dept d on e.deptno = d.deptno;


26d70f2a309f41b4be4b7741364da976.png


6、(左外连接)


 select   e.ename,d.dname from  emp e left join  dept d on e.deptno = d.deptno;


23906666cf01473b81edc082c27152fa.png


        注:带有right的是右外连接,又叫做右连接。带有left的是左外连接,又叫做左连接。right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表,left同理。在外连接当中,两张表连接,产生了主次关系。所以:外连接的查询结果条数一定是 >= 内连接的查询结果条数!!!


子查询


子查询:select语句中嵌套select语句,被嵌套的select语句称为子查询。


子查询可以在哪里出现:


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


1、找出比最低工资高的员工姓名和工资?


第一步:查询最低工资是多少


select min(sal) from emp;


第二步:找出>800的


select ename,sal from emp where sal > 800;


第三步:合并


select ename,sal from emp where sal > (select min(sal) from emp);


b5f9de5ebe814be0b68b8ae98c2273eb.png


from子句中的子查询:from后面的子查询,可以将子查询的查询结果当做一张临时表。


2、找出每个岗位的平均工资的薪资等级?(格式化后看的会明显一些,写一行是为了节约空间(哭哭哭......))


select 
    t.*, s.grade
  from
    (select job,avg(sal) as avgsal from emp group by job) t
  join
    salgrade s
  on
    t.avgsal between s.losal and s.hisal;

a0746321ea604e7d8c6cc3e09526ec24.png


       注:这样去理解 :t表和s表进行表连接,条件为 t表avg(sal) between s.losal and s.hisal;


limit关键字


limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。


eg:   百度一页的记录条数默认为10,分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差,这样可以一页一页翻页看。


完整用法:limit startIndex, length        startIndex是起始下标,length是长度。起始下标从0开始。

缺省用法:limit 5; 这是取前5。

1、取出工资排名在[3-5]名的员工?


select  ename,sal from emp order by  sal desc limit 2, 3;


50877bf696d44003b92808a94bce96c8.png


2、按照薪资降序,取出排名在前5名的员工?


select  ename,sal from  emp order by  sal desc limit 5;  


7891a82a53304cf99e4de38eb5b6add9.png


数据库DML操作


DML操作语句主要进行的是对数据的增删改操作。


insert插入


插入记录


INSERT [INTO] 表名 [字段名] VALUES (字段值)


样例


#将表中的所有字段写出
INSERT INTO 表名 (字段名 1, 字段名 2, 字段名 3…) VALUES (值 1, 值 2, 值 3);
#只写插入数据
INSERT INTO 表名 VALUES (值 1, 值 2, 值 3…);
#插入部分数据
INSERT INTO 表名 (字段名 1, 字段名 2, ...) VALUES (值 1, 值 2, ...);


       注:字段名和值要一一对应,数量要对应。数据类型也要对应。insert语句一旦执行成功,那么必然会多一条记录。如果没有给其它字段指定值的话,默认值是NULL。


update修改


修改数据


update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3... where 条件;


       注:如果没有条件限制会导致所有数据全部更新。


样例


#不带条件修改数据(修改所有)
UPDATE 表名 SET 字段名=值;
#带条件修改数据
UPDATE 表名 SET 字段名=值 WHERE 字段名=值;


delete删除


删除数据


delete from 表名 where 条件;


       注:没有条件,整张表的数据会全部删除!


样例


#不带条件删除数据
DELETE FROM 表名;
#带条件删除数据
DELETE FROM  表名 WHERE  字段名= 值;
#使用 truncate 删除表中所有记录
TRUNCATE TABLE  表名;


数据库TCL操作


事务


事务(transaction):一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分。


eg: 假设转账,从A账户向B账户中转账10000.


第一步:将A账户的钱减去10000(update语句)


第二步:将B账户的钱加上10000(update语句)


这就是一个完整的业务逻辑,以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的。


      注:事务是基于DML语句的,只有以上的DML语句是数据库表中数据进行增、删、改的。因为在实际生活中很多事是不能依靠一条DML语句就能完成的,需要多条DML语句共同联合起来才能完成,这便是事务存在的意义。


       简单理解:由多条DML语句组成,构成的一个完整事务逻辑。


提交事务:清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中,提交事务标志着,事务的结束,并且是一种全部成功的结束

回滚事务:将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件,回滚事务标志着,事务的结束。并且是一种全部失败的结束。

1、回滚事务


a9c97c43a7914125b82c149f6895ee16.png


2、提交事务


3f522be79dcd4e1fb9c9dfe02e481efd.png


3、事务的特征


原子性 :说明事务是最小的工作单元,不可再分。

一致性:所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,以保证数据的一致性。

隔离性:A事务和B事务之间具有一定的隔离,不会对同一张表同时操作。

持久性:事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上!


4、事务和事务之间的隔离级别


脏读:所谓的脏读就是指一个事务读取了另外一个事务未提交的数据。

不可重复读:所谓的不可重复读是指事务中两次查询的结果不一致,原因是在查询的过程中其他事务做了更新的操作。

幻读:又被称为虚读,是指在一个事务内两次查询中数据条数不一致,幻读和不可重复读有些类似,同样是在两次查询过程中,不同的是,幻读是由于其他事务做了插入记录的操作,导致记录数增加。

可串行化:事务的最高隔离级别,效率最低,解决了所有的问题,这种隔离级别表示事务排队,不能并发! 每一次读取到的数据都是最真实的,并且效率是最低的。


数据库DDL操作


数据库操作


创建数据库


CREATE DATABASE 数据库名;


判断数据库是否已经存在,不存在则创建数据库


CREATE DATABASE IF NOT EXISTS 数据库名;


创建数据库并指定字符集


CREATE DATABASE 数据库名 CHARACTER SET 字符集;


样例


#创建数据库 test1
create database test1;
#判断是否存在,如果不存在则创建数据库 test2
create database if not exists test2;
#创建数据库并指定字符集为 gbk
create database db3 character set gbk;


删除数据库


DROP DATABASE 数据库名;


修改数据库


#修改数据库默认的字符集
ALTER DATABASE  数据库名 DEFAULT CHARACTER SET;
#将数据库test2的字符集改成 utf8
alter database test2 character set utf8;


数据表操作


创建数据表


CREATE TABLE 表名 (
字段名 1 字段类型 1,
字段名 2 字段类型 2
);

样例


#创建 student 表包含 id,name,birthday 字段
create table student (
id int,
name varchar(20),
birthday date
);


删除数据表


DROP TABLE 表名;


样例


#直接删除表 s1 表
drop table s1;
#判断表是否存在并删除 s1 表
drop table if exists `create`;


修改数据表


#添加数据表表列 ADD
ALTER TABLE  表名 ADD  列名  类型;
#修改列类型 MODIFY
ALTER TABLE 表名 MODIFY 列名 新的类型;
#修改列名 CHANGE
ALTER TABLE 表名 CHANGE 旧列名 新列名 类型;
#删除列 DROP
ALTER TABLE 表名 DROP 列名;
#修改表名
RENAME TABLE 表名 TO 新表名;
#修改字符集 character set
ALTER TABLE 表名 character set 字符集;


样例


#为学生表添加一个新的字段 remark,类型为 varchar(20)
alter table student add remark varchar(20);
#将 student 表中的 remark 字段的改成 varchar(100)
alter table student modify remark varchar(100);
#将 student 表中的 remark 字段名改成 intro,类型 varchar(30)
alter table student change remark intro varchar(30);
#删除 student 表中的字段 intro
alter table student change remark intro varchar(30);
#将学生表 student 改名成 student2
rename table student to student2;
#将 student2 表的编码修改成 gbk
alter table student2 character set gbk;


数据库DCL操作


用户


DBA:数据库管理员


DCL:管理用户,授权


管理用户


#添加用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
#删除用户
DROP USER '用户名'@'主机名';
#修改用户密码
UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名';
UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi';
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');


权限


权限管理


#查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
#授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
#授予tuomasi全部权限
GRANT ALL ON *.* TO 'tuomasi'@'localhost';
#撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON test.`test1` FROM 'lisi'@'%';


数据库三范式


数据库设计三范式


第一范式:要求任何一张表必须有主键,每一个字段原子性不可再分。

第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。

第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。


       注:设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 存储 Oracle
一文带你理解MySQL事务核心知识点
一文带你理解MySQL事务核心知识点
216 1
一文带你理解MySQL事务核心知识点
|
SQL 关系型数据库 MySQL
mysql中lock tables与unlock tables(锁表/解锁)使用总结
mysql中lock tables与unlock tables(锁表/解锁)使用总结
283 0
|
SQL 存储 Oracle
MySQL总结
一.SQL语句简介 1.什么是SQL? SQL(Structured Query Language):结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”
MySQL总结
|
SQL 存储 前端开发
MySQL知识点总结
MySQL知识点总结
135 0
MySQL知识点总结
|
关系型数据库 MySQL
Mysql常用语法总结
Mysql常用语法总结
87 0
|
SQL 关系型数据库 MySQL
|
关系型数据库 MySQL 数据库
【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
161 0
|
SQL 搜索推荐 关系型数据库
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
122 0
MySQL 入门教程:全网最全,MySQL 增删改查高级命令硬核总结
|
存储 关系型数据库 MySQL
MySQL复习资料——用于突击考试总结
MySQL复习资料——用于突击考试总结
138 0
|
存储 SQL 关系型数据库
MYSQL约束的总结和小练习
约束笔记: 1:主键约束默认是唯一且非空的 2:AUTO_INCREMENT在MYSQL8.0中会将自增主键保存到重做日志中,即使关闭后重启,存储引擎innoDB仍然会根据重做日志初始化计数器内存值。 3:设置了外键约束后,如果要删除主表的内容,则需要先把从表的相关内容给删除。 4:建表时一般设置not null default '' 或default 0,因为nul这个特殊值不好比较,而且查找效率低。 5:外键约束不能跨引擎使用,且mysql中其有一定成本,不适合大并发SQL操作,开发中一般在.
162 0
MYSQL约束的总结和小练习