数据库语句
创建数据库: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条件
= | 等值过滤 | 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字段名>=匹配条件;某字段值为nullselect 字段名,字段名,字段名from 表名where 字段名>=匹配条件 is null;某字段值不为nullSelect 字段名,字段名,字段名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返回a2.a是null返回b
多行函数、聚合函数
sum() 和avg() 平均max() 最大min() 最小count() 行数count(*) 记行数count(distinct a) 去除重复再计数多行函数不能和其他普通字段一起查询多个多行函数可以一起查询多行函数会忽略null值
查询嵌套
条件子查询:一个查询的结果,作为另一个查询的过滤条件单值子查询:= > >= < <=多值子查询1.In2.> 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.xid2.Oracle:where a.id *= b.xid3.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.Begin2.start transaction3.事务启动后,执行的数据增删改操作,会暂时记录在一个日志文件中提交事务:1.Commit2.事务日志中记录的数据操作,在数据表中生效3.清空日志文件回滚事务:1.Rollback2.清空日志事务特性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'