第 1.1 节:入门
在 MySQL 中创建数据库
sql
CREATE DATABASE mydb;
返回值:
Query OK, 1 row affected (0.05 sec)
使用已创建的数据库 mydb
sql
USE mydb;
返回值:
Database changed
在 MySQL 中创建表
sql
CREATE TABLE mytable (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE mytable将创建一个名为mytable的新表。id INT UNSIGNED NOT NULL AUTO_INCREMENT创建id列,这种类型的字段会为表中的每条记录分配一个唯一的数字 ID(即任意两行不能有相同的id),MySQL 会自动为记录的id字段分配一个新的唯一值(从 1 开始)。
返回值:
Query OK, 0 rows affected (0.10 sec)
向 MySQL 表中插入一行
sql
INSERT INTO mytable (username, email) VALUES ("myuser", "myuser@example.com");
返回值示例:
Query OK, 1 row affected (0.06 sec)
字符串(varchar)也可以用单引号插入:
sql
INSERT INTO mytable (username, email) VALUES ('username', 'username@example.com');
更新 MySQL 表中的一行
sql
UPDATE mytable SET username="myuser" WHERE id=8;
返回值示例:
Query OK, 1 row affected (0.06 sec)
整数类型的值在查询中可以不用引号。字符串和日期必须用单引号 ' 或双引号 " 括起来。
删除 MySQL 表中的一行
sql
DELETE FROM mytable WHERE id=8;
返回值示例:
Query OK, 1 row affected (0.06 sec)
这将删除 id 为 8 的行。
基于条件从 MySQL 表中查询行
sql
SELECT * FROM mytable WHERE username = "myuser";
返回值:
+----+----------+---------------------+
| id | username | email |
+----+----------+---------------------+
| 1 | myuser | myuser@example.com |
+----+----------+---------------------+
1 row in set (0.00 sec)
显示现有数据库列表
sql
SHOW DATABASES;
返回值:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
+--------------------+
2 rows in set (0.00 sec)
你可以把 information_schema 看作一个"主数据库",它提供了对数据库元数据的访问。
显示现有数据库中的表
sql
SHOW TABLES;
返回值:
+----------------+
| Tables_in_mydb |
+----------------+
| mytable |
+----------------+
1 row in set (0.00 sec)
显示表的所有字段
sql
DESCRIBE databaseName.tableName;
或者,如果已经使用了某个数据库:
sql
DESCRIBE tableName;
返回值:
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| fieldname| fieldvaluetype | NO/YES | keytype | defaultfieldvalue| auto_increment |
+----------+------------------+------+-----+---------+----------------+
n rows in set (0.00 sec)
Extra可能包含auto_increment等。Key指的是可能影响字段的键类型,例如主键(PRI)、唯一键(UNI)等。
创建用户
首先,你需要创建一个用户,然后授予该用户对某些数据库/表的权限。创建用户时,还需要指定该用户可以从哪里连接。
sql
CREATE USER 'user'@'localhost' IDENTIFIED BY 'some_password';
这将创建一个只能从数据库所在本地机器连接的用户。
sql
CREATE USER 'user'@'%' IDENTIFIED BY 'some_password';
这将创建一个可以从任何地方(除了本地机器)连接的用户。
返回值示例:
Query OK, 0 rows affected (0.00 sec)
添加权限
为指定数据库的所有表授予常用基本权限:
sql
GRANT SELECT, INSERT, UPDATE ON databaseName.* TO 'userName'@'localhost';
为用户授予所有数据库的所有表的所有权限(请谨慎使用此操作):
sql
GRANT ALL ON *.* TO 'userName'@'localhost' WITH GRANT OPTION;
如上所示,*.* 针对所有数据库和表,databaseName.* 针对特定数据库的所有表。也可以指定具体的数据库和表,如 databaseName.tableName。
如果用户不需要能够授予其他用户权限,则应省略 WITH GRANT OPTION。
权限可以是 ALL,也可以是以下权限的组合(非穷举列表),每个权限之间用逗号分隔:
SELECTINSERTUPDATEDELETECREATEDROP
注意
通常,应尽量避免使用包含空格或 SQL 保留字的列名或表名。例如,最好避免使用 table 或 first name 这样的名称。
如果必须使用此类名称,请将它们放在反引号分隔符中。例如:
sql
CREATE TABLE `table` (
`first name` VARCHAR(30)
);
对该表执行包含反引号分隔符的查询可能如下:
sql
SELECT `first name` FROM `table` WHERE `first name` LIKE 'a%';
第 1.2 节:信息模式示例
进程列表
这将按信息降序、时间升序显示所有活动及休眠中的查询。
sql
SELECT * FROM information_schema.PROCESSLIST ORDER BY INFO DESC, TIME DESC;
以下查询提供了更详细的时间信息(默认单位为秒):
sql
SELECT ID, USER, HOST, DB, COMMAND,
TIME AS time_seconds,
ROUND(TIME / 60, 2) AS time_minutes,
ROUND(TIME / 60 / 60, 2) AS time_hours,
STATE, INFO
FROM information_schema.PROCESSLIST
ORDER BY INFO DESC, TIME DESC;
存储过程搜索
可以轻松地在所有存储过程中搜索单词和通配符。
sql
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_DEFINITION LIKE 'word%';