1.MySQL默认不区分大小写
如:select a.name from (select "asdf" as name) as a where a.name like 'aS%';
输出:asdf
2.MySQL中 + 的作用:
- 若两个操作数都是数值型:如select 100+1.5; 输出:101.5
- 若其中一个是字符型,另一个为数值型,会强制把字符型转为数值型,转换失败则当0处理:如select ‘张三’+100; 输出:100
- 若其中一个为null:如select null+100; 输出null
注: 若字符型拼接,要用concat,如:select concat(‘张三’,‘李四’); 输出:张三李四
3.distinct:去重
4.联合查询
- union:自动去重
- unionall:不去重
5.库的操作
- 创建数据库:create database if not exists userDB;
- 删除数据库:drop database if exists userDB;
6.表的操作
-
创建表:
create table 表名(
字段名 字段类型(长度) 字段约束,
字段名 字段类型(长度) 字段约束
); -
修改表:
alter table 表名 add|modify|drop 字段名 字段类型 【字段约束】comment ‘列的信息’; -
修改表名:
alter table 表名 change 旧表名 新表名 字段类型 字段约束 -
删除表:
drop table if exists 表名 -
复制表:
create table 新表 like 旧表; 复制表的结构
create table 新表 select * from 旧表; 复制表的结构和数据
7.数据的操作
-
插入数据:
insert into 表名(字段1,…) values (值1,…); -
删除数据
- delete from 表名 [where]
- truncate table 表名
- delete和truncate区别:
1.delete可以加where条件,truncate不能加where条件。
2.删除全部数据时,truncate效率高。
3.若删除带自增长列的表:delete删除后再插入数据,记录从断点处开始;truncate删除后再插入数据,记录从1开始。
4.delete删除数据会返回受影响的行数,truncate删除后不会返回受影响的行数。
5.delete支持事务回滚,truncate不支持事务回滚。
8.常用函数
字符函数
- ifnull:如select ifnull(null,0); 输出0
- length 获取字节长度 :如select length (1000); 输出4; 若数据库字符集设成utf8,select length (‘ab张三’); 输出:8
- char_length 获取字符长度 :如select char_length(‘ab张三’); 输出:4
- substr(str,起始索引,截取字符的长度) :如select substr(‘张三李四王五’,1,3); 输出:张三李
- trim 去除前后指定字符,默认去除空格:如select trim(‘x’ from ‘xxxxx张三xxxxx’); 输出:张三
- lpad/rpad 左填充/右填充:如select lpad(‘张三’,‘5’,‘x’); 输出:xxx张三; 若select lpad(‘张三’,‘1’,‘x’); 输出:张
- upper/lower 变大/小写
- left/right 截取字符串:如select left(‘abcd’,2); 输出:ab
数字函数
- abs 绝对值:如select abs(-2.4); 输出:2.4
- ceil 向上取整:如select ceil(1.01); 输出:2
- floor 向下取整:如select floor(0.9); 输出:0
- round 四舍五入:如select round(1.783); 输出:2;select round(1.783,2); 输出:1.78
- truncate 截断:如select truncate(1.836,1); 输出:1.8 相当于把后面都舍去
- mod 取余:如select mod(10,3); 输出:3
日期函数
- now 获取当前日期和时间:如select now(); 输出:2020-11-01 12:12:12
- curdate 获取当前日期:如select crudate(); 输出:2020-11-01
- curtime 获取当前时间:如select crutime(); 输出:12:12:12
- datediff 获取时间差:如select datediff(‘2020-11-01’,‘1998-10-15’); 输出:8053
- date_format 格式化日期:如select date_format(‘2020-11-01 12:12:12’,‘%Y年%m月%d日 %H时%i分%s秒’); 输出:2020年11月01日 12时12分12秒
- str_to_date 字符串转换成日期:如select str_to_date(‘11/01 2020’,‘%m/%d %Y’); 输出:2020-11-01
- DATE_SUB获取前/后N年/月/天/时:如:假设当前时间是2020-11-18 12:41:39 select DATE_SUB(NOW(),INTERVAL -30 day); 输出:2020-12-18 12:41:39
语法:DATE_SUB(date,INTERVAL expr type)
流程控制函数
- if :如select if(3>2,‘是’,‘否’); 输出:是
- case when 条件 then 结果 else 结果2 end :如select id, case when id>3 then ‘A’ when id>2 then ‘B’ when id>1 then ‘C’ else ‘D’ end ff from tuser;
聚合函数
- sum:求和
- avg:平均数
- max:最大值
- min:最小值
- count:计算非空字段值的个数
- 关于count(1)和count(*):
- 开发中需要用到count()聚合,那么优先考虑count(星*),因为mysql数据库本身对于count(*)做了特别的优化处理。
- 有主键或联合主键的情况下,count(*)略比count(1)快一些。
- 没有主键的情况下count(1)比count(*)快一些。
- 如果表只有一个字段,则count(*)是最快的。
- 使用count()聚合函数后,最好不要跟where age = 1;这样的条件,会导致不走索引,降低查询效率。除非该字段已经建立了索引。使用count()聚合函数后,若有where条件,且where条件的字段未建立索引,则查询不会走索引,直接扫描了全表。
- count(字段),非主键字段,这样的使用方式最好不要出现。因为它不会走索引。
其他函数
- FOUND_ROWS :SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了,FOUND_ROWS只能执行上次执行的sql。
9.事务
事务四大特征(ACID)
- 原子性(A):事务是最小单位,不可再分。
- 一致性( C):数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。
- 隔离性(I):事务A和事务B之间具有隔离性。
- 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中。
隔离性(4个级别)
- 读未提交:read uncommitted
事务A和事务B,事务A未提交的数据,事务B可以读取到这里读取到的数据叫做“脏数据”。 - 读已提交:read committed
事务A和事务B,事务A提交的数据,事务B才能读取到。这种级别可以避免“脏数据”,会导致“不可重复读取”。Oracle默认隔离级别。 - 可重复读:repeatable read
事务A和事务B,事务A提交之后的数据,事务B读取不到,事务B是可重复读取数据,比如1点和2点读到数据是同一个,虽然可以达到可重复读取,但是会导致“幻读”。MySQL默认级别 - 串行化:serializable
事务A和事务B,事务A在操作数据库时,事务B只能排队等待,吞吐量太低,用户体验差。
设置事务隔离级别
- 在my.ini文件中使用transaction-isolation选项来设置服务器的缺省事务隔离级别。
[mysql]
transaction-isolation = READ-COMMITTED
- 通过命令:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
其中的<isolation-level>可以是:
– READ UNCOMMITTED
– READ COMMITTED
– REPEATABLE READ
– SERIALIZABLE