1.约束
2.数据库设计
3.多表查询
4.事物
5.新增/删除/修改语句
6.单表条件查询
7.函数
8.创建数据库/数据表
9.索引概述
10.存储引擎
11.设计表
第一步:from 指定要操作的表
第二步:join 连接表生成一个笛卡尔积
第三步:on 对笛卡尔积进行筛选
第四步:where 筛选条件
第五步:group by 对数据进行分组
第六步:max min avg count sum 执行分组函数
第七步:having 对分组后的数据进行过滤
第八步:select 选取结果
第九步:distinct 去除重复结果
第十步:order by 将结果进行排序
第十一步:limit 取结果集中的部分数据
-- 员工表
CREATE TABLE emp (
id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长
ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
joindate DATE NOT NULL , -- 入职日期,非空
salary DOUBLE(7,2) NOT NULL , -- 工资,非空
bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
);
添加非空约束
--新建:
-- 创建表时添加非空约束
CREATE TABLE 表名(
列名 数据类型 NOT NULL,
…
);
-- 建完表后删除
ALTER TABLE 表名 MODIFY 字段名 数据类型;
-- 建完表后添加非空约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
-- 删除非空约束
ALTER TABLE emp MODIFY ename VARCHAR(50);
-- 新建非空约束
ALTER TABLE emp MODIFY ename VARCHAR(50) NOT NULL;
添加唯一约束
-- 创建表时添加唯一约束
CREATE TABLE 表名(
列名 数据类型 UNIQUE [AUTO_INCREMENT],
-- AUTO_INCREMENT: 当不指定值时自动增长
…
);
CREATE TABLE 表名(
列名 数据类型,
…
[CONSTRAINT] [约束名称] UNIQUE(列名)
);
-- 删除唯一约束
ALTER TABLE emp DROP INDEX ename;
-- 新建唯一约束
ALTER TABLE emp MODIFY ename VARCHAR(50) UNIQUE;
默认约束
-- 创建表时添加默认约束
CREATE TABLE 表名(
列名 数据类型 DEFAULT 默认值,
…
);
-- 删除默认
ALTER TABLE emp ALTER bonus DROP DEFAULT;
-- 新建默认约束
ALTER TABLE emp ALTER bonus SET DEFAULT 0;
主键约束
-- 删除主键约束,要先删除自增
alter table emp modify id int;
-- 删除主键约束
ALTER TABLE emp DROP PRIMARY KEY;
-- 添加主键约束
ALTER TABLE emp ADD PRIMARY KEY(id);
-- 添加自增
alter table emp modify id INT auto_increment;
-- 设置自增默认值
alter table emp auto_increment=3;
外键约束
添加外键约束,当主表想要删除关联从表的数据时,需要看从表有没有关联的数据,如果有的话,不能删除,需要删除从表的数据后,才可以删除主表的数据

-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
-- CONSTRAINT fk_emp_dept(别名) FOREIGN KEY(dep_id)->从表连接id REFERENCES dept(id)->主表连接id
);
需求分析-设计-编码-测试-安装部署
一对多:在多的一方建立外键,指向主表
多对多:中间表包含两个外键
一对一:在任意一方建立外键,关联主键,设置唯一
多表查询
内连接:相当于查询A B的交集数据
外连接:(左外连接/右外连接)查询A表所有的数据和与B表有交集的数据
内连接
select 字段 from 表1,表2 where 条件
select 字段 from表1 join 表2 on 条件
-- 隐式内连接
SELECT a1.NAME,a1.gender,a2.dname FROM emp as a1, dept as a2 WHERE a1.dep_id = a2.did
-- 显示内连接
SELECT a1.NAME,a1.gender,a2.dname FROM emp as a1 JOIN dept as a2 ON a1.dep_id = a2.did;
外连接
左外连接
右外连接
子查询
语法:
单行单列->作为作为值 使用 > < = != 作为判断:
SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE name = '猪八戒')
多行单列 ->当查询的结果存在多个时:
SELECT * from emp WHERE dep_id in (SELECT did FROM dept WHERE dname ='财务部' or dname = "市场部");
多行多列 作为虚拟表 -> 查询出的表为结果集时,将当前当作虚拟表来看:
跟在from后面:
SELECT * FROM (SELECT * FROM emp WHERE join_date > '2011-11-11') t1 , dept where t1.dep_id = dept.did
事物:事物把所有命令看作一个整体提交或撤销,即一组数据要么同时成功,要么同时失败. 开启事物时,先进性虚拟存储,成功或回滚后,才能持久化操作.
1.开启事物 begin / start Transaction
2.操作
3.提交事物 commit 或者 回滚事物 Rollback
事物的四大特征:
ACID
1.原则性(Atomicity)事物要么同时成功,要么同时失败
2.一致性 (Consistency)事物完成时,必须保持一致
3.隔离性 (Isolation)多个事物之间,可以同时操作数据
4.持久性 (Durability)事物一旦提交或回滚,数据库中的数据永久保存
mysql事物是默认提交的
select @@autocommit 查看事物的提交方式
set @@autocommit = 0; 修改事物的提交方式
INSERT INTO 表名(字段) VALUES (字段对应的值)
INSERT INTO 表名 VALUES (字段对应的值)
-- 删除单条数据
DELETE FROM 表名 WHERE 字段 = 条件 ;
-- 删除多条数据
DELETE FROM 表名
-- 更新一条数据
UPDATE user SET 字段 = 将要修改的值 WHERE 字段 = 修改的条件;
-- 更新全部数据
UPDATE user SET 字段 = 将要修改的值 更新表中的全部数据
字段去除重复
查看当前去除重复的字段
SELECT DISTINCT 字段 FROM 表名;
WHERE 条件判断
SELECT * FROM 表名 WHERE 字段 < > = <= >= != 值
BETWEEN AND 在xx 与 xx之间
当前字段的数据 值1 <= 字段数据 <= 值2
SELECT * FROM 表名 WHERE 字段 BETWEEN 值1 AND 值2
Like 模糊查询
Select * from emp where 字段 like 'M%'; M开头的
案例
Select * from 表名 where 字段 like '5%'; 以为5开头的数据
Select * from 表名 where 字段 like '%1'; 结尾以1开始数据
Select * from 表名 where 字段 like '%5%'; 中间为5的数据
Select * from 表名 where 字段 like '_5%'; 任意数据开头+5的数据
in 多条件查询
SELECT * FROM 表名 WHERE 字段 IN (值1,值2...)
REGEXP 当前字段数据是否在指定范围
SELECT * FROM 表名 WHERE 字段 REGEXP '[a-e]'; 字段包含a-e的全部数据
SELECT * FROM 表名 WHERE 字段 REGEXP '[^a-e]'; 字段不包含a-e的全部数据
OR 或者 AND 而且
语法
select * from 表名 where 字段 (条件表达式=<>) 字段值 AND/or 字段 (条件表达式=<>)
-- 用法
userid = 2 并且 username = b
select * from user1 where userid = 2 AND username = 'b';
userid = 2 或者 username = a
select * from user1 where userid = 2 or username = 'a';
LIMIT分页每页显示的数据
select * from 表名 LIMIT 每页显示的数据;
使用:
查询10条数据,索引从0到9,第1条记录到第10条记录
select * from 表名 LIMIT 10;
查询8条数据,索引从5到12,第6条记录到第13条记录
select * from 表名 LIMIT 5,8;
表/字段起别名
表起别名
select a.字段,b.字段 from 表名 as a, 表名 as b where xxxxxxxx;
字段起别名
SELECT 字段 AS 别名, 字段 AS 别名 FROM 表名;
GROUP BY 分组函数
SELECT * FROM 表名 GROUP BY 分组值;
使用->根据名称分组,查询同组的相同记录数
SELECT count(username),username '记录数' FROM user1 GROUP BY username;
order by 排序
ASC 从小到大
select * from 表名 order by 字段 ASC;
DESC 从大到小
select * from 表名 order by 字段 DESC;
搭配group by进行查询
select 函数 from 表名
聚合函数 使用
count -> 返回总记录数 count(*) 所有的记录数 count(字段) 当前字段的记录数
select count(*) from emp
max(列名) -> 最大值
select max(salary) from emp
min(列名) -> 最小值
select min(salary) from emp
sum(求和) -> 求和
select sum(salary) from emp
avg(字段)
SELECT avg(salary) FROM emp
创建数据库
CREATE DATABASE 库名;
删除数据库
drop database 数据库名;
选择数据库
use 数据库名;
新建数据表
-- 员工表
CREATE TABLE emp (
id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长
ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一
joindate DATE NOT NULL , -- 入职日期,非空
salary DOUBLE(7,2) NOT NULL , -- 工资,非空
bonus DOUBLE(7,2) DEFAULT 0 -- 奖金,如果没有奖金默认为0
);
删除数据表
DROP table 表名;

二叉树索引,将第一个值作为主节点,第二个值大于主节点放右边小于放左边 
优势:


建议:符合索引替代单值索引
优点:不需要回表查询(表中只存储索引,查询到对应的索引后,根据索引查询数据库的数据表)
缺点:依赖于有序的数据,如果是uuid那就很慢 /更新代价大,更新表也要更新索引

优点:更新代价小
缺点:回表查询


需要查询的字段和查询的内容为索引–覆盖索引


介绍:
mysql官方定义为:索引是帮助Msql高效获取数据的数据结构。
Msql咋子存储数据的同时,数据库中还存在着满足特定查询算法的数据结构,这些数据结构以某种引用指向表中的数据,这样外面可以同各国数据结构上实现的高级查找算法快熟找到我们想要的数据,这种数据结构就是索引。
举例:
比如: 需要查询name字段的user数据,没有索引则会从第一条数据开始查询(全表扫描),如果给name创建索引,就会先找u这个单词,根据u去找s,根据s寻找e,根据e寻找r,从而提升查询效率
将数据封装成一个二叉树的节点,向节点插入,满足左低右高的关系

提高数据检索的效率,降低数据库的IO成本。
通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗
索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息。
1.主键自动建立唯一索引
2.频繁作为查询条件的字段应该创建索引(where 后面的语句)
3.查询中与其它表关联的字段,外键关系建立索引
4.多字段查询下倾向创建组合索引
5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
6.查询中统计或者分组字段

id相同时,执行顺序由上至下。
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,则先被执行。
id相同和不同都存在时,id相同的可以理解为一组,从上往下顺序执行,所有组中,id值越大,优先级越高越先执行。



查询的类型,常见值有:
SIMPLE :简单的 select 查询,查询中不包含子查询或者UNION。
PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为Primary。
DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询, 把结果放在临时表里。






将遍历全表以找到匹配的行
查询实际使用到的索引

显示索引的哪一列被使用了。哪些列或常量被用于查找索引列上的值。
rows列显示MySQL认为它执行查询时必须检查的行数。一般越少越好。
一些常见的重要的额外信息:
Using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”。
Using temporary:Mysql在对查询结果排序时使用临时表,常见于排序order by和分组查询group by。
Using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错。(查询的字段就是索引)
Using where:表示使用了where过滤。(where查询)


1)最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列。
2)不在索引列上做任何计算、函数操作,会导致索引失效而转向全表扫描。
3)存储引擎不能使用索引中范围条件右边的列。
4)Mysql在使用不等于时无法使用索引会导致全表扫描。
5)is null可以使用索引,但是is not null无法使用索引。
6)like以通配符开头会使索引失效导致全表扫描。
7)字符串不加单引号索引会失效。

建议:1.对于单值索引,尽量选择针对当前查询字段过滤性更好的索引。2.对于组合索引,当前where查询中过滤性更好的字段在索引字段顺序中位置越靠前越好。3.对于组合索引,尽量选择能够包含在当前查询中where子句中更多字段的索引。4.尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。

