数据库语句
创建数据库:create database 库名 character set 字符编码;
查看数据库:show database;
进入数据库:use 数据库名;
删除数据库:drop database 库名;
设置编码格式,把客户端编码告诉服务器:set names 字符编码格式;但是会出现乱行
表语句
修改表名称:rename table 原名 to 新名;
创建表:Create table 表名(字段名 数据类型(长度) 约束);
查看表:Show tables;
修改表的属性 改引擎和字符集:alter table 表名 engine = 引擎名 charset =字符编码格式;
举例:alter table user charset =utf8;
查看表结构:desc 表名;
删除表:Drop table 表名;
重建表名:
1.Rename table 旧表名 to 新表名;
2.Alter tabale 旧表名 rename to 新表名
修改表
增加字段(默认在最后):Alter table 表名 add字段名 类型;
在所有字段最前面添加字段:alter table 表名 add 字段名 类型 first;
在某个字段后面添加字段:alter table 表名 add 字段名 类型 after 字段名;
修改字段:Alter table 表名 change 旧字段名 新字段名 新属性;
修改字段类型和位置:
1.所有:alter table 表名 modify 字段名 新类型 first;
2.指定:alter table 表名 modify 字段名 新类型 after 字段名;
删除字段:Alter table 表名 drop 字段名;
添加约束:Alter table 表名add constraint 约束名 约束描述;
删除约束:Alter tabale 表名 drop 约束描述;
复制表的结构及数据
复制表的结构及数据:Create table 被复制表 as select*from 新表名;
只复制表结构:Create table 被复制表 as select*from 新表名 where 1=2;
Insert:插入数据
全表插入:Insert into 表名 values(值1,值2,值3);
指定字段插入:Insert into 表名(字段1,字段2)values(值1,值2);
举例:1.Insert into 表名 values(6,'张三','男','1996-8-4');
2.Insert into 表名(id, name) values(7, '李四');
3.Insert into 表名(id, name) values(8,'王五'), (9,'赵六'), (10,'钱七');
Update:更新、修改数据
update 表名 set 字段名=’填入的数据’,字段名=’填入的数据’ where 字段名=’具体位置’
举例:1.把7,李四的性别和生日-- 修改成'女', '1998-8-4'
2.update 表名 set gender='女',birthday='1998-8-4' where id=7;
Delete:删除操作
删除数据
delete from 表名where 条件;
删除表
delete from 表名;
删除数据库
Drop database 库名;
select查询
查询所有数据,*代表所有字段内容
select * from 表名;
查询指定字段内容
select 字段名,字段名from 表名;
wher条件
1 |
2 |
3 |
4 |
= |
等值过滤 |
is null、is not null |
是null、不是null |
< > |
不等过滤 |
like |
字符串模糊匹配、% 通配多个字符、_ 通配单个字符、转译符、%、_、 |
> >= < <= |
不等过滤 |
like |
相反判断、not between and、not、in(...)、is not null、not like |
between 小 and 大 |
>= 小 并且 <= 大 |
and |
并且 |
in(7,2,9,4) |
在指定的一组值中取值 |
or |
或者 |
判断输出字段名=匹配条件的内容
select 字段名,字段名,字段名from 表名where 字段名=匹配条件(字符类型加’ ’);
and和;连接判断条件
select字段名,字段名,字段名from 表名where 字段名>=匹配条件 add 字段名>=匹配条件;
or与;连接判断条件
select字段名,字段名,字段名from 表名where 字段名>=匹配条件or字段名>=匹配条件or字段名>=匹配条件;
某字段值为null
select 字段名,字段名,字段名from 表名where 字段名>=匹配条件 is null;
某字段值不为null
Select 字段名,字段名,字段名from 表名where 字段名>=匹配条件 is not null;
某字段数据中包含 &&
Select 字段名,字段名,字段名from 表名where 字段名 like '%&&%';
某字段数据中 第3、4个字符是&&
Select 字段名,字段名,字段名from 表名where 字段名 like '_ _en%';( _ 空位符)
Distinct:去除重复值
去除a字段重复值
select distinct a from ...
Select select字段名from 表名where 字段名 is null;
去除a,b字段组合的重复值
select distinct a,b from ...
Select select字段名,字段名from 表名where 字段名 is null;
order by 子句:排序
order by a
按a字段升序排列
select 字段名,字段名from 表名where 字段名=匹配条件 order by 字段名 asc/desc;
order by a,b
按a字段升序排列,a相同,再按b字段升序排列
asc 升序(默认)
desc 降序
举例:order by a desc;
order by a desc, b asc;
order by a desc, b desc;
group by 子句
分组求多行函数
按指定字段中相同的值进行分组
分组后分别求多行函数
分组字段,可以查询
按a字段相同值分组:group by a
按a,b组合的相同值分组:group by a,b
having 字句:用来对多行函数结果进行过滤
Having和where作用相同,都是条件过滤
Where 过滤普通条件,最早执行
having 过滤多行函数结果,分组,求完多行函数后,才执行
having 跟在 group by 后面
查询执行顺序
(1)select 字段
(2)from
(3)where
(4)order by
(5)where 过滤
(6)选取字段
(7)order by 排序
函数
(1)字符串函数
①char_length(字符串) 字符数
②length(字符串) 字节数
③left(字符串, length) 获得左侧字符
④substring(字符串, start个数, length长度) 截取字符串
⑤instr(字符串, 子串) 查找子串位置
⑥concat(s1,s2,s3...) 字符串连接
⑦lpad(字符串,8,'补充的符号') 左侧填充
数字函数
ceil(数字) 向上取整到个位
floor(数字) 向下取整到个位
round(数字,2)四舍五入到小数点2位,如果是负数,向整数位取值
truncate(数字, 2) 直接舍弃到小数点2位
rand() 随机数[0, 1)
日期函数
now() 当前日期时间
curdate() 当前日期
curtime() 当前时间
extract(字段 from 日期) 抽取指定字段的值
date_add(日期, interval 字段 值) 在指定字段上加一个值
datediff(日期1,日期2) 两个日期之间相差的天数
null值函数
ifnull(a, b)
1.a不是null返回a
2.a是null返回b
多行函数、聚合函数
sum() 和
avg() 平均
max() 最大
min() 最小
count() 行数
count(*) 记行数
count(distinct a) 去除重复再计数
多行函数不能和其他普通字段一起查询
多个多行函数可以一起查询
多行函数会忽略null值
查询嵌套
条件子查询:一个查询的结果,作为另一个查询的过滤条件
单值子查询:= > >= < <=
多值子查询
1.In
2.> all 比最大值大
3.> any 比最小值大
多列子查询
1.where (a,b) in (select ...)
2.where (a,b) = (select ...)
From子查询,行内视图
1.从查询的查询结果,再查询
2.select ... from (select ...) t
约束
限制字段中的取值
主键
数据表中,一行数据的唯一标识
不重复
不能是null值
自动生成索引
一般使用“非业务数据”来作为主键
自动增加
随机生成
自增主键:整数类型主键,可以设置自动生成自增的值
外键:限制一个字段,只能取指定主键中存在的值
自动生成索引
非空:not null
唯一:unique
检查:
1.设置检查条件,约束字段的取值
2.mysql不支持
3.mariadb 支持检查约束
多表连接查询
两张表,按指定条件,连接成一张表
从连接的结果表中查询
外连接
内连接:只查询满足连接条件的数据
外连接:不满足连接条件的数据也要查询
左外连接:查询左侧表条件外数据
右外连接:查询右侧表条件外数据
全外连接:双侧表条件外数据,但是MySQL不支持
外连接,非标准SQL连接语句,每种数据库外连接语法都不一样
1.sql server:where a.id(+) = b.xid
2.Oracle:where a.id *= b.xid
3.MySql:没有外连接的非标准语法
标准的表连接语法:
1.select ...from a join b on(a.id=b.xid) join c on(...);
2.select ...from a left join b on(a.id=b.xid);
3.select ...from a right join bon(a.id=b.xid);
事务
事务由一组sql语句组成,事务的sql语句整体成功,整体失败
数据操作最小单元是事务,而不是sql语句
1.例如:A --> B
2.update 账户 set money=money-100 where id='A';
3.update 账户 set money=money+100 where id='B';
启动事务:
1.Begin
2.start transaction
3.事务启动后,执行的数据增删改操作,会暂时记录在一个日志文件中
提交事务:
1.Commit
2.事务日志中记录的数据操作,在数据表中生效
3.清空日志文件
回滚事务:
1.Rollback
2.清空日志
事务特性ACID:
1.A - Atomic: 原子性,数据操作的最小单元是事务,而不是sql语句
2.C - Consistency: 一致性,事务完成前后,数据要保持逻辑的一致性
3.I - Isolation: 隔离性,一个事务操作数据时,其他事务要等待
4.D - Durancy: 持久性,事务成功,数据被永久的保存
数据访问冲突的问题:
三种问题:脏数据,不可重复读,幻觉读
1.脏数据:一个事务未提交的数据,被另一个事务查询到
2.不可重复读:针对数据修改 update 操作; 查询过的数据,再次查询时,与之前的查询结果不一致
3.幻觉读:针对数据的插入和删除;新插入的数据,查询不到;删除的数据,能查询到
隔离级别
为了避免数据访问冲突的问题,避免数据的混乱,数据库会让事务进行隔离
为了兼顾数据安全,和性能,数据库提供了四种隔离级别
级别越高,越安全,性能越差
级别越低,越不安全,性能越高
mysql设置隔离级别:
1.set tx_isolation='read-uncommitted'
2.脏读、不可重复读、幻觉读
3.set tx_isolation='read-committed'
4.不可重复读、幻觉读
5.set tx_isolation='repeatable-read' 默认级别
6.幻觉读
7.set tx_isolation='serialiable'