文章目录
SQL语句总结
- DDL:DataDefinitionLanguage 数据库定义语言,关键字有:create,alter,drop
- create:创建表和数据库:
create 数据库名 character set 'utf8';
show 数据库名; //显示建立的数据库
use 数据库名; //使用某个数据库
---
create table 表名 (
列名1 数据类型 主键约束 自增 //主键一般为自增
列名2 数据类型 非空约束 唯一约束 //非空约束 唯一约束非强制添加
列名3 数据类型
... ...
);
- alter:修改表结构:
-- 对列添加主键约束,对多个列添加主键约束,也可以对单个列添加。
alter table 表名
add constraint pk_表名
primary key(列名1,列名2...);
-- 对主键添加自增约束。
alter table 表名 modify 主键列名 auto_increment;
-- 添加约束的语句:不包括非空约束
alter table 表名 add constraint 约束名 约束列;
-- 添加非空约束:modify(非空约束是列级约束,只能用modify来添加)
alter table 表名
modify 列名 列数据类型 not null;
-- 删除非空约束:modify
alter table 表名
modify 列名 列数据类型;
-- 删除约束:不包含非空
alter table 表名 drop 约束列 [约束名];
--唯一性约束底层是对列添加唯一索引(index)
--删除唯一约束:
alter table 表名
drop index 唯一约束名;
-- 添加外键约束:foreign key:fk,外键名:fk_主表名_从表名
-- 主表自己带有主键的表,从表是指有外键的表
alter table t_score
add CONSTRAINT fk_student_score
FOREIGN key(student_id)
-- REFERENCES引用
REFERENCES t_student(student_id);
-- 删除外键要跟外键名
alter table t_score
drop foreign key fk_student_score;
3.drop删除数据库和表
-- 删表:
drop table if EXISTS 表名;
--删库:
drop database if EXISTS 数据库名;
- DML:DataManipulateLanguage,数据操纵语句,对表中的数据进行操作的语句,关键字:insert delete update
- insert:向表中添加数据:
-- 插入数据
insert into 表名
values(所有列的值);
-- 插入指定列的值
insert into 表名
列名1,列名2,values(值1,值2);
-- 插入数据时,主键可以写空值。
2.delete:删除数据
-- 删除行数据
delete from 表名
where 列名(条件);
3.upadate:修改数据
-- 修改数据,修改的列值
update 表名
set 列名='新值';
where 条件
注意:insert和delete是对列进行添加和删除,update是对列的值进行修改
- DQL:DataQueryLanguage:数据查询语句,查询的是表中的数据:select
1.select:用来查询数据
-- 查询表中所有数据
select * from 表名;
-- 查询指定列数据,as是起别名,可省略。
select 列名1 as '别名',列名2 as '别名'
from av_actress
where 要查询的条件;
select语句后使用where;对查询结果进行筛选,where相当于if,where后:条件运算/逻辑运算
模糊查询:
1、可以用like表达式。
2、instr(列名,要查找的字符串)>0;表示列值中有要查找的字符串。
instr(列名,要查找的字符串)=1;表示要查找的字符串是第一个位置。
注意:Mysql中字符串下标从1开始,
instr();查找不到返回0;
参数绑定:
主查询子查询之间参数绑定应用场景:
1、子查询的查询结果不固定。
2、子查询的结果随着外层查询结果而变化。
绑定谁?
随着外层的哪列变化就绑定哪列;如果是多列就绑定多列
聚合函数、统计函数:
对多行值进行统计,返回值为一行一列(一个数)
AVG()
COUNT()
MAX()
MIN()
SUM();
注意:聚合函数单独使用或者和分组连用
分组:
分组的目的就是为了统计,
group by:表示分组;
group by 列名1,列名2,…
分组后,只能select 分组的列名,聚合函数
where是对整个查询结果进行筛选,
having是对分组的结果进行筛选,
having用在group by后
如果不分组,聚合函数单独使用
DQL语句的书写顺序:
select …
from …
where …
group by …
having …
order by …
count():
count():是按行统计个数,也就是统计有多少行,
count()和count(1)的区别?
count():整行统计,
count(1):按单列去统计,
count(1)的执行效率略高于count(*)。
分页查询:
limit m,n:
m:起始行数
n:连续查出几条
注意:0表示第1行
每页pageSize条,查询pageNo(页码)页的数据
limit (pageNo-1)*pageSize,pageSize;
子查询:
单行子查询:
子查询返回结果为一行,可以使用关系运算进行比较;
多行子查询:
子查询返回结果为多行,不能直接使用关系运算进行比较,可以使用in,any,all
any:任意一个
in(范围):=any(范围);
in的含义:=(任意一个即可)
所有的关联查询都可以使用子查询替换,
但不是所有的子查询都可以使用关联查询替换。
子查询和关联查询都可以实现需求的情况,优先选择关联查询,语法简单,效率更高。
EXISTS:
1.删库删表时,使用if EXISTS 进行判断
2.用来判定查询是否有结果:
where exists(子查询)
判断部分sql(子查询)是否有结果,
如果子查询有结果执行外层查询,否则不执行
where EXISTS只是确定下外层查询是否执行
不能限定外层查询结果
EXISTS相当于一个查询条件
where不是对最终的查询结果进行筛选,
它是对表中的数据按行进行筛选
聚合函数、分组:
是对最终的查询结果进行聚合、分组
having:是对分组后的结果进行筛选
where中不能使用聚合函数
多列分组原则:
是按列先后顺序分组如:group by 列1,列2…
先按列1分组,
然后再对分组后的结果按列2分组
依次类推…
关联查询:
把多张表关联为一张逻辑大表,目的是为了方便查询。
多个表关联后,select 各个表的列,
但关联后一般不select *,避免重复列
关联查询/连接查询:
笛卡尔积:一个表的每条数据分别和别的表去连接
A:m行记录 B:n行记录
笛卡尔积后:m*n条
内连接:inner join,inner可省略
等值连接:通过外键进行等值连接
非等值连接
笛卡尔积:全连接
外连接:
左外连接:
A left join B:
左表的数据会全部查出,
和右表无数据关联的列值使用null值填充;
右表只查询有关联的数据
右外连接:
A right join B:
右表的数据会全部查出,
和左表无数据关联的列值使用null值填充;
左表只查询有关联的数据
左连接,谁在左,全查谁
右连接,谁在右,全查谁
多表关联语法:
// 1.inner join
select ... from 表名1 inner join
表名2 inner join...
on 外键的链接
// 2.
select ... from 表1,表2...
where 外间的连接
and ...
and ...
找外键,几个外键几个on/几个where条件
事务:
事务的特性:
ACID
- 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么 都发生,要么都不发生。
- 一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
- 隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个 事务内部的操作及使用的数据对并发的其他事务是隔离的,并发 执行的各个事务之间不能互相干扰。
- 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
mysql数据库引擎:
innodb:支持事务
MyISAM:不支持事务,查询速度快,很少修改,经常查询
masql:默认提交事务:
每一个DML语句默认对应一个事务
需要事务控制时,首先要关闭自动提交事务。
转账:两个update是一个事务
事务结束方式:
正常结束:commit
事务回滚:rollback
隔离级别:
- 脏读: 对于两个事务 T1,T2, T1读取了已经被T2 更新但还没有被提交的字段 之后, 若T2回滚, T1读取的内容就是临时且无效的.
- 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
- 幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插 入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.