MySQL
SQL分类:
- DDL数据定义语言,用来维护存储数据的结构。代表指令:create , drop , alter
- DML 数据操纵语言,用来对数据进行操作。代表指令:insert , delete , update , select
- DCL 数据控制语言,主要负责权限管理和事务。代表指令:grant , revoke , commit
1、数据库操作
-
查询所有数据库:show databases;
-
删除数据库:drop database [IF EXISTS] db_name;
-
使用数据库:use db_name;
-
创建数据库:create database if not exists db_name character set utf8mb4;
2、表的操作:
1、 创建表:create table table_name(…);
2、删除表:
- drop table table_name;
3、 查询所有表:
- show tables;
4、查看表结构:
- desc 表名;
5、 修改表结构:
- alter table table_name add clumom 字段名 类型;
6、 新增数据:
- 单行全列插入数据:intsert into table_name values(…);
- 多行指定列插入数据:intsert into table_name(字段名) values(…),(…),(…);
7、 修改数据:
- update 表名 set 字段名 = 值 where…;
8、清空数据:
-
delete from 表名 where …
-
删除整张表数据(但不会删除表):delete from for_delete;
9、 查询:
- 全列查询:select * from 表名;
- 指定列查询:select 列名 from 表名;(正确使用)
- 表达式查询:select math+10 from 表名;(不用,禁止使用)
- 别名查询:uname -> username select uname as username from 表名;
- 聚合查询(where的后面不能出现聚合函数):
count()
sum()
avg()
max()
min()
10、 去重:distinct
- select distinct 列名 fiom 表名;
11、 排序:order by 默认升序
- ASC升序(从小到大)
- DESC降序(从大到小)
12、 where查询
13、 分页查询:limit
- limit 3,3 -> 查询3条数据 跳过前3条 -> 第2页
14、约束类型:
15、 查询(进阶) :多表查询
- 内联查询:(笛卡尔积)select a.,b. from a inner join b on a.id = b.aid;(查询的是两张表共有的数据)
阿里巴巴规定:禁止3张表以上的连表查询 - 外联查询:
左联查询:left join
外联查询:right join - 子查询:select * from student where classid in (select classid form student where username = ‘鹏飞’);
- 表的约束:
物理外键 -> 逻辑外键
物理删除 -> 逻辑删除 - 表的关系:
1对1(一张表)
1对多(两张表)
多对多(三张表)
3、索引
1、普通索引:create index 索引名 on 表名(字段)
2、主键索引:无需创建显式索引
3、唯一索引:create unique index 索引名 on 表名(字段)
4、组合索引(最左匹配原则):
5、查看索引:show index from 表名;
6、删除索引:drop index 索引名 on 表名;
索引注意事项:
1、在生产服务器不要直接执行添加索引的操作(创建索引的过程非常耗时,且数据量大创建的时间就越长)。
2、对于多读(查询)的场景适合使用索引,而对于添加删除比较多的场景,那么索引就不适用。
3、避免使用查询的时候,不触发索引的查询。 比如在列上进行赋值运算。
问:什么情况下索引不会触发?
答:1、当对一个列(已经设置索引的列),进行赋值查询的时候。
2、避免使用like查询,当使用模糊查询的时候有可能不触发索引,比如当使用like‘%XXXX%’不会触发索引,当使用like‘XXXX%’是可以触发索引。
3、当使用的是组合查询,一定要注意遵循最左匹配原则
4、尽量避免使用or查询,有可能导致索引不生效。
5、不要使用!=<>
问:如何优化MySQL的性能?
1、查询比较多的关键列上加索引
2、开启慢查询日志,找到执行比较慢SQL,针对性的进行优化。
3、能使用主键索引的时候,尽量使用主键索引。
4、分表(垂直分隔)分库(水平分隔)
5、提高数据库的硬件配置,更换一个读写性更好的磁盘,更好的一个更大的内存
问:主键索引和普通索引的区别?
1、主键索引不需要显示创建。
2、主键索引不能删除,而普通索引可以。
3、主键索引查询更快,而普通索因为有回表查询,索引性能没有主键索引高
4、事务
- 事物特性(ACID):
(1)隔离性:并发事务执行时,隔离问题。
(2)原子性:要么全部成功,要么全部失败。
(3)持久性:事务执行完成之后,结果要一直保持下来。
(4)一致性:事务执行前后,数据要保证是准确的。 - 并发事务存在的问题:
(1)脏读:事务A读取到了事务B未提交的数据,然后事务B回滚了。
(2)不可重复读:事务A使用相同的查询条件。读取到了不一样的结果,因为这个过程中事务B修改了数据。
(3)幻读:事务A将数据修改之后,事务B又添加了一条数据,导致事务A执行结果和预期不一致。
问:不可重复读和幻读的区别:
不可重复读的侧重点描述的修改操作,而幻读描述的添加或删除 - 事务的隔离级别:
(1)读未提交
(2)读已提交
(3)可重复读
(4)串行化
幻读问题的解决方案:
1、MVCC
2、gap间隙锁
5、JDBC编程
- JDBC使用步骤总结
- 创建数据库连接Connection
- 创建操作命令Statement
- 使用操作命令来执行SQL
- 处理结果集ResultSet
- 释放资源