增删改查的语法
-- INSERT 增
INSERT INTO 表名[(列名列表)]VALUES(值列表);
-- DELETE 删
DELETE FROM 表名 [WHERE 条件];
-- UPDATE 修改
UPDATE 表名 SET 列名=值[,列名=值...][WHERE 条件]
-- SELECT 查
-- 单表查询基础语法
SELECT 列名列表 -- SELECT查询
1.SELECT查询
2.SELECT后面是FROM
3.如果后面还有条件用where
4.如果需要分组就用group by
5.如果分组后面还有条件就用having
6.如果需要排序就用order by
7.如果需要指定位置的截取就用limit
SQL语句的分类
SQL语句根据其功能,主要分为四类:DDL、DML、DQL、DCL:
DDL 数据定义语言,用来定义数据库对象
CREATE,DROP,ALTER
DML 数据操作语言,用来对数据库表中的数据进行增删改的操作
INSERT,UPDATE,DELETE
DQL 数据查询语言,用来查询数据库中表的记录
SELECT,FROM,WHERE,GROUP BY,ORDER BY
DCL 数据控制语言,用来创建数据库用户、控制数据库的访问权限。
GRANT,REVOKE,COMMIT,ROLLBACK
CHAR(M) 和 VARCHAR(M) 的区别, 括号中的M是什么意思
Char是定长字符串,varchar是变长字符串
Char的执行比varchar快,因为char是牺牲空间来换时间的,而varchar是牺牲时间换空间
Char的括号里面的M是固定,它的取值是的0-255之间(的整数),超出的部分会被截断;
Varchar括号里面的M是可变的,它的取值是0-16383之间(的整数),超出的部分也会被截断,但是不足时会根据其实际长度来计算存储
FLOAT, DOUBLE, DECIMAL的区别
首先它们三个都是用来存储小数的,
FLOAT, DOUBLE都是浮点数,DECIMA是定点数
但是它们三个又有所区别
float是单精度浮点数,占4个字节
double是双精度浮点数,占8个字节
decimal是高精度定点数,占M+2(M是double括号里面的第一个参数)
所以从float到double再到decimal,小数是越来越精确了,也就是说可以精确整数小数点后面的位数越来越多了。
但是为什么不直接使用decimal呢?
因为float和double虽然会有精度的丢失但是他们不怎么占用存储空间,而decimal比较占用存储空间,所以我们应该根据实际情况来使用。
整数类型有几种,区别是什么
MySQL 主要提供的整数类型有五种,分别是:
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
区别:
TINYINT是很小的整数存储只需要1个字节;取值范围:-2的7次方 ~2的7次方-1
SMALLINT是小的整数存储需要2个字节;取值范围:-2的15次方~2的15次方-1
MEDIUMINT是中等大小的整数存储需要3个字节;...23......
INT是普通大小的整数存储需要4个字节;....31.........
BIGINT是大整数存储需要8个字节.......63........
无符号数和有符号数的区别是什么
无符号数只能是0或者正数,有符号可以是正数也可以是负数
内存占比有符号:0-255 ,无符号: -127~127
当一个数是无符号数时,它的最高位仅用来表示该数的大小。
说说你对数据库存储引擎的了解(INNODB和MyISAM的区别)
MySQL 5.5版之前,默认使用的存储引擎是MyIASM
MySQL 5.5版之后,默认使用的存储引擎是Innodb
区别1:INNODB支持事务,MyISAM不支持事务
区别2: INNODB支持行锁,表锁,MyISAM只支持表锁
区别3:INNODB支持哈希索引,MyISAM不支持哈希索引
区别4:INNODB不支持全文索引,MyISAM支持全文索引
区别5:INNODB将数据和索引集中存储在一个.idb文件中,
MyISAM将数据和索引分开存储,数据存储在MYD文件,索引存储在MYI文件中
索引的优缺点
优点;在数据量很大的时候,可以快速提升查询速度
缺点:索引需要额外消耗存储空间,会牺牲增删改的速度
索引的分类
主键索引:一张表只能有一个
唯一索引:一张表可以有多个
普通索引:没有唯一性限制,一张表可以有多个
全文索引:关系型数据库,不适合做全文索引,建议用搜索引擎技术
什么是联合索引,联合索引为什么会失效
联合索引:
两个或更多个列作为索引被称作联合索引,
联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分
联合索引失效的原因:
-- 1.违反了“最左前缀原则”
-- 2.在使用联合索引查询的时候,左边的列必须要出现
创建索引的语法
-- 主键索引不需要创建,主键索引就是表
-- 创建普通索引(不带唯一约束的二级索引)
ALTER TABLE 表名 ADD INDEX 索引名(列名);
-- 创建唯一索引(带唯一约束的二级索引)
ALTER TABLE 表名 ADD UNIQUE INDEX 索引名(列名);
-- 创建多列联合普通索引(不带唯一约束的二级索引)
ALTER TABLE 表名 ADD INDEX 索引名(列名1,列名2...);
-- 创建多列联合唯一索引(带唯一约束的二级索引)
ALTER TABLE 表名 ADD UNIQUE INDEX 索引名(列名1,列名2...);
格式:ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名] (索引字段名)[ASC|DESC]
什么是事务
事务是数据库一个不可分割的操作,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,这个操作要么都执行,要么都不执行。
事务的四大特性
1. 原子性(Atomicity)
事务是最小的执行单位,不允许分割。
事务的原子性确保动作要么全部完成,要么完全不起作用;
2. 一致性(Consistency)
执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
3. 隔离性(Isolation)
当多个用户并发访问数据库时,一个用户的事务不会被其他事务所干扰,事务和事务之间是独立的
4. 持久性(Durability)
事务一旦被提交后,对事务内的更改是持久的,永远不会被撤销,即使数据库发生故障也不应该对其有任何影响。
原子性、持久性、隔离性都是为了保证其一致性
如何开启事务, 提交, 回滚
SET autocommit=OFF; -- 开启事务,0也可以
BEGIN; -- 临时开启事务
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务
什么是事务保存点
粗略来讲相当于Java中的“断点”,设置一个断点,当你在数据库中插入一条数据后,在这条语句后面设置一个savepoint,当你需要rollback的时候,只需要回滚到这个savepoint点时就可以,这样就节省了大量的时间,提高的工作效率,也不需要消耗过多的数据库的资源。
四种隔离级别是什么,他们分别有什么问题,可以解决什么问题,谁能用谁不能用为什么
-- 隔离级别有4种
-- 1.READ UNCOMMITTED 读未提交 会发生脏读
-- 2.READ COMMITTED 读已提交 不会发生脏读,但是不能重复读
-- 3.REPEATABLE READ 可重复读(默认) 可重复读,也不会发生脏读,但是会幻读
-- 幻读:重复读的时候数据会变多
-- 4.SERIALIZABLE 可串行化 级别最高前面三种隔离级别发生的事情都不会发生
-- 四种隔离级别不会使用读未提交,因为会发生脏读,脏读的结果很严重
-- 读已提交和可重复读可以使用,可串行化不用,
-- 因为事务串行(一个一个的排队)执行会严重影响系统的性能,系统应该用并发执行
什么是锁,锁的分类(按类型分, 按粒度分)
-- 锁是数据库用于控制并发操作的一种机制
-- 按类型分
-- 1.共享锁 2.排他锁
-- 按粒度
-- 1.行锁2.页锁3.表锁
隔离级别和锁的关系
在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突;
在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁;
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
什么是死锁, 如何防止死锁
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象
-- 防止死锁
-- 1.如果多个事务并发操作数据,约定以相同的顺序访问表和行
-- 2.尽量一次性锁定本次事务需要操作的所有资源
-- 3.提升锁的粒度,使用表锁(影响性能,尽量不要使用)
什么是触发器,有几种触发器,触发器的使用场景
触发器是用户定义在关系表上的一类由事件驱动的特殊的存储过程。
触发器是指一段代码,当触发某个事件时,自动执行这些代码。
在MySQL数据库中有如下六种触发器:
- Before Insert
- After Insert
- Before Update
- After Update
- Before Delete
- After Delete
使用场景
- 可以通过数据库中的相关表,实现级联更改。
- 实时监控某张表某个字段的更改,而做出相应的处理。
什么是视图
为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。
所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,
只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高了数据库中数据的安全性。
SQL约束有几种,介绍一下
非空约束
NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
唯一约束(自动添加唯一索引)
UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
主键约束(自动添加聚簇索引)
PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
外键约束
FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
检测约束(MySQL数据库没有检查约束)
CHECK: 用于控制字段的值范围。
内连接和外连接的区别
区别
内连接(inner join):取出两张表中匹配到的数据,匹配不到的不保留
外连接(outer join):取出连接表中匹配到的数据,匹配不到的也会保留,其值为NULL
什么是集合查询,有几种,怎么实现
将两个结构相同的结果合并为一个结果的叫集合查询
有三种:并集,交集,差集
1.)并: UNION(去重)、UNION ALL(不去重)
2.)交: INTERSECT、MySQL不支持
3.)差: EXCEPT、MySQL不支持
分
左差集:用左外链接实现
右差集:用右外链接实现
全差集:左差和右差用union来链接
drop、delete与truncate的区别
-- DELETE删除表数据,不会影响表结构,可以加条件,不会重置自增长主键
-- TRUNCATE是快速截断表数据,不会影响表结构 ,比DELETE要快,不可以加条件,用于快速清空表
-- DROP是同时删除表数据和表结构
什么是三范式
设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系型数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般来说,数据库只需要满足第三范式就行了。
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
数据库有几种关系
三种:
一对一:一个面对一个;
一对多:一个面对多个;
多对多:多个面对多个、
排序,去重,分组,截取的关键字分别是什么
排序关键字:ORDER BY
去重关键字:DISTINCT
分组关键字:GROUP BY
截取关键字:LIMIT
统计函数知道吗,有几个
有五个,分别是:
MAX,MIN,AVG,SUM,COUNT
Count(*)count(1)count(主键)都可以用于统计
Count在统计行数的时候,不会对null行统计
Count(列名)统计的是某一列中不为null的行数
Count(主键列)得到的行数可以作为总行数,因为主键是非空的
Count(1)和count(*)得到的行数也可以代表总行数
Count(主键列)和count(1)比count(*)要快,count(*)很慢
但是mysql后面对count(*)做了优化,count(*)的性能得到了优化,
所以速度也都差不多
常用的数据库函数,字符串函数,日期函数一样说几个
数据库函数
SELECT CEIL(AVG(SAL)) FROM emp; -- 向上取整
SELECT FLOOR(AVG(SAL)) FROM emp; -- 向下取整
SELECT ROUND(AVG(SAL)) FROM emp; -- 保留的数还要看看后面的数,后面的数字采取四舍五入
SELECT ROUND(AVG(SAL),2) FROM emp;
SELECT TRUNCATE(AVG(SAL),0) FROM emp; -- 截断不管后面的小数
-- IF
-- IFNULL(expr1,expr2)
字符串函数
-- `LEFT`(str,len)左截取
-- `RIGHT`(str,len)右截取
-- TRIM([remstr FROM] str)
-- LTRIM(str)去除左边空格
-- RTRIM(str)去除右边空格
日期函数
SELECT WEEK(NOW()); -- 返回指定日期是一年的第几周
SELECT YEAR(NOW()); -- 当前是什么年
SELECT MONTH(NOW()); -- 当前是几月
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW()); -- 日期格式转换
对NULL做运算需要注意什么
-- 对null值运算需要注意
-- 任何数据对null做运算的结果都是null
转换:
If()
Ifnull()
比较:
-- 不能使用=和!=
-- 需要使用is和is not
数据库怎么备份和恢复
右键点击需要备份的表,点击转存储sql文件,然后挑一个位置存放;
如果需要恢复就右击表行运行sql文件,从之前存放的位置找出来执行即可。
--什么是游标?
-- 游标,cursor ,是数据库PL/SQL中的非常重要的数据类型
-- 过程语言中有3 种主要的数据类型,分别是列类型,行类型,游标类型
-- 列类型只能存储1个列值,行类型可以存储多个列值,游标类型可以存储多行多列的查询结果
-- 我自己的理解是:列是0 维的点,行是1维的线,游标是2维的面
-- 操作游标的步骤是:
-- 用open打开游标,此时游标指向第一行数据
-- 开始loop循环
-- 用fetch关键字提取游标中当前这一行数据,可以用into关键字存储到1个行类型变量中
-- 或者多个匹配的列类型变量中
-- 紧跟fetch后面是%notfound 判断是否提取了数据,如果没有那么就退出循环
-- 接下来就可以是对提取到一行数据进行操作了
-- 然后是end loop结束循环
-- 最后要close关闭游标
-- 游标有分为静态和动态
-- 静态游标在declare代码块中定义的时候,用关键字is问他查询出结果集
-- 动态游标在begin代码中用open打开的时候用关键字for为他指定查询结果集
-- 静态游标不需要自定义游标类型
-- 动态游标需要自定义游标类型