run from terminal
mysql -uroot -p
>> 输入密码
attention
- 命令、检索均不区分大小写。习惯上将命令关键字大写,也可以通过配置sql让检索区分大小写
basic
# 显示库列表
show databases;
# 创建新库
create database <d_name>;
# 使用这个库
use <d_name>;
# 显示表列表
show tables;
# 显示列(col)列表
show columns from <table_name>;
describe <col_name>;
select
无序检索
# select关键字
select <col_name1>, <col_name2>, ... from <table_name>;
# a single col is also valid
# * means all (like in python)
select * from <table_name>;
# 从start(index从0开始,默认0,可选参数)开始选length行
select <col_name1>
from <table_name>
limit (start,) length;
# 完全限定
select <table_name>.<col_name>
from <d_name>.<table_name>;
排序检索
# order by 关键字
# 先按col_3排序,如果并列则按col_4
# 默认升序(A-Z),加DESC转换某[一列]为降序
select <col_1>, <col_2> , ...
from <table_name>
order by <col_3> DESC, <col_4>;
过滤检索
操作符
- =, !=, <, <=, >, >=
- <> 相当于!=
- BETWEEN a AND b
- IS NULL 空值检查
# where 关键字
select <col> from <table> where <col2> = 'lysander';
# 值可以是数值也可以是字符串(用单引号)
SELECT <col> FROM <table> WHERE <col_> BETWEEN 5 AND 10;
逻辑运算符
- AND 和,优先级高于OR,可用圆括号()改变优先级
- OR
- IN,用到圆括号();可实现OR的功能,但速度更快,也有更多其他功能比如包含SELECT语句
- NOT 否定它后面的一切条件,可用于找出与条件不匹配的行
SELECT <col> FROM <table> WHERE <col1> IN (3,4,5,6) AND <col2> >= 10;
通配符(模糊匹配)
需要先用LIKE操作符
- % 表示任何字符出现任意次数(包括0次)
- _ 表示任何字符出现exactly一次
# %
# 以str开头的
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'str%';
# 以str结尾的
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%str';
# str在中间的
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%str%';
# 以str1开头,以str2结尾的
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'str1%str2';
# _用法与%相同,也可组合使用
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%str_';
正则表达式
关键字REGEXP(regular expression)
# 基本字符匹配-所有包含'1000'的
SELECT prod_name FROM products WHERE prod_name REGEXP '1000';
# dot表示匹配任意**一个**字符
REGEXP '.000';
# 可见1000和2000都会被筛选出(虽然这个例子里面加不加dot都不会对结果有影响)
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
# OR
REGEXP '1000|2000'
# 匹配几个字符之一
REGEXP '[123] ton'
+-------------+
| prod_name |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+
# 匹配范围
REGEXP '[1-3] ton' # 等价上一句
REGEXP '[a-z]'
# 转义符用//
REGEXP '//.' # 表示检索dot
匹配字符类
- [:alnum:] 任意字母和数字(同[a-zA-Z0-9])
- [:alpha:] 任意字符(同[a-zA-Z])
- [:blank:] 空格和制表(同[\t])
- [:cntrl:] ASCII控制字符(ASCII 0到31和127)
- [:digit:] 任意数字(同[0-9])
- [:graph:] 与[:print:]相同,但不包括空格
- [:lower:] 任意小写字母(同[a-z])
- [:print:] 任意可打印字符
- [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
- [:space:] 包括空格在内的任意空白字符(同[\f\n\r\t\v])
- [:upper:] 任意大写字母(同[A-Z])
- [:xdigit:] 任意十六进制数字(同[a-fA-F0-9])
匹配多个实例
- * 0个或多个匹配
- + 1个或多个匹配(等于{1,})
- ? 0个或1个匹配(等于{0,1})
- {n} 指定数目的匹配
- {n,} 不少于指定数目的匹配
- {n,m} 匹配数目的范围(m不超过255)
# 示例
SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)' order by prod_name;
+----------------+
| prod_name |
+----------------+
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' order by prod_name;
SELECT prod_name FROM products WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]' order by prod_name;
# 两者等价
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
定位符
- ^ 文本的开始
- $ 文本的结尾
- [[:<:]] 词的开始
- [[:>:]] 词的结尾
# 示例
SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
# 查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据