SQL分类
SQL主要分为以下3个类别:
- DDL(Data Definition Languages)语句:数据定义语言。常用的语句关键字主要包括
create
、drop
、alter
。 - DML(Data Manipulation Language)语句:数据操纵语句。常用的语句关键字主要包括
insert
、delete
、update
和select
等。 - DCL (Data Control Language) 语句:数据控制语句。主要的语句关键字包括
grant
、revoke
等。
DDL
语句
- 创建数据库
- 登录客户端(以root身份登录)
cyc ~ mysql -uroot -p 1
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
以上mysql 代表客户端命令,"-u" 后面跟连接的数据库用户,"-p"表示需要输入密码.
- 创建数据库test1,命令如下:
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
上面 Query OK
表示上面的命令执行成功. 这里不是执行查询操作,为什么显示查询成功呢?这是MYSQL的一个特点,所有的DDL和DML(不包括SELECT)操作执行成功后都显示 “Query OK” ,这里理解成执行成功即可. “1 row affected” 表示操作只影响了数据库中的一行记录. "0.00 sec"记录了操作执行的时间.
如果数据库已经存在这个database, 系统会提示:
mysql> create database test1;
ERROR 1007 (HY000): Can't create database 'test1'; database exists
查看系统中所有数据库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| EntityMappings |
| admin |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
7 rows in set (0.00 sec)
- information_schema :主要存储了系统中的一些数据库对象信息,比如用户表信息,列信息,权限信息,字符集信息,分区信息等.
使用指定数据库
USE dbname;
如:
mysql> use test1;
Database changed
mysql> show tables;
Empty set (0.00 sec)
- 删除数据库
删除数据库的语法很简单,如下所示:
drop database dbname;
mysql> drop database test1;
Query OK, 0 rows affected (0.00 sec)
提示操作成功就,后面却显示了"0 raws affected",这个提示可以不用管它,在 MySQL
里面,drop
语句操作结果都是"0 raws affected"
- 创建表
在数据库中创建一张表的基本语法:
CREATE TABLE tablename(
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
column_name_3 column_type_3 constraints,
...
column_name_n column_type_n constraints)
constraints
是这个列的约束条件.
mysql> create table emp (ename varchar(10), hiredate date, sal decimal(10,2), deptno int(2));
Query OK, 0 rows affected (0.39 sec)
查看表的定义,可以使用如下命令:
DESC tablename
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.02 sec)
desc可以查看表定义,但是其输出的信息还是不够全面. 需要查看创建表的SQL语句,可以使用如下命令查看:
mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: 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)
ERROR:
No query specified
上面可以看到表定义,还可以看到表的engine(存储引擎)和charset(字符集)等信息."\G" 选项的含义是使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录.
- 删除表
DROP TABLE tablename
mysql> drop table emp;
Query OK, 0 rows affected (0.19 sec)
- 修改表
表的结构的更改使用alter table
语句.
(1) 修改表类型
ALTER TABLE tablename MODIFY [COLUMN] colum_definition [FIRST\AFTER col_name]
例如,修改表emp 的enamel 字段定义,将varchar(10) 改为 varchar(20):
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.01 sec)
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.07 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.01 sec)
(2) 增加表字段
ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST\AFTER column_name];
在emp中增加age,类型为int(3):
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)
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.41 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)
(3) 删除表字段,
ALTER TABLE tablename DROP [COLUMN] col_name;
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.40 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)
(4) 字段改名
ALTER TABLE tablename CHANGE [COLUMN] old_col_name colum_definition
将age改名为age1,同时修改字段类型为int(4):
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)
mysql> alter table emp change age age1 int(4);
Query OK, 0 rows affected (0.11 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 | |
| age1 | int(4) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
(5) 修改字段排列顺序
前面介绍的字段增加和修改语法(ADD/CHANGE/MODIFY)中,都有一个可选项 first|after column_name ,这个选项可以用来修改字段在表中的位置,ADD增加的新字段默认施加在标的最后位置,而CHANGE/MODIFY默认不会改变字段的位置
- 增加字段birth date在ename之后:
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.01 sec)
mysql> alter table emp add birth date after ename;
Query OK, 0 rows affected (0.43 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 | |
| deptno | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
- 修改字段age,将它放在最前面:
mysql> alter table emp modify age int(3) first;
Query OK, 0 rows affected (0.41 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
(6) 更改表名
ALTER TABLE tablename RENAME [TO] new_tablename
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.13 sec)
mysql> desc emp;
ERROR 1146 (42S02): Table 'test1.emp' doesn't exist
mysql> desc emp1;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| age | int(3) | YES | | NULL | |
| ename | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| deptno | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)