数据库语句

数据库语句

创建数据库: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'
原文地址:https://www.cnblogs.com/xianyao/p/10847037.html