说明:我们会从基础篇、进阶篇和运维篇三个部分去学习,这其实也是我的一次学习,可以说是我的学习笔记。
名称 | 全称 | 简称 |
---|---|---|
数据库 | 存储数据的仓库,数据是有组织的进行存储 | DataBase (DB) |
数据库管理系统 | 操纵和管理数据库的大型软件 | DataBase Management System (DBMS) |
SQL | 操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 | Structured Query Language (SQL) |
SQL是操作关系型数据库的编程语言,都是一套标准
启动
net start mysql
停止
net stop mysql
概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
1.使用表存储数据,格式统一,便于维护
2.使用$QL语言操作,标准统一,使用方便
1.SQL语句可以单行或多行书写,以分号结尾。
2.SQL语句可以使用空格/缩进来增强语句的可读性。
3.MYSQL数据库的SQL语句不区分大小写,关键字建议使用大写。
4.注释:
单行注释:–注释内容或或#注释内容(MySQL特有)
多行注释:/注释内容/
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
比较简单,自己敲一遍就好了
查询表
查询当前数据库所有表 | SHOW TABLES; |
---|---|
查询表结构 | DESC表名; |
查询指定表的建表语句 | SHOW CREATE TABLE表名; |
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`no` varchar(10) DEFAULT NULL COMMENT '学号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COMMENT='学生表'
添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度)[COMMENT注释] [约束];
ALTER TABLE student add nickname VARCHAR(20) COMMENT'昵称';
修改字段
alter table student modify nickname VARCHAR(50) ;
ALTER TABLE student change nickname nike VARCHAR(900);
注意:
·插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
·字符串和日期型数据应该包含在引号中。
·插入的数据大小,应该在字段的规定范围内。
注意:修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。
·DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
·DELETE语句不能删除某一个字段的值(可以使用URDATE)。
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
判断条件不同:where不能对聚合函数进行判断,而having可以。
注意
·执行顺序:where>聚合函数>having.
·分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
注意
起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是limit
如果查询的是第一页数据,起始索引可以省略,直接简写为limit10。
注意:
多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用*进行通配,代表所有。
例如:由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001
update emp set workno= lpad(workno , 5 , ‘0’);
– 向下取整
SELECT floor(2.6);
– 返回x/y的模
SELECT mod(6,4);
– 返回0-1内的随机数
select rand();
– 求参数x的四舍五入的值,保留y位小数
SELECT round(5.267,2);
通过数据库的函数,生成一个六位数的随机验证码。
select lpad(round(rand()*1000000,0),6,‘0’);
select name datediff(curdate(),entrydate) as ‘entrydays’ from emp
order by entrydays desc;
– if
SELECT if(TRUE,‘ok’,‘error’);
– IFNULL(expr1,expr2)
SELECT IFNULL(‘ok’,‘DEFAULT’);
SELECT IFNULL(‘’,‘DEFAULT’)
SELECT IFNULL(null,‘DEFAULT’)
– case when then else end
– 需求 查询emp表员工姓名和工作地址(北京、上海==一线城市,其他是二线城市)
SELECT
name,
(CASE workadress
WHEN ‘北京’ THEN
‘一线城市’
WHEN ‘上海’ THEN
‘一线城市’
ELSE
‘二线城市’ END) as ‘工作地址’
from emp;
1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
2.目的:保证数据库中数据的正确、有效性和完整性。
3.分类:
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
一对多(多对一)
多对多
一对一
概述:指从多张表中查询数据
笛卡尔积:笛卡尔乘积是指在数学中,两个集合A集合和B集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
多表查询分类
连接查询
内连接:相当于查询A、B交集部分数据
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
子查询
select 字段列表 from 表1,表2 where 条件;
显示内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件;
查询每一个员工的姓名及关联的部门的名称
select emp.name, dept.name from emp, dept where emp.dept_id=dept.id;
select emp.name, dept.name from emp inner join dept on emp.dept_id = dept.id;
– 外连接
– 1.查询emp表的所有的数据,和对应的部门信息(左外连接)
SELECT e.* , d.name from emp e left outer JOIN dept d on e.dept_id = d.id
– 2.查询dept表的所有的数据,和对应的员工信息(右外连接)
SELECT d.*, e.* from emp e right JOIN dept d on e.dept_id = d.id
SELECT * from emp e right JOIN dept d on e.dept_id = d.id
自然连接语法
select 字段列表 from 表a 别名a join 表a 别名b on 条件;
– 自连接
– 1.查询员工及其领导所属的名字
SELECT a.name , b.name from emp a ,emp b WHERE a.managerid = b.id;
– 2.查询所有员工emp及其领导的名字emp,如果员工没有领导也需要查询出来
SELECT a.name ,b.name from emp a left JOIN emp b on a.managerid = b.id
– 1.将薪资低于5000的员工,和年龄大于50岁的员工全部查询出来。
SELECT * from emp WHERE salary < 5000
UNION
SELECT * from emp where age > 50
SELECT * from emp WHERE salary < 5000
UNION ALL
SELECT * from emp where age > 50
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all会将全部的数据直接合并在一起,union会对合并之后的数据去重。
概念:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
SELECT FROM t1 WHERE column1 =(SELECT column1 FROM t2);
子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。
根据子查询结果不同,分为:
标量子查询(子查询结果为单个值)
列子查询(子查询结果为一列)
行子查询(子查询结果为一行)
表子查询(子查询结架为多行多列)
根据子查询位置,分为:WHERE之后、FROM之后、SELECT之后。
标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。
常用的操作符:= <> > >= <=
– 标量子查询
– 1.查询“销售部”的所有员工信息
a.查询销售部的部门ID
SELECT id from dept where name = ‘销售部’;
b.查询ID=4的所有员工信息
SELECT * from emp where dept_id = 4;
SELECT * from emp where dept_id = (SELECT id from dept where name =
‘销售部’);
列子查询
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:IN、NOT IN、ANY、SOME、ALL
– 列子查询
– 1。查询“销售部” 和 “市场部” 的所有员工信息
– a.查询销售部和市场部的ID
SELECT id from dept where name=‘销售部’ or name = ‘市场部’;
– b.查询ID=2和4 的所有员工的信息
SELECT * from emp WHERE dept_id in (2,4);
SELECT * from emp WHERE dept_id in (SELECT id from dept where
name=‘销售部’ or name = ‘市场部’);
查询比财务部所有人工资都高的员工信息
SELECT * from emp where salary > all(SELECT salary FROM emp where dept_id =(SELECT id FROM dept where name=‘财务部’));
行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:=、<>、IN、NOTIN
– 行子查询
– 1.查询“张三丰”的薪资及直属领导相同的员工信息
– a.查询张无忌的薪资和直属领导
SELECT salary,managerid from emp where name =‘张三丰’;
b.查询薪资和直属领导分别是14000和1的相同员工信息
SELECT * from emp where (salary,managerid) = (14000,1)
SELECT * from emp where (salary,managerid) = (SELECT salary,managerid from emp where name =‘张三丰’)
表子查询
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:IN
– 表子查询
– a.查询鹿杖客和宋远桥的职位和薪资相同的员工信息
SELECT * from emp where (job , salary) in (SELECT job , salary from emp where name =‘鹿杖客’ or name = ‘宋远桥’)
– 2.查询入职日期是"2006-01-01”之后的员工信息,及其部门信息
– a.入职日期是"2006-01-01”之后的员工信息
SELECT * from emp where entrydate > ‘2006-01-01’
– b.查询这部分员工,对应的部门信息;
SELECT e.,d. from (SELECT * from emp where entrydate > ‘2006-01-01’) e left JOIN dept d on e.dept_id = d.id
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
·原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
·一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
·隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
·持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
问题 | 描述 |
---|---|
脏读 | 一个事务读到另外一个事务还没有提交的数据。 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”。 |