原文链接
基本语句
1. 简单示例
开胃菜
SQL 中语句不区分大小写,例如
mysql> SELECT VERSION(), SIN(PI()/10), (10+3)*5, NOW(), CURRENT_DATE;+-----------+--------------------+----------+---------------------+--------------+| VERSION() | SIN(PI()/10) | (10+3)*5 | NOW() | CURRENT_DATE |+-----------+--------------------+----------+---------------------+--------------+| 5.7.20 | 0.3090169943749474 | 65 | 2017-12-08 14:26:03 | 2017-12-08 |+-----------+--------------------+----------+---------------------+--------------+1 row in set (0.00 sec)复制代码
如果 column 特别多,一行显示不完,折行后看起来杂乱,可以按字段展示,例如
mysql> SELECT VERSION(), SIN(PI()/10), (10+3)*5, NOW(), CURRENT_DATE\G;*************************** 1. row *************************** VERSION(): 5.7.20SIN(PI()/10): 0.3090169943749474 (10+3)*5: 65 NOW(): 2017-12-08 14:30:52CURRENT_DATE: 2017-12-081 row in set (0.00 sec)复制代码
会按照上面的格式,详细的展示每个字段的名称及其值。
取消输入
如果输入了一部分语句需要取消,输入 \c
即可
mysql> SELECT VERSION(), SIN(PI()/10), (10+3)*5, NOW(), CURRENT_DATE\c复制代码
就是看起来这样,什么都不会发生。
2. 数据库
查看数据库列表
mysql> SHOW DATABASES;+-----------------------+| Database |+-----------------------+| information_schema || mysql || performance_schema || sys || test |+-----------------------+7 rows in set (0.01 sec)复制代码
选择 test 数据库
mysql> USE test;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changed复制代码
创建数据库 下面的命令将创建并选择 sample 数据库。
mysql> CREATE DATABASE `sample` DEFAULT CHARACTER SET = `utf8mb4`;Query OK, 1 row affected (0.00 sec)复制代码
这里 character set 采用了 utf8mb4
,方便以后类似 VARCHAR
, LONGTEXT
字段使用 unicode 字符集。
比如要支持 emoji 的话,除了数据库和表的 CHARACTER SET
为 utf8mb4
外,还需要将 MySQL 的参数配置中,修改
character_set_server = utf8mb4复制代码
创建数据库表
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);Query OK, 0 rows affected (0.01 sec)mysql> SHOW TABLES;+------------------+| Tables_in_sample |+------------------+| pet |+------------------+1 row in set (0.00 sec)复制代码
查看 pet 表的结构
mysql> DESCRIBE pet;+---------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+-------------+------+-----+---------+-------+| name | varchar(20) | YES | | NULL | || owner | varchar(20) | YES | | NULL | || species | varchar(20) | YES | | NULL | || sex | char(1) | YES | | NULL | || birth | date | YES | | NULL | || death | date | YES | | NULL | |+---------+-------------+------+-----+---------+-------+6 rows in set (0.01 sec)复制代码
从文件中向表中载入数据。
mysql> LOAD DATA LOCAL INFILE '~/sample_pet.txt' INTO TABLE pet -> LINES TERMINATED BY '\n'复制代码
如果不知道文件换号是什么特殊字符,可以用下面的方式来得到,需要 Python 支持
➜ python3Python 3.6.3 (default, Nov 5 2017, 21:37:14)[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> f = open('1.txt', 'r')>>> print(f)<_io.TextIOWrapper name='1.txt' mode='r' encoding='UTF-8'>>>> print(f.readlines())['1\n', '2\n']复制代码
插入数据
mysql> INSERT INTO pet -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);Query OK, 1 row affected (0.01 sec)复制代码
3. 从表中获取数据
SELECT *FROM PETWEHRE NAME != null;复制代码
4. 通过生日计算年龄
mysql> SELECT name, birth, CURDATE(),-> TIMESTAMPDIFF(YEAR, birth, CURDATE()) AS age -> FROM pet ORDER BY name;复制代码
5. 几种函数
-
YEAR() 获取年
-
MONTH() 获取月份
-
DAYOFMONTH() 获取天
-
DATE_ADD() 例如 DATE_ADD(CURDATE(), INTERVAL 1 MONTH) 当前日期加一个月
-
MOD 取模
mysql> SELECT MOD(13, 11);+-------------+| MOD(13, 11) |+-------------+| 2 |+-------------+复制代码
6. NULL 相关
测试是否为 NULL
- IS NULL
- IS NOT NULL
不能使用 = < <> >
来对 NULL 做布尔判读。
在 GROUP BY 和 ORDER BY 语法中,两个 NULL 会被认为相等。
7. 模式匹配
SELECT * FROM pet WHERE name like 'b%';复制代码
a%
以 a 为前缀a%
以 a 为后缀_
精确匹配 N 个字符,N 与 _ 的数量匹配;例如like '___'
表示精确匹配 3 个字符
支持正则
SELECT * FROM pet WHERE name REGEXP '^b';SELECT * FROM pet WHERE name REGEXP 'b$';SELECT * FROM pet WHERE name REGEXP '.....$'; -- 点表示单个字符SELECT * FROM pet WHERE name REGEXP '.{5}$';复制代码
8. 计数
COUNT(*)
配合 GROUP BY 使用,可以统计每个 field 中,各类值的数量,比如
SELECT d.amount, count(d.amount)FROM data dGROUP BY d.amount;|amount| count(d.amount)||------|----------------|| 1000| 10|| 1200| 9|复制代码
如果想不加 GROUP BY 就可以 SELECT filed_1, count(field_2)
需要将
SET SQL_MODE = 'ONLY_FULL_GROUP_BY';
改为
SET SQL_MODE = '';