SQL 语句主要分为以下 3 个类别:
是对数据库内部的对象进行创建、删除、修改的操作语句,它与 DML 语句的最大区别在于 DML 语句只是对表的内部数据的操作,而不涉及到表的定义、结构的修改。
CREATE DATABASE 数据库名称;
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
如果想要知道系统中有哪些数据库,可以使用 show databases 命令查询:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| li |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
6 rows in set (0.00 sec)
可以使用下面的命令选择要操作的数据库:
USE 数据库名称;
mysql> use li;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
查看数据库中的表:
mysql> show tables;
+--------------+
| Tables_in_li |
+--------------+
| customers |
| orderitems |
| orders |
| productnotes |
| products |
| vendors |
+--------------+
6 rows in set (0.00 sec)
DROP DATABASE 数据库名称;
mysql> drop database test1;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| li |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
CREATE TABLE 表名(列名1 数据类型 列的约束条件,
......
);
例如,创建一个名称为 emp 的表。其中包括 3 个字段,ename(姓名),hiredate(雇用日期),sal(薪水),depno(部门编号),字段类型分别为 varchar(10),date,DECIMAL(10,2),int(2):
mysql> CREATE TABLE emp(ename VARCHAR(10),
hiredate date,
sal DECIMAL(10,2),
deptno INT(2));
建表完成后,可使用 desc 命令查看建表的详细信息:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
为了查看表的更加详细的信息,可以通过创建表的 SQL 语句来查看:
mysql> show create table emp;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| emp | CREATE TABLE `emp` (
`ename` varchar(10) DEFAULT NULL,
`hiredate` date DEFAULT NULL,
`sal` decimal(10,2) DEFAULT NULL,
`deptno` int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
除了表的定义以外,还可以看到表的 engine(存储引擎)和 charset(字符集)等信息。
DROP TABLE 表名;
mysql> drop table emp;
Query OK, 0 rows affected (0.00 sec)
ALTER TABLE 表名 MODIFY [COLUMN] 列名 约束 [FIRST|AFTER col_name]
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(10) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
#修改表 emp 的 ename 字段定义,改为 varchar(20)
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
ALTER TABLE 表名 ADD [COLUMN] 列名 约束 [FIRST|AFTER col_name]
#增加一个 age 字段,数据类型为 int(3)
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
ALTER TABLE 表名 DROP [COLUMN] 列名
mysql> alter table emp drop age;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
ALTER TABLE 表名 CHANGE [COLUMN] 旧列名 新列名 约束 [FIRST|AFTER col_name]
mysql> alter table emp change deptno deptnumber int(4);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptnumber | int(4) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
在前面的语句中有一个选项:[FIRST|AFTER col_name],这个选项可以用来修改字段在表中的位置。
#将新增的字段 dirth date 加在 ename 之后
mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptnumber | int(4) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
#修改字段 dirth,将它放在最前面
mysql> alter table emp change birth birthday date first;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| birthday | date | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptnumber | int(4) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
ALTER TABLE 旧表名 RENAME [TO] 新表名
mysql> alter table emp rename emp_new;
Query OK, 0 rows affected (0.00 sec)
mysql> desc emp;
ERROR 1146 (42S02): Table 'li.emp' doesn't exist
mysql> desc emp_new;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| birthday | date | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptnumber | int(4) | YES | | NULL | |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
DML 语句是指对数据库中表的记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select)。
INSERT INTO 表名(列名1,列名2,...,列名n) VALUES(值1,值2,...,值n)
#先把表名改回来
mysql> alter table emp_new rename emp;
Query OK, 0 rows affected (0.00 sec)
#插入数据
mysql> insert into emp(ename,hiredate,sal,deptnumber) values('zzxl','2000-01-01','2000',1);
Query OK, 1 row affected (0.00 sec)
mysql> alter table emp drop birthday;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
#没有赋值的字段,默认为 NULL、默认值、自增的下一个数字
mysql> insert into emp(ename,sal) values('dony',1000);
Query OK, 1 row affected (0.00 sec)
#也可以不指定列名,但 values 后面的顺序应该和字段顺序一致
mysql> insert into emp values('lisa','2003-02-01','3000',2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from emp;
+-------+------------+---------+------------+
| ename | hiredate | sal | deptnumber |
+-------+------------+---------+------------+
| zzxl | 2000-01-01 | 2000.00 | 1 |
| dony | NULL | 1000.00 | NULL |
| lisa | 2003-02-01 | 3000.00 | 2 |
+-------+------------+---------+------------+
3 rows in set (0.00 sec)
在 Mysql 中,insert 还可以一次性插入多条记录:
INSERT INTO 表名(列名1,列名2,...,列名n)
VALUES
(值1,值2,...,值n),
(值1,值2,...,值n),
...
(值1,值2,...,值n);
mysql> create table dept(deptno int(4),deptname varchar(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dept values(5,'dept5'),(6,'dept6');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
| 5 | dept5 |
| 6 | dept6 |
+--------+----------+
2 rows in set (0.00 sec)
mysql> insert into dept
-> values
-> (1,'tech'),
-> (2,'sale'),
-> (5,'fin');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
| 5 | dept5 |
| 6 | dept6 |
| 1 | tech |
| 2 | sale |
| 5 | fin |
+--------+----------+
5 rows in set (0.00 sec)
UPDATE [IGNORE] 表名
SET 列名1 = 值1,
列名2 = 值2,
...
列名n = 值n
[WHERE 过滤条件];
IGNORE 关键字:如果用 UPDATE 语句进行更新多行,并且在更新这些行中的一行或多行时出现一个错误,则整个 UPDATE 操作被取消。即使是发生错误,也继续进行更新,可使用 IGNORE 关键字。
为了更新表中的数据,可使用 UPDATE 语句。可采用两种方式:
基本的 UPDATE 语句由 3 部分组成,分别是:(1) 要更新的表;(2) 列名和他们的值;(3) 确定要更新行的过滤条件。
#客户 10005 现在有了电子邮件,因此需要更新数据
mysql> update customers
-> set cust_email = '[email protected]'
-> where cust_id = 10005;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
为了删除某列的值,可以设置它为 NULL:
mysql> UPDATE customers
-> SET cust_email = NULL
-> WHERE cust_id = 10005;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
DELETE FROM 表名
[WHERE 过滤条件];
为了删除表中的数据,可使用 DELETE 语句。可采用两种方式:
mysql> DELETE FROM customers
-> WHERE cust_id = 10006;
Query OK, 0 rows affected (0.00 sec)
DELETE 删除整行的值,如果想删除指定的列,使用 UPDATE 语句。但是,请注意的是,DELETE 删除的是表的内容,而不是表本身!!!想要从表中删除所有的行,不要使用 DELETE,可使用 TRUNCATE TABLE 语句。
因 SELECT 语句用法太多,请见《SELECT查询》。
MySQL 服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。即你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。root 用户对整个 MySQL 具有完全的控制。
MySQL 用户账号和信息存储在名为 mysql 的数据库中。mysql 数据库中有一个名为 user 的表,它包含所有用户账号。
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SELECT user FROM user;
+---------------+
| user |
+---------------+
| root |
| mysql.session |
| mysql.sys |
| root |
+---------------+
4 rows in set (0.00 sec)
为了创建一个新的用户账号,使用 CREATE USER 语句:
mysql> CREATE USER ben IDENTIFIED BY 'opfordream'; #使用了一个密码
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE USER li; #不使用密码
Query OK, 0 rows affected (0.00 sec)
为了重命名一个用户账号,使用 RENAME USER 语句:
mysql> RENAME USER ben TO bforta;
Query OK, 0 rows affected (0.00 sec)
为了删除一个用户账号(以及相关权限),使用 DROP USER 语句:
mysql> DROP USER bforta;
Query OK, 0 rows affected (0.00 sec)
在创建用户账号后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们可以登陆 MySQL,但看不到数据,不能执行任何数据库的操作。
为了查看用户的权限,使用 SHOW GRANTS FOR:
mysql> SHOW GRANTS FOR li;
+--------------------------------+
| Grants for li@% |
+--------------------------------+
| GRANT USAGE ON *.* TO 'li'@'%' |
+--------------------------------+
1 row in set (0.00 sec)
输出结果显示用户 li 有一个权限 USAGE ON *.*。USAGE 表示根本没有权限。
此外,用户定义为 user@host:MySQL 的权限用用户名和主机名结合定义。如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)。
为设置权限,使用 GRANT,GRANT 要求至少给出以下信息:
mysql> GRANT SELECT ON crashcource.* TO li;
Query OK, 0 rows affected (0.00 sec)
此 GRANT 允许用户在 crashcourse 数据库的所有表上使用 SELECT。SHOW GRANTS 反映这个更改:
mysql> SHOW GRANTS FOR li;
+---------------------------------------------+
| Grants for li@% |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'li'@'%' |
| GRANT SELECT ON `crashcource`.* TO 'li'@'%' |
+---------------------------------------------+
2 rows in set (0.00 sec)
GRANT 的反操作为 REVOKE,用它撤销特定的权限:
mysql> REVOKE SELECT ON `crashcource`.* FROM li;
Query OK, 0 rows affected (0.00 sec)
GRANT 和 REVOKE 可在几个层次上控制访问权限:
为了更改用户密码,可使用 SET PASSWD 语句:
mysql> SET PASSWORD FOR li = Password('opfordream1996');
Query OK, 0 rows affected, 1 warning (0.00 sec)