创建数据库
create database db_name
创建数据表
create table table_name(...)character set utf8 collate utf8_bin engine innodb
- 设置编码规则 $utf8$, 校验规则 $utf8\_bin$(区分大小写),引擎 $innodb$
$MySql$序列类型
数值类型
- $tinyint$ [ $1$ 个字节 ]
- $smallint$ [ $2$ 个字节 ]
- $mediumint$ [ $3$ 个字节 ]
- $int$ [ $4$ 个字节 ]
- $bigint$ [ $8$个 字节 ]
- 无符号后面添加 $unsigned$
小数类型
- $float$ [ $4$ 个字节 ]
- $double$ [ $8$ 个字节 ]
- $decimal[M,D]$。$M$ 是长度,$D$ 是小数位数
文本类型
- $char(size)$ $[0, 255]$,$size$ 是字符的个数
- $varchar(size)$ $[0, 65535]$,$size$ 是字符的个数。但$varchar$不一定能存放$size$个字符。不同的编码规则下,每个字符所占用的字节不一样。如果是$utf8$会有$1{-}3$个字节表示字符个数,每个字符占 $3$ 个字节,最多存下$(65535{-}3) / 3 = 21844$
- $text$ $[0, 2^{16}-1]$
- $longtext$ $[0, 2^{32}-1]$
二进制数据类型
- $blob$ $[0, 2^{16}-1]$
- $longblob$ $[0, 2^{32}-1]$
日期类型
- $date$ 年月日
- $time$ 时分秒
- $datetime$ 年月日时分秒 $[YYYY-MM-DD HH:mm:ss]$
- $timestamp$ 时间戳
- $not$ $null$ $default$ $current\_timestamp$ $on$ $update$ $current\_timestamp$
- 默认不问空,且为当前时间,再次访问自动更新时间戳
修改表
- 添加列
alter table table_name add()
- 修改列的属性
alter table table_name modify()
- 修改列名
alter table table_name change ...
- 删除列
alter table table_name drop()
- 修改表名
rename table name to new_name
-
$insert$ 语句
insert into table_name (列名)values(属性);
- 一次添加多条数据
insert into table_name (列名)values(属性),(属性),(属性)...;
- 如果是给表中的所有字段添加数据,可以不写前面的字段名称
- 数据表成员可以有默认值
id int not null default 10
id
不为空的情况下默认值是10
- 一次添加多条数据
-
$update$ 语句
update table_name set 列名1 = value1, 列名1 = value1, 列名1 = value1 ...
- 将所有数据的列名上的值全部修改为 $value$
- 修改满足条件的数据使用
while
子句:update table_name set 列名 = value ... while 条件
-
$delete$ 语句
delete from table_name while 条件
删除满足条件的行- $delete$ 只能删除一行记录,而不是表。
- 如果要删除表,使用
drop table
语句,drop table 表名
-
$select$ 语句
select [distinct(去重)] 列1,列2,... from 表名
- 使用表达式对查询的列进行运算
select (列1 + 列2 -...) from 表名
- 使用
as
起别名语句select 列名 as 别名 from 表名
。select (列1 + 列2 -...) as sum from 表名
between ...and...
显示某一区间的值in(set)
显示在in
列表中的值,如in(100, 200)
列名 like 张%
,模糊查询,表示查该列开头是张的。not like "xxx"
%
:表示 $0$或多个字符。_
:表示单个字符
is null
判断空order by column acs|desc
将查询结果按column
升序或降序排序,默认升序。order by
应位于select
语句的结尾count(*)
返回所有行数。count(column)
返回column
不为空的行数sum(column)
统计所有column
的和group by
分组统计select column1, column2... from table group by column
having
对分组后的结果进行过滤select column1, column2... from table group by column having
(where
不可以用作聚合函数的筛选,只能having
)
- 使用表达式对查询的列进行运算
字符串函数
charset(str)
返回字符串str
的字符集concat(str1, str2,...)
连接字符串instr(str1, str2)
查找str2
在str1
中出现的位置,没有返回0
usase(str)
转换成大写lcase(str)
转换成小写length(str)
返回长度replace(str, search_str, replace_str)
将str
中的search_str
替换成str_replace
strcmp(str1, str2)
比较两个字符串是否相等substring(str, pos, length)
从str
的pos
位置开始截取长度为length
的子串ltrim(str)
,rtrim(str)
,trim(str)
去掉str
左边的,右边的,左右两边的空格
时间日期相关函数
current_date()
当前日期current_time
当前时间current_timestamp
当前时间戳date(datetime)
返回datetime
的日期部分
流程控制函数
if(expr1, expr2, expr3)
根据expr1
的布尔值进行三目运算select case when expr1 then expr2 when expr3 then expr4 else expr5 end;
- 类似
if(expr1){expr2} else if(expr3){expr4} .. else {expr5}
- 判断是否为空
colunm is null
- 类似
分页查询
select ... limit start rows
从start + 1
开始取,取rows + 1
行。- 如果
select
语句同时包含group by
,having
,limit
,order by
,那么他们的顺序是group by
,having
,limit
,order by
,不能颠倒
多表查询
- 默认查询两张表时,规则是两张表行的排列组合(笛卡尔集),返回结果包含两张表的所有列
- 解决这个多表的关键就是要写出正确的过滤条件
while
自连接
- 将同一张表看作成两张表进行多表查询
- 需要给表取别名