MySQL
脏读:在一个事务处理过程中读取到另一个事务未提交的数据,导致两次查询结果不一致.
不可重复读:在一个事务的处理过程中读取到另一个事务中修改并已经提交的数据,导致两次查询结果不一致
幻读:查询某条数据不存在,准备插入这个记录时发现这个记录已经存在,无法插入.或者查询数据不存在执行删除操作,却发现删除成功
----------------------------------------------------------------------------------------------------------------------------------------------------------------
隔离级别从小到大安全性越来越高,但是效率也就越来越低,mysql默认的隔离级别是可重复读.(不建议修改数据库隔离级别)
左外连接:查询原理,会查询左表的全部数据,和右表有交集部分的数据.
------------------------------------------------------------------------------------------------------------------------------
sql优化:
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
5.in 和 not in 也要慎用,否则会导致全表扫描
6.like查询尽量避免百分号开头
7.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
8.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,
否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
9.不要写一些没有意义的查询,如需要生成一个空表结构
10.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
11.尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间,
其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
12.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
13.避免频繁创建和删除临时表,以减少系统表资源的消耗。
14.尽量避免大事务操作,提高系统并发能力。
15.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理
------------------------------------------------------------------------------------------------------------
查询所有数据库:SHOW(显示) DATABASES(数据库)
查询某个数据库:SHOW CREATE(创造) DATABASE 数据库名称;
创建某个数据库:CREATE(创建) DATABASE 数据库名称;
删除数据库:DROP DATABASE 数据库名称;
删除数据库db2,如果存在:DROP(终止) DATABASE IF EXISTS db2;
使用db4数据库: USE(使用) db4;
查询当前正在使用的数据库:SELECT(查询) DATABASE();
修改表中列的名称和数据类型:ALTER(改变) TABLE 表名 CHANGE 旧列名 新列名 数据类型;
=============
下面开始重要的部分
=============
给指定列添加数据: INSERT(插入) INTO(到.....里面) 表名(列名1,列名2,...) VALUES (值1,值2,...);
批量添加所有列数据:INSERT INTO 表名 VALUES (A值1,A值2,A值3,...),(B值1,B值2,B值3,...),(C值1,C值2,C值3,...);
修改表数据:UPDATE(更新) 表名 SET(设置) 列名1 = 值1,列名2 = 值2,... [where 条件];
删除表数据:DELETE FROM 表名 [WHERE 条件];
分页查询
标准语法:
SELECT 列名 FROM 表名
[WHERE 条件]
[GROUP BY 分组列名]
[HAVING 分组后条件过滤]
[ORDER BY 排序列名 排序方式]
LIMIT 当前页数,每页显示的条数;
LIMIT 当前页数,每页显示的条数;
公式:当前页数 = (当前页数-1) * 每页显示的条数
查询全部数据:SELECT * FROM 表名;
查询指定列:SELECT 列名1,列名2,... FROM 表名;
去除重复查询:SELECT DISTINCT(独特的) 列名1,列名2,... FROM 表名;
计算列的值
标准语法:
SELECT 列名1 运算符(+ - * /) 列名2 FROM 表名;
如果某一列为null,可以进行替换
ifnull(表达式1,表达式2)
表达式1:想替换的列
表达式2:想替换的值
起别名: SELECT 列名1,列名2,... AS 别名 FROM 表名;
条件查询: SELECT 列名列表 FROM 表名 WHERE 条件;
列:-- 查询库存大于20的商品信息
SELECT * FROM product WHERE stock > 20;
% 占位符 如"小米%" 查找以小米开头的信息
_ 占位符 如"_为%" 查询第二个字是为的商品信息
+++++++++++++++++++++++++++++++
聚合函数
+++++++++++++++++++++++++++++++
聚合函数: SELECT 函数名(列名) FROM 表名 [WHERE 条件];
例子: -- 计算product表中总记录条数
SELECT COUNT(总数)(*) FROM product;
-- 获取品牌为苹果的总库存数量
SELECT SUM(stock) FROM product WHERE brand='苹果';
排序查询: SELECT 列名 FROM 表名 [WHERE 条件] ORDER(顺序) BY 列名1 排序方式1,列名2 排序方式2;
例子:-- 按照库存升序排序
SELECT * FROM product ORDER(排序) BY(由) stock ASC(升序);
分组查询:SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];
例子:-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额
SELECT brand,SUM(price) FROM product WHERE price > 4000 GROUP BY brand;
-- 对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的、并按照总金额的降序排列
SELECT brand,SUM(price) getSum FROM product
WHERE price > 4000
GROUP BY brand
HAVING getSum > 7000
ORDER BY getSum DESC;
分页查询
标准语法:
LIMIT(限制) n ; limit 1; 表示我只获取一条数据
LIMIT m, n; 表示我从 m+1 开始查, 我只查n条
LIMIT 10, 10; 从第11条开始查,往后查10条;
前提: 每页展示rows=10条; 表中共有35条;
第一页: 0, 10;
第二页: 10, 10;
第三页: 20, 10;
LIMIT 当前页数,每页显示的条数;
m = (current_page - 1) * n;
--公式:当前页数 = (当前页数-1) * 每页显示的条数
例:-- 每页显示3条数据
-- 第1页 当前页数=(1-1) * 3
SELECT * FROM product LIMIT 0,3;
-- 第2页 当前页数=(2-1) * 3
SELECT * FROM product LIMIT 3,3;
-- 第3页 当前页数=(3-1) * 3
SELECT * FROM product LIMIT 6,3;
-----------------------------------------------------
约束
-----------------------------------------------------
-- 建表后单独添加主键约束: ALTER TABLE student MODIFY id INT PRIMARY KEY;
-- 删除主键: ALTER TABLE student DROP PRIMARY KEY;
-- 删除自增约束
ALTER TABLE student MODIFY id INT;
INSERT INTO student VALUES (NULL,'张三',23);
-- 建表后单独添加自增约束: ALTER TABLE student MODIFY id INT AUTO_INCREMENT;
-------唯一约束
-- 建表后单独添加唯一约束: ALTER TABLE student MODIFY age INT UNIQUE;
-- 删除唯一约束: ALTER TABLE student DROP INDEX age;
-------非空约束
-- 建表后单独添加非空约束: ALTER TABLE student MODIFY NAME VARCHAR(30) NOT NULL;
-- 删除非空约束
ALTER TABLE student MODIFY NAME VARCHAR(30);
INSERT INTO student VALUES (NULL,NULL,25);

浙公网安备 33010602011771号