MySQL数据库语句整理
关系型数据库语言
核心功能
数据定义DLL
CREATE ALTER DROP
数据查询/操纵DML
SELECT INSERT UPDATE DELETE
数据控制DCL
GRANT REVOKE
数据类型
数据类型 | 符号标志 |
---|---|
整数型 | bigint, int, smallint, mediumint, tinyint |
精确数值型 | decimal, numeric |
浮点型 | float, real, double |
位型 | Bit |
字符型 | char, varchar, longvarchar, longtext |
Unicode字符型 | nchar, nvarchar |
BLOB类型 | TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB |
文本型 | text, tinytext |
二进制型 | binary, varbinary |
日期时间类型 | date, time, datetime, timestamp, year |
数据库、表结构操作
数据库操作
建库
-- 基本语句
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
{DATABASE | SCHEMA}:同义,都是建库
[IF NOT EXISTS]:判定数据库是否已经存在
删库
-- 基本语句
DROP DATABASE [IF EXISTS] db_name
[IF EXISTS]:避免删除不存在的数据库
表操作
建表
-- 基本语句
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(
<列名1> <数据类型> [<列选项>],
<列名2> <数据类型> [<列选项>],
…
<表选项>
) [ENGINE= … AUTO_INCREMENT=… DEFAULT CHARSET=…]
[TEMPORARY]:新建的表为临时表,只对创建用户可见,当断开与该数据库的连接时会自动删除
[IF NOT EXISTS]:避免出现表已经存在无法再新建的错误
[ENGINE= …]:数据库的引擎设置,一般默认InnoDB
[AUTO_INCREMENT=…]:自动增长的起始值设置
[DEFAULT CHARSET=…]:数据库的默认字符集,例如utf8,utf8mb4
列选项
- NULL或NOT NULL:表示一列是否允许为空,NULL表示可以为空,NOT NULL表示不可以为空,如果不指定,则默认为NULL。
- DEFAULT default_value:为列指定默认值,默认值default_value必须为一个常量。
- AUTO_INCREMENT:设置自增属性,只有整型列才能设置此属性。当插入NULL值或0到一个AUTO_INCREMENT列中时,列被设置为value+1,value是此前表中该列的最大值。AUTO_INCREMENT顺序从1开始。每个表只能有一个AUTO_INCREMENT列,并且它必须被索引。
- UNIQUE KEY | PRIMARY KEY:UNIQUE KEY和PRIMARY KEY都表示字段中的值是唯一的。PRIMARY KEY表示设置为主键,一个表只能定义一个主键,主键必须为NOT NULL。
- COMMENT 'string':对于列的描述,string是描述的内容。
表选项
- PRIMARY KEY(col_name,…):定义多列索引
- 定义索引和外键
删表
-- 基本语句
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
[TEMPORARY]:删除的表为临时表
[IF EXISTS]:避免出现表不存在无法删除的错误
改表
-- 基本语句
ALTER TABLE table_name
ADD <列名> <数据类型> <列选项>
/*添加列*/
ALTER <列名> {SET DEFAULT default_value | DROP DEFAULT}
/*修改默认值*/
CHANGE <旧列名> <新列名> <数据类型> <列选项>
/*对列重命名*/
MODIFY <列名> <数据类型> <列选项>
/*修改列类型*/
DROP <列名>
/*删除列*/
RENAME <新表名>
/*重命名该表*/
...
数据操作
数据操纵
数据插入
-- 基本语句
INSERT [INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
-- 如果可能存在冲突,如已有相同主键,可以采用
REPLACE [INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
如果列清单和VALUES清单都为空,则INSERT会创建一行,每列都设置成默认值
{expr | DEFAULT}:
- expr:是一个常量、变量或一个表达式,也可以是空值NULL。当数据为字符型时要用单引号括起。
- DEFAULT:指定为该列的默认值。
数据修改
-- 基本语句
UPDATE tbl_name;
SET col_name1=expr1 [,col_name2=expr2 ..]
[WHERE where_definition]
数据删除
-- 基本语句
DELETE FROM tbl_name
[WHERE where_definition]
-- 清除所有数据
TRUNCATE TABLE table_name
数据查询
SELECT
[ALL | DISTINCT ]
select_expr, ...
[FROM table1 [ , table2] …] /*FROM子句*/
[WHERE where_definition] /*WHERE子句*/
[GROUP BY {col_name | expr | position} [ASC | DESC], ...]
/*GROUP BY子句*/
[HAVING where_definition] /*HAVING子句*/
[ORDER BY {col_name | expr | position}[ASC | DESC] , ...]
/*ORDER BY子句*/
[LIMIT {[offset,] row_count}] /*LIMIT子句*/
查询对象
FROM KCB {INNER|[NATURAL] [LEFT|RIGHT] OUTER|CROSS} JOIN CJB
ON (KCB.课程号=CJB.课程号)
-- INNER JOIN 内连接
-- [LEFT|RIGHT] OUTER JOIN 左右外连接
-- NATIONAL JOIN 自然连接,可以省略OUTER
-- 交叉连接,进行笛卡儿积,MySQL中与INTER相同
FROM KCB CROSS JOIN CJB
查询条件
比较运算
运算对象
除TEXT和BLOB外类型的表达式
运算符
=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<=>(相等或都等于空)、<>(不等于)、!=(不等于)
逻辑运算符
运算对象
BOOL型
运算符
AND \ OR \ NOT
模式匹配
运算对象
char、varchar、text、datetime
运算方式
match可使用特殊符号"_"和"%":“%”代表0个或多个字符。“_”代表单个字符
expression [ NOT ] LIKE match_expression
正则表达式
语法:
expression [ NOT ][ REGEXP | RLIKE ] match_expression
-- 例子
select 'xxxyy' regexp '^xx' -- TRUE
表达:
特殊字符 | 含 义 |
---|---|
^ | 匹配字符串的开始部分 |
$ | 匹配字符串的结束部分 |
. | 匹配任何一个字符(包括回车和换行) |
* | 匹配星号之前的0个或多个字符的任何序列 |
+ | 匹配加号之前的1个或多个字符的任何序列 |
? | 匹配问号之前0个或多个字符 |
匹配括号前的内容出现n次的序列 | |
() | 匹配括号里的内容 |
[abc] | 匹配方括号里出现的字符串abc |
[a-z] | 匹配方括号里出现的a~z之间的一个字符 |
[^a-z] | 匹配方括号里出现的不在a~z之间的一个字符 |
| | 匹配符号左边或右边出现的字符串 |
[[. .]] | 匹配方括号里出现的符号(如空格、换行、括号、句号、冒号、加号、连字符等) |
[[:<:]和[[:>:]] | 匹配一个单词的开始和结束 |
[[: :] | 匹配方括号里出现的字符中的任意一个字符 |
范围比较
语法:
-- 位于二者之间
expression [ NOT ] BETWEEN expression1 AND expression2
-- 位于枚举中
expression IN ( expression [,…n])
空值比较
语法:
-- 判定是否为空
expression IS [ NOT ] NULL
列子查询
IN嵌套查询
-- subquery为子查询
expression [ NOT ] IN ( subquery )
比较子查询
expression { < | <= | = | > | >= | != | <> } { ALL | SOME | ANY } ( subquery )
ALL:指定表达式要与子查询结果集中的每个值进行比较,当表达式与每个值都满足比较的关系时,才返回TRUE
SOME|ANY:只要与子查询结果集中的某个值满足比较的关系时,就返回TRUE
存在子查询
-- 结果有元组则为存在
[ NOT ] EXISTS ( subquery )
表子查询
-- FROM后子查询
FROM( SELECT ... ) AS tablename
-- SELECT后子查询
SELECT select_expr-select_expr(
SELECT ...
) AS tablename ...
数据分组
聚合函数
配合使用:
SELECT
[COUNT ({[ ALL | DISTINCT ] expression }|*)]
[MAX / MIN ( [ ALL | DISTINCT ] expression)]
[SUM / AVG ( [ ALL | DISTINCT ] expression)]
...
GROUP BY {col_name | expr | position} [ASC | DESC], ...
HAVING where_expr
函 数 名 | 说 明 |
---|---|
COUNT | 求组中项数,返回int类型整数 |
MAX | 求最大值 |
MIN | 求最小值 |
SUM | 返回表达式中所有值的和 |
AVG | 求组中值的平均值 |
STD或STDDEV | 返回给定表达式中所有值的标准差 |
VARIANCE | 返回给定表达式中所有值的方差 |
GROUP_CONCAT | 返回由属于一组的列值连接组合而成的结果 |
BIT_AND | 逻辑或 |
BIT_OR | 逻辑与 |
BIT_XOR | 逻辑异或 |
排序
ORDER BY {col_name | expr | position} [ASC | DESC] , ...
ASC:升序,默认
DESC:降序
限制返回行数
用于限制SELECT语句返回的行数
LIMIT {[offset,] row_count }
offset:开始行数,0为起点
row_count:返回总行数
视图操作
创建视图
CREATE VIEW view_name [(column_list)]
AS select_statement
view_name:视图名称
column_list:视图列名,未明确时与表相同
select_statement:用于建立视图的SELECT语句
删除视图
DROP VIEW [IF EXISTS] view_name [, view_name] ...
查询视图
与基本表相同
编程基础
常量
- 字符串
用单引号或双引号括起来的字符序列
为了便于区分,在MySQL中推荐使用单引号表示字符串
- 数值常量
- 日期时间常量
符合特殊格式的字符串,必须符合日期、时间标准
- 布尔值
true / false,SELECT中表示为'0'与'1'
- 二进制常量
前缀为“b”,后面紧跟一个“二进制”字符串
- 十六进制常量
[两种表示法之一]:前缀为大写字母“X”或小写字母“x”,后面紧跟一个“十六进制”字符串
[两种表示法之二]:前缀为“0x”,后面紧跟一个“十六进制数”(不用引号)
select hex('MySQL'); -- 字符串转换为十六进制数
- NULL
适用于各种字段类型,参与算术、比较及逻辑运算时,结果依然为NULL
变量
变量名大小写不敏感
系统会话变量
以@@开头的变量,无需定义直接使用
用户会话变量
以@开头,会话期间一直有效
定义方式
等号右边的值(包括字符集和字符序)决定了用户会话变量的数据类型(包括字符集和字符序)
-- 使用set命令定义赋值
set @user_variable1=expression1 [,@user_variable2= expression2 , …]
-- [有输出]使用select命令定义赋值
-- 注意,使用的是':=',以区别于比较运算符
select @user_variable1:=expression1 [,user_variable2:= expression2 , …]
-- [无输出]使用select into命令定义赋值
select expression1[, expression2 , …] into @user_variable1 [,@user_variable2,…]
局部变量
不以@开头
- 作为存储过程或者函数的参数,在整个存储过程或函数内中有效
- 作用范围在BEGIN...END模块中,使用set或select为其赋值
定义方式
DECLARE var_name [, var_name] ... type [DEFAULT value]
[DEFAULT value]:默认值,无则默认为NULL
运算符
算数运算符
+(加)、-(减)、*(乘)、/(除)、%(求余)以及div(求商)
比较运算符
运算符 | 含义 |
---|---|
= | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
<>、!= | 不等于 |
<=> | 相等或都为空 |
is null | 是否为NULL值 |
between...and... | 是否在区间内 |
in | 是否在集合中 |
like | 模式匹配 |
regexp | 正则表达式模式匹配 |
逻辑运算符
运算符 | 含义 |
---|---|
not、! | 逻辑非 |
and、&& | 逻辑与 |
or、|| | 逻辑或 |
xor | 逻辑异或 |
位运算符
对二进制数据进行操作(非二进制类型数会自动转换)
运算符 | 运算规则 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
>> | 位右移 |
<< | 位左移 |
重置命令结束标记
-- 示例
DELIMITER $$
SELECT * FROM US$$
DELIMITER ;
SELECT * FROM US;
BEGIN...END
用于包裹代码块
BEGIN
[局部]变量的声明;
错误触发条件的声明;
游标的声明;
错误处理程序的声明;
业务逻辑代码;
END
流程控制
IF语句
不要漏了;
if 条件表达式1 then 语句块1;
[elseif 条件表达式2 then语句块2] ...
[else语句块n]
end if;
CASE语句
无break
case 表达式
when value1 then 语句块1;
when value2 then 语句块2;
…
else 语句块n;
end case;
循环语句
-- while,表达式为真时循环
[循环标签:]while 条件表达式 do
循环体;
end while [循环标签];
-- 跳出循环
leave 循环标签;
-- repeat,表达式为假时循环
[循环标签:]repeat
循环体;
until 条件表达式
end repeat [循环标签];
-- loop,无条件循环
[循环标签:] loop
循环体;
if 条件表达式 then
leave [循环标签];
end if;
end loop;
MySQL函数
数学函数
-- 圆周率
pi()
-- 角度->弧度 弧度->角度
radians(x) degrees(x)
-- 三角函数
sin(x) cos(x) tan(x) cot(x)
asin(x) acos(x) atan(x)
-- 指数函数 x^(-1/2) x^y e^x
sqrt(x) pow/power(x,y) exp(x)
-- 对数函数 loge log10
log(x) log10(x)
-- 近似值函数
round(x) -- 离x最近的整数
round(x,y) -- 离x最近的小数(小数点后保留y位)
truncate(x,y) -- 小数点后保留y位的x(舍去)
-- 随机函数
rand()
-- 进制转化
bin(x) -- 转二进制
oct(x) -- 转八进制
hex(x) -- 转十六进制
ascii(x) -- 字符的ASCII码
char(x1,x2...) -- 将一串ASCII码转成字符串
conv(x,c1,c2) -- 将c1进制转c2进制
字符串函数
-- 基本信息函数
charset(x) -- 返回x的字符集
collation(x) -- 返回x的字符序
convert(x using charset) -- 返回x的charset字符集数据(注意x的字符集没有变化)
-- 长度函数
char_length(x) -- 获取字符串x的长度
length(x) -- 获取字符串x的占用的字节数
-- 加密函数
-- 不可逆加密
password(x) -- 返回41位的加密字符串
md5(x) -- 返回32位的加密字符串
-- 可逆加密,key为加密密钥
-- 返回二进制数
encode(x,key) decode(password, key)
-- 返回128位二进制数
aes_encrypt(x,key) aes_decrypt(password,key)
-- 连接
concat(x1,x2,….) -- 将x1、x2连接成一个新字符串
concat_ws(x,x1,x2,….) -- 用x将x1、x2连接成新串
-- 修剪
-- 去空格 开头/结尾/开头与结尾
ltrim(x) rtrim(x) trim(x)
-- 从x2字符串的前缀或者(以及)后缀中去掉字符串x1
trim([leading | both | trailing] x1 from x2)
left(x,n) righ(x,n) -- 截取前/后n个字符
upper(x) ucase(x) -- 返回所有大写
lower(x) lcase(x) -- 返回所有小写
lpad(x1,len,x2) -- x2填充到x1的开始处,使x1长len
rpad(x1,len,x2) -- x2填充到x1的结尾处,使x1长len
-- 操作
-- 从x的第n个位置开始获取length长度的字符串
substring(x,start,length)
mid(x,start,length)
-- 从字符串x2中获取x1的开始位置
locate(x1,x2) position(x1 in x2) instr(x2,x1)
-- x2为逗号分割的串,返回x1在第几个
find_in_set(x1,x2)
-- x1中从start位置开始、长为length的子串替换为x2
insert(x1,start,length,x2)
-- x3替换x1中所有出现的字符串x2
replace(x1,x2,x3)
-- 复制
repeat(x,n) -- x的n次复制串
space(n) -- 空格字符的n次复制
-- 比较 大于~1,小于~-1,等于~0
strcmp(x1,x2)
-- 逆序
reverse(x)
数据类型转化函数
-- 返回x转type结果
convert(x,type) cast(x as type)
unhex(x) -- 十六进制字符串转换为十六进制数
条件控制函数
if(condition,v1,v2) -- condition?v1:v2
ifnull(v1,v2) -- v1 is null?v2:v1
系统信息函数
version() -- @@version,MySQL版本号
connection_id() -- @@pseudo_thread_id,连接ID
database() schema() -- 获取当前操作的数据库
-- 获取通过哪一台登录主机、使用什么账户名成功连接MySQL服务器
user() system_user() session_user()
-- 该账户名允许通过哪些登录主机连接MySQL服务器
current_user()
日期和时间函数
-- 返回值与时区的设置有关
-- 服务器当前日期或时间函数
curdate() current_date() -- 服务器当前日期
curtime() current_time() -- 服务器当前时间
-- 服务器当前日期和时间,允许传递一个整数(<=6)作为参数,从而获取更为精确的时间信息
now() current_timestamp() localtime() sysdate()
-- 服务器当前UNIX时间戳函数
unix_timestamp() -- 服务器当前UNIX时间戳
-- 将日期时间datetime以UNIX时间戳返回
unix_timestamp(datetime)
-- 将UNIX时间戳以日期时间格式返回
from_unixtime(timestamp)
-- [世界时间]服务器当前UTC日期和时间函数
utc_date() -- 获取UTC日期
utc_time() -- 获取UTC时间
-- 获取日期或时间x的某一具体信息的函数
year(x) month(x) dayofmonth(x) hour(x) minute(x) second(x) microsecond(x)
-- type=[year,month,day,hour,minute,second, microsecond]
extract(type from x)
monthname(x) -- x的月份信息
dayname(x) weekday(x) -- x的星期信息
dayofweek(x) -- x是本星期的第几天,星期日为第一天
quarter(x) -- x在本年是第几季度
week(x) weekofyear(x) -- x在本年是第几个星期
dayofyear(x) -- x在本年是第几天
-- 时间和秒数之间的转换函数
time_to_sec(x) -- x在当天的秒数
sec_to_time(x) -- 当天的秒数x对应的时间
-- 日期间隔、时间间隔函数
to_days(x) -- x距离0000年1月1日的天数
from_days(x) -- 从0000年1月1日开始n天后的日期
datediff(x1,x2) -- x1与x2之间的相隔天数
adddate(d,n) -- 起始日期d加上n天的日期
subdate(d,n) -- 起始日期d减去n天的日期
addtime(t,n) -- 起始时间t加上n秒的时间
subtime(t,n) -- 起始时间t减去n秒的时间
-- 指定日期date指定间隔的日期
date_add(date,interval 间隔 间隔类型)
date_add('2019-4-30',INTERVAL '2' day) -- 例子
间隔类型 | 说明 | 格式 |
---|---|---|
microsecond | 微秒 | 间隔的微秒数 |
second | 秒 | 间隔的秒数 |
minute | 分钟 | 间隔的分钟数 |
hour | 小时 | 间隔小时数 |
day | 天 | 间隔天数 |
week | 星期 | 间隔星期数 |
month | 月 | 间隔月数 |
quarter | 季度 | 间隔季节数 |
year | 年 | 间隔年数 |
second_microsecond | 秒和微秒 | 秒.微秒 |
minute_microsecond | 分钟和微秒 | 分钟:秒.微秒 |
minute_second | 分钟和秒 | 分钟:秒 |
hour_microsecond | 小时和微秒 | 小时:分钟:秒.微秒 |
hour_second | 小时和秒 | 小时:分钟:秒 |
hour_minute | 小时和分钟 | 小时:分钟 |
day_microsecond | 日期和微秒 | 天 小时:分钟:秒.微秒 |
day_second | 日期和秒 | 天 小时:分钟:秒 |
day_minute | 日期和分钟 | 天 小时:分钟 |
day_hour | 日期和小时 | 天 小时 |
year_month | 年和月 | 年_月 |
time_format(t,f) -- 表达式f的要求显示时间t
格式 | 说明 |
---|---|
%H | 小时(00...23) |
%k | 小时(0...23) |
%h | 小时(01...12) |
%\(I\) | 小时(01...12) |
%\(l\) | 小时(1...12) |
%i | 分钟,数字(00...59) |
%r | 时间,12小时(hh:mm:ss [AP]M) |
%T | 时间,24小时(hh:mm:ss) |
%S | 秒(00...59) |
%s | 秒(00...59) |
%p | [AP]M |
date_format(d,f) -- 按照表达式f显示日期和时间t
格式 | 说明 |
---|---|
%W | 星期名字(Sunday...Saturday) |
%D | 有英语前缀的月份的日期(1st, 2nd,3rd等等) |
%Y | 年,数字,4位 |
%y | 年,数字,2位 |
%a | 缩写的星期名字(Sun....Sat) |
%d | 月份中的天数,数字(00...31) |
%e | 月份中的天数,数字(0...31) |
%m | 月,数字(01...12) |
%c | 月,数字(1...12) |
%b | 缩写的月份名字(Jan....Dec) |
%j | 年中的天数(001...366) |
%w | 一个星期中的天数(0=Sunday ...6=Saturday) |
%U | 星期(0...52),这里星期天是星期的第一天 |
%u | 星期(0...52),这里星期一是星期的第一天 |
%% | 一个文字“%” |
其他常用函数
-- 最后一次insert或update语句设置的自增字段值
-- 用户自己指定非自动生成的,则返回0
-- 若有多行只返回第一条记录的自增字段值
-- 与表无关,只与最终值有关
last_insert_id() -- @@last_insert_id的值一致
inet_aton(ip) -- IP地址(字符串数据)转换为整数
inet_ntoa(n) -- 整数转换为IP地址(字符串数据)
-- 将表达式expression重复执行n次,返回结果为0
benchmark(n,expression)
uuid() -- 生成一个128位的通用唯一识别码UUID
UUID码由5个段构成
- 前3个段与服务器主机的时间有关(精确到微秒)
- 第4段是随机数,当前的服务实例不会变化,除非重启
- 第5段是通过网卡MAC地址转换得到
数据库对象
存储过程
创建
CREATE PROCEDURE sp_name ([[ IN | OUT | INOUT ] param_name type [,...]])
<routine_body>
[ IN | OUT | INOUT ]:指定变量输入或返回
<routine_body>:BEGIN...END代码块
删除
DROP PROCEDURE [IF EXISTS] sp_name
调用
CALL sp_name([param[,...]])
存储函数
- 不能拥有输出参数
- 不能用CALL语句来调用
- 必须包含一条RETURN语句
创建
CREATE FUNCTION sp_name ([参数[,...]])
RETURNS type
begin
函数体;
return 语句;
end;
删除
修改时先删除再创建即可
DROP FUNCTION sp_name
调用
sp_name ([param[,...]])
SELECT NAME_OF_STU('081102'); -- 例子
维护
-- 服务器级别
show function status; -- 所有的自定义函数信息
show function status like 模式; -- 模糊查询
-- 数据库级别
select name from mysql.proc where db = 'choose' and type = 'function' ;
-- 函数详细信息查询
show create function 函数名;
-- 函数信息保存在information_schema.routines表中
select * from information_schema.routines where routine_name='函数名'
触发器
CREATE
[DEFINER = user]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
-- 确定在触发激活时检查访问权限
DEFINER = user
-- 触发先后
trigger_time: { BEFORE | AFTER }
-- 操作名
trigger_event: { INSERT | UPDATE | DELETE }
-- 与其他触发器相对先后
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
-- BEGIN...END函数体
trigger_body
NEW与OLD表
内涵
- 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据
- 在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据
- 在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据
赋值
- OLD 是只读的
- NEW 则可以在触发器中直接使用 SET 赋值,这样不会因使用UPDATE再次触发触发器,造成循环调用
©️ Copyrights.RSMX.GUILIN.2020-05-06