MySQL 速查手册

mysql handbook

Posted by Randle on November 26, 2020

数据库使用

#登录
mysql -u ben -p -h myserver -P 999

#显示数据库列表
show databases;

#选择数据库
use $DB_NAME

#显示表
show tables;

#显示表列,以下写法相同
show columns from $table_name
describe $table_name
desc $table_name

#SHOW
#显示广泛的服务器状态信息
show status 
show create database $database_name
show create table $table_name

#显示授予用户(所有用户或特定用户)的安全权限
show grants

#显示服务器错误或警告信息
show errors
show warnings

检索数据

检索不同的列:

#单列
select c1 from $table_name;

#多列
select c1,c2 from $table_name;

#所有列
select * from $table_name;

#不同行
select DISTINCT c1 from $table_name;

#完全限定表明
select $table_name.c1 from $db_name.table_name;

限制结果

#前5行
select c1 from $table_name limit 5;

#从行5开始的5行
select c1 from $table_name limit 5,5;

排序

#单列排序
select c1 from $table_name order by c1;

#多列排序
select c1,c2,c3 from $table_name order by c1,c2;

#排序方向,默认升序(ASC),可指定降序(DESC)
select c1 from $table order by c1 DESC,c2;

过滤

where

select c1 from $table where c1='';

where 字句操作符:

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的两个值之间

between使用:

select c1 from $table where c1 BETWEEN 1 AND 2;

空值检查

select c1 from $table where c1 IS NULL;

组合where字句

#and
select c1 from $table where c1 =1 and c2=2;

#or
select c1 from $table where c1 =1 or c2=2;

#IN
select c1 from $table where c1 in (1,2);

#NOT
select c1 from $table where c1 NOT IN (1,2);

#LIKE 通配符
#%通配符,任意字符
select c1 from $table where c1 LIKE '%a%';

#_下划线通配符,单个字符
select c1 from $table where c1 LIKE '_kile';

在搜索串中,%表示任何字符出现任何次数。_下划线通配符匹配单个字符。

正则表达式

关键词:REGEXP

#基本字符匹配
select c from $table where c1 regexp '1000' order by c1;

MySql中的正则表达式,默认不区分大小写,如果要区分的话,可以加BINARY参数。

select prod_name from table where prod_name regexp binary 'JetPack .000';

OR 匹配。

where prod_name regexp '1000|2000';

[],几个字符之一。

where prod_name regexp '[123] ton';

字符集和否定

#匹配非这些字符
[^123]

字符集合

[123456]
[1-6]
[a-z]

特殊字符,需要转义。

.表示匹配任何单个字符,\\.表示匹配单个字符.

特殊字符 说明
. 任何单个字符
[] 匹配字符集中的任意字符
[^] 匹配非字符集中的任意字符
|

空白元字符:

元字符 说明
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表

为了匹配反斜杠\本身,也需要两个反斜杠,就变成三个反斜杠\\\

多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身,但MySQL要求两个反斜杠(MySQL子机解释一个,正则表达式库解释一个)。

字符类

说明
[:alnum:] 任意字母和数字(同[a-zA-Z0-9])
[:alpha:] 任意字母(同[a-zA-Z])
[:blank:] 空格和制表(\\t
[:cncrl:] ASCII控制字符,(ASCII 0到31和127)
[:digit:] 任意数字(同[0-9])
[:print:] 任意可打印字符
[:graph:] 与[:print:]相同,但不包括空格
[:lower:] 任意小写字母([a-z])
[:upper:] 任意大写字母([A-Z])
[:punct:] 既不在[:alnum:]又不在[:cncrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符([\\f\\n\\r\\t\\v])
[:xdigit:] 任意十六进制数字([a-fA-F0-9])

匹配多个实例:

元字符 说明
* 0个或多个
+ 1个或多个(等于{1,})
? 0个或1个(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)

定位符:

元字符 说明
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾

计算字段

拼接

#Concat
select Concat(vendor_name,'(',vendor_country,')') from vendors order by vendor_name;

#RTrim()
select Concat(RTrim(vendor_name),'(',vendor_country,')') as vend_title from vendors order by vendor_name;

Trim函数,RTrim() 去掉串右边的空格,LTrim() 去掉串左边的空格。

MySQL 支持很多函数,参考:https://www.runoob.com/mysql/mysql-functions.html

算数运算

select quantity*item_price as expanded_price from orderitems;

MySQL 算数操作符

操作符 说明
+
-
*
/

数据处理函数

汇总数据

分组数据

子查询

联结表

组合查询

全文本搜索

插入数据

插入完整行

insert into $table values(c1_value,c2_value,c3_value,c4_value...);

#更安全的方法
insert into $table(c1,c2,c3) values(c1_value,c2_value,c3_value);

#插入多行
insert into $table(c1,c2,c3) values(c1_value,c2_value,c3_value),(c1_value2,c2_value2,c3_value2);

插入检索出的数据

insert into $table(c1,c2) select b1,b2 from $table2;

更新删除

更新表项

update $table set c1='' where c2=2;
update $table set c1='1',c2='2' where c3='3';

删除

delete from $table where id=1;

delete 不需要列名或通配符。delete删除整行而不是删除列。为了删除指定的列,请使用update。delete 删除表的内容,但是不删除表本身。

从表中删除所有行,有一个更快的替代命令

truncate table $table

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

TRUNCATE TABLE 不能用于参与了索引视图的表。

对用TRUNCATE TABLE删除数据的表上增加数据时,要使用UPDATE STATISTICS来维护索引信息。

创建操纵表