zoukankan      html  css  js  c++  java
  • 深入浅出MySQL-DDL语句

    DDL语句

    DDL是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改等操作的语言。它和DML(数据操纵语言)的最大区别是DML知识对表内部的数据操作,而不涉及表的定义、结构的修改,更不会涉及其他对象。DDL语句更多地由数据库管理员(DBA)使用,开发人员一般很少使用。

    DDL 数据定义语言 create
    DML 数据操纵语言 insert、delete、update
    DCL 数据库控制语言 grant、remove
    DQL 数据库查询语言 select

    1.创建数据库

    语法如下所示:

    create database dbname;
    mysql> create database test1;
    Query OK, 1 row affected (0.00 sec)

    可以发现,执行完创建命令后,下面一行会提示"Query OK, 1 row affected (0.05 sec)",这段提示可以分为3部分。"Query OK"表示上面的命令执行成功,但是这又不是执行查询操作,为什么显示查询成功?其实这是MySQL的一个特点,所有的DDL和DML(不包括select)操作执行成功之后都会显示"Query OK",这里理解为执行成功就可以了。"1 row affected "表示操作只影响了数据库中一行的记录。"(0.05 sec)"则记录了操作执行的时间。

    如果已经存在这个数据库,系统会提示:

    mysql> create database test1;
    ERROR 1007 (HY000): Can't create database 'test1'; database exists

    这个时候,如果需要知道系统中都存在哪些数据库,可以用以下命令来看:

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mybatis            |
    | mysql              |
    | performance_schema |
    | sys                |
    | test1              |
    +--------------------+
    6 rows in set (0.00 sec)

    选择数据库test1:

    use test1;

    然后用以下命令来查看test1数据库中创建的所有数据表:

    show tables;

    2.删除数据库

    删除数据库的语法很简单,如下所示:

    drop database dbname;

    注意:数据库删除后,下面的所有表数据都会全部删除,所以删除之前一定要仔细检查并做好相应的备份。

    3.创建表

    在数据库中创建一张表的基本语法如下:

    create table tablename(
    column_name_1 column_type_1 constraints,
    column_name_2 column_type_2 constraints,
    .........
    )

    因为MySQL的表明是以目录的形式存在于磁盘上的,所以表名的字符可以用任何目录名允许的字符。column_name是列的名字;column_type是列的数据类型;constraints是这个列的约束条件。

    例如创建一个名称为emp的表,表中包括ename(姓名),hiredate(雇用日期)和salary(薪水)3个字段,字段类型分别为varchar(10),date,int(2)。

    mysql> create table emp( ename varchar(10),hiredate date,salary decimal(10,2),deptno int(2));
    Query OK, 0 rows affected (0.25 sec)

    表创建完毕后,如果需要查看一下表的定义,可以使用如下命令:

    desc tablename;

    如查看emp表,将输出以下信息:

    mysql> desc emp;
    +----------+---------------+------+-----+---------+-------+
    | Field    | Type          | Null | Key | Default | Extra |
    +----------+---------------+------+-----+---------+-------+
    | ename    | varchar(10)   | YES  |     | NULL    |       |
    | hiredate | date          | YES  |     | NULL    |       |
    | salary   | decimal(10,2) | YES  |     | NULL    |       |
    | deptno   | int(2)        | YES  |     | NULL    |       |
    +----------+---------------+------+-----+---------+-------+
    4 rows in set (0.01 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,
      `salary` decimal(10,2) DEFAULT NULL,
      `deptno` int(2) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified

    除了可以看到表的定义以外,还可以看到表的engine(存储引擎)和charset(字符集)等信息。"G"选项的含义是使得记录能按照字段竖向排列,以便更好地显示内容较长的记录。

    4.删除表

    表的删除命令如下:

    drop table tablename;

    5.修改表

    对于已经创建好的表,尤其是已经有大量数据的表,如果需要做一些结构上的改变,可以先将表删除(drop),然后再按照新的表定义重建表。这样做没有问题,但是必然要做一些额外的工作,比如数据的重新加载。而且,如果有服务在访问表,也会对服务产生影响。因此大多数情况下,表结构的更改都使用alter table语句,以下是一些常用的命令。

    (1)修改表类型,语法如下:

    alter table tablename modify column_name columen_definition;

    例如修改emp表的ename字段,将var(10)改为var(20):

    mysql> alter table emp modify ename varchar(20);
    Query OK, 0 rows affected (0.03 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    |       |
    | salary   | decimal(10,2) | YES  |     | NULL    |       |
    | deptno   | int(2)        | YES  |     | NULL    |       |
    +----------+---------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    (2)增加表字段,语法如下:

    alter table emp add column_name column_definition;

    例如在表emp中新增加字段age,类型为int(3):

    mysql> alter table emp add age int(3);
    Query OK, 0 rows affected (0.76 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    |       |
    | salary   | 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 column_name;

    例如,将字段age删除掉:

    mysql> desc emp;
    +----------+---------------+------+-----+---------+-------+
    | Field    | Type          | Null | Key | Default | Extra |
    +----------+---------------+------+-----+---------+-------+
    | ename    | varchar(20)   | YES  |     | NULL    |       |
    | hiredate | date          | YES  |     | NULL    |       |
    | salary   | 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 drop column age;
    Query OK, 0 rows affected (0.29 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    |       |
    | salary   | decimal(10,2) | YES  |     | NULL    |       |
    | deptno   | int(2)        | YES  |     | NULL    |       |
    +----------+---------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

    (4)字段改名,语法如下:

    alter table emp change column_name column_newname;

    例如,将age 改名为age1,同时修改字段类型为int(4):

    mysql> desc emp;
    +----------+---------------+------+-----+---------+-------+
    | Field    | Type          | Null | Key | Default | Extra |
    +----------+---------------+------+-----+---------+-------+
    | ename    | varchar(20)   | YES  |     | NULL    |       |
    | hiredate | date          | YES  |     | NULL    |       |
    | salary   | 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.04 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    |       |
    | salary   | decimal(10,2) | YES  |     | NULL    |       |
    | deptno   | int(2)        | YES  |     | NULL    |       |
    | age1     | int(4)        | YES  |     | NULL    |       |
    +----------+---------------+------+-----+---------+-------+
    5 rows in set (0.00 sec)

    注意:change和modify都可以修改表的定义,不同的是change后面需要写两次列名,不方便,但是change的优点是可以修改列的命长,而modify不能。

    (5)修改字段排列顺序

    前面介绍的字段增加和修改语法中,都可以加上一个可选项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    |       |
    | salary   | decimal(10,2) | YES  |     | NULL    |       |
    | deptno   | int(2)        | YES  |     | NULL    |       |
    | age1     | int(4)        | YES  |     | NULL    |       |
    +----------+---------------+------+-----+---------+-------+
    5 rows in set (0.00 sec)
    
    mysql> alter table emp add birth date after ename;
    Query OK, 0 rows affected (1.21 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    |       |
    | salary   | decimal(10,2) | YES  |     | NULL    |       |
    | deptno   | int(2)        | YES  |     | NULL    |       |
    | age1     | int(4)        | YES  |     | NULL    |       |
    +----------+---------------+------+-----+---------+-------+
    6 rows in set (0.00 sec)

    修改age字段,将他放在最前面:

    mysql> alter table emp modify age1 int(3) first;
    Query OK, 0 rows affected (0.25 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc emp;
    +----------+---------------+------+-----+---------+-------+
    | Field    | Type          | Null | Key | Default | Extra |
    +----------+---------------+------+-----+---------+-------+
    | age1     | int(3)        | YES  |     | NULL    |       |
    | ename    | varchar(20)   | YES  |     | NULL    |       |
    | birth    | date          | YES  |     | NULL    |       |
    | hiredate | date          | YES  |     | NULL    |       |
    | salary   | decimal(10,2) | YES  |     | NULL    |       |
    | deptno   | int(2)        | YES  |     | NULL    |       |
    +----------+---------------+------+-----+---------+-------+
    6 rows in set (0.00 sec)

    (6)更改表名,语法如下:

    alter table tablename reaname new_tablename;

    例如将表emp改名为emp1,命令如下:

    mysql> alter table emp rename emp1;
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> show tables;
    +-----------------+
    | Tables_in_test1 |
    +-----------------+
    | emp1            |
    +-----------------+
    1 row in set (0.00 sec)
  • 相关阅读:
    过采样算法之SMOTE
    4.4 spring-自定义标签的解析
    4.3 spring-嵌入式beans标签的解析
    4.2 spring-import 标签的解析;
    4.1 spring-alias 标签的解析;
    4.0 spring-注册解析的Bean
    3.9 spring-自定义标签解析
    3.8 spring
    3.8 spring-qualifier 子元素的使用与解析
    3.7 spring-property 子元素的使用与解析
  • 原文地址:https://www.cnblogs.com/fangpengchengbupter/p/7834582.html
Copyright © 2011-2022 走看看