run from terminal

mysql -uroot -p
>> 输入密码

attention

  1. 命令、检索均不区分大小写。习惯上将命令关键字大写,也可以通过配置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>;

过滤检索

操作符

  1. =, !=, <, <=, >, >=
  2. <> 相当于!=
  3. BETWEEN a AND b
  4. IS NULL 空值检查
# where 关键字
select <col> from <table> where <col2> = 'lysander';
# 值可以是数值也可以是字符串(用单引号)

SELECT <col> FROM <table> WHERE <col_> BETWEEN 5 AND 10;

逻辑运算符

  1. AND 和,优先级高于OR,可用圆括号()改变优先级
  2. OR
  3. IN,用到圆括号();可实现OR的功能,但速度更快,也有更多其他功能比如包含SELECT语句
  4. NOT 否定它后面的一切条件,可用于找出与条件不匹配的行
SELECT <col> FROM <table> WHERE <col1> IN (3,4,5,6) AND <col2> >= 10;

通配符(模糊匹配)

需要先用LIKE操作符

  1. % 表示任何字符出现任意次数(包括0次)
  2. _ 表示任何字符出现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'字符串结尾的所有数据

todo