SQL分类
- DDL(Data Definition Languages):数据定义语言,定义不同数据段、数据库、表、列、索引等数据库对象,常用关键字包括create、drop、alter等
- DML(Data Manipulation Language):数据操控语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性:常用关键字包括insert、delete、update和select等
- DCL(Data Control Lanaguage):数据控制语句,用于控制不同数据段直接的许可和访问级别的语句,定义了数据库、表、字段、用户的访问权限和安全级别,主要语句关键字包括grant、revoke等
DDL语句
常用命令有:
- CREATE DATABASE dbname:创建名为dbname的数据库
mysql> create database test2;
Query OK, 1 row affected (0.00 sec)
- show databases:打印系统现有所有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
其中有4个数据库是在mysql安装后自动创建:
-
- information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信 息、权限信息、字符集信息、分区信息等。
- cluster:存储了系统的集群信息。
- mysql:存储了系统的用户权限信息。
- test:系统自动创建的测试数据库,任何用户都可以使用
- use dbname:选择数据库
mysql> use test;
Database changed
- show tables:选择特定数据库后,可以使用此命令输出所有表格信息
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| emp |
+----------------+
1 row in set (0.00 sec)
- drop database dbname:删除名为dbname的数据库
mysql> drop database test1;
Query OK, 0 rows affected (0.01 sec)
- create table ... :创建表,其基本语法如下:
CREATE TABLE tablename (column_name_1 column_type_1 constraints, column_name_2 column_type_2 constraints , ……column_name_n column_type_n constraints)
因为 MySQL 的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许 的字符。column_name 是列的名字,column_type 是列的数据类型,contraints 是这个列的约 束条件。
例如,创建一个名称为 emp 的表。表中包括 3 个字段,ename(姓名),hiredate(雇用日期)、 sal(薪水),字段类型分别为 varchar(10)、date、int(2),则创建语句为:
mysql> CREATE TABLE emp (
-> ename VARCHAR (10),
-> hiredate date,
-> sal DECIMAL (10, 2),
-> deptno INT (2)
-> );
Query OK, 0 rows affected (0.05 sec)
- desc tablename / show create table tablename : 查看表名为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.01 sec)
- 修改表类型,具体可分为以下几种:
- 修改表列类型
-
- ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
- 结合上表描述,我们对emp表做出修改
mysql> alter table emp modify ename varchar(20);
Query OK, 0 rows affected (0.08 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)
发现表结构已经改变
-
-
- ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]
- 表 emp 上新增加字段 age,类型为 int(3),同时我们可以使用FIRST | AFTER 控制列的插入位置,FIRST为插入到最前面,默认为最后一行:
mysql> alter table emp add column age int(3) after deptno;
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 | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.02 sec)
-
- 删除表字段
-
- ALTER TABLE tablename DROP [COLUMN] col_name
- 删除刚刚新添加的age属性:
mysql> alter table emp drop column age;
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)
-
- 字段改名
-
- ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition
- 将 ename改名为 name,同时修改字段类型为 varchar(10)
mysql> alter table emp change ename name varchar(10);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | 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)
注意:change 和 modify都可以修改表的定义,不同的是 change 后面需要写两次列名,不方便。 但是 change 的优点是可以修改列名称,modify则不能
-
- 修改表名
-
- ALTER TABLE tablename RENAME [TO] new_tablename
- 将表 emp 改名为 emp1
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| emp1 |
+----------------+
1 row in set (0.00 sec)
mysql> alter table emp1 rename to emp;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| emp |
+----------------+
1 row in set (0.00 sec)
- drop table tablename:删除名为tablename的表:
mysql> drop table emp;
Query OK, 0 rows affected (0.01 sec)