zoukankan      html  css  js  c++  java
  • MySQL操作之DDL

    SQL语句的分类

    1. DDL(Data Definition Languages)语句:数据定义语言。这些语句定义了不同的数据段、
      数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括create、drop、alter
      等。
    2. DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查
      询数据库记录,并检查数据完整性,常用的语句关键字主要包括insert、delete、udpate 和
      select 等。
    3. DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和
      访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的
      语句关键字包括grant、revoke 等。

    DDL语句

    DDL 是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建、删除、修改的
    操作语言。它和DML 语言的最大区别是DML 只是对表内部数据的操作,而不涉及到表的定
    义、结构的修改,更不会涉及到其他对象
    。DDL 语句更多的被数据库管理员(DBA)所使用,
    一般的开发人员很少使用。
    下面通过一些例子来介绍MySQL 中常用DDL 语句的使用方法。

    1. 创建数据库

      启动MySQL 服务之后,输入以下命令连接到MySQL 服务器:

      [root@mysql ~]# mysql -uroot -p -S /application/mysql5.6/data/mysql.sock 
      Welcome to the MySQL monitor.  Commands end with ; or g.
      Your MySQL connection id is 1
      Server version: 5.6.37 Source distribution
      
      Copyright (c) 2000, 2017, 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 代表客户端命令,-u 后面跟连接的数据库用户,-p 表示需要输入密
      码。
      如果数据库设置正常,并输入正确的密码,将看到上面一段欢迎界面和一个mysql>提示符。
      在欢迎界面中介绍了以下几部分内容。

      • 命令的结束符,用;或者g 结束
      • 客户端的连接ID,这个数字记录了MySQL 服务到目前为止的连接次数,每个新连接都会
        自动加1,本例中是7344941。
      • MySQL 服务器的版本,本例中是“5.6.37”,说明是5.6的版本
      • 通过“help;”或者“h”命令来显示帮助内容,通过“c”命令来清除命令行buffer。
        在mysql>提示符后面输入所要执行的的SQL 语句,每个SQL 语句以分号或者g 结束,按回
        车键执行。

      因为所有的数据都存储在数据库中,因此需要学习的第一个命令是创建数据库,语法如下所
      示:

      CREATE DATABASE dbname
      

      例如,创建数据库test1,命令执行如下:

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

      可以发现,执行完创建命令后,下面有一行提示“Query OK, 1 row affected (0.00 sec)”,这段
      提示可以分为3 部分,“Query OK”表示上面的命令执行成功,读者可能奇怪,又不是执行
      查询操作,为什么显示查询成功?其实这是MySQL 的一个特点,所有的DDL 和DML(不包
      括SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了
      ;“1 row
      affected”表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。
      如果已经存在这个数据库,系统会提示:

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

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

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

      可以发现,在上面的列表中除了刚刚创建的test1 外,还有另外4 个数据库,它们都是安装
      MySQL 时系统自动创建的,其各自功能如下。

      • information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信
        息、权限信息、字符集信息、分区信息等。
      • performance_schema:主要用于收集数据库服务器性能参数
      • mysql:存储了系统的用户权限信息。
      • test:系统自动创建的测试数据库,任何用户 都可以使用。

      在查看了系统中已有的数据库后,可以用如下命令选择要操作的数据库:

      USE dbname
      

      例如:选择数据库test1:

      mysql> use test1
      Database changed
      

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

      mysql> show tables;
      Empty set (0.00 sec)
      

      由于test1 是刚创建的数据库,还没有表,所以显示为空。命令行下面的“Empty set”表示
      操作的结果集为空。如果查看一下mysql 数据库里面的表,则可以得到以下信息:

      mysql> show tables;
      +---------------------------+
      | Tables_in_mysql           |
      +---------------------------+
      | columns_priv              |
      | db                        |
      | employee                  |
      | event                     |
      | func                      |
      | general_log               |
      | help_category             |
      | help_keyword              |
      | help_relation             |
      | help_topic                |
      | innodb_index_stats        |
      | innodb_table_stats        |
      | ndb_binlog_index          |
      | plugin                    |
      | proc                      |
      | procs_priv                |
      | proxies_priv              |
      | servers                   |
      | slave_master_info         |
      | slave_relay_log_info      |
      | slave_worker_info         |
      | slow_log                  |
      | tables_priv               |
      | time_zone                 |
      | time_zone_leap_second     |
      | time_zone_name            |
      | time_zone_transition      |
      | time_zone_transition_type |
      | user                      |
      +---------------------------+
      29 rows in set (0.00 sec)
      
    2. 删除数据库

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

      drop database dbname;
      

      例如,要删除test1 数据库可以使用以下语句:

      mysql> drop database test1;
      Query OK, 0 rows affected (0.00 sec)
      

      可以发现,提示操作成功之后,后面却显示了“0 rows affected”,这个提示可以不用管它,在
      MySQL 里面,drop 语句操作的结果显示都是“0 rows affected”。

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

    3. 创建表

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

      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.02 sec)
      

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

      DESC tablename
      

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

      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)
      

      虽然desc 命令可以查看表定义,但是其输出的信息还是不够全面,为了查看更全面的表定
      义信息,有时就需要通过查看创建表的SQL 语句来得到,可以使用如下命令实现:

      mysql> show create table empG
      *************************** 1. row ***************************
             Table: emp
      Create Table: CREATE TABLE `emp` (
        `ename` varchar(20) 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)
      

      从上面表的创建SQL 语句中,除了可以看到表定义以外,还可以看到表的engine(存储引擎)
      和charset(字符集)等信息。“G”选项的含义是使得记录能够按照字段竖着排列,对于内
      容比较长的记录更易于显示。

    4. 删除表

      表的删除命令如下:

      DROP TABLE tablename
      

      例如,要删除数据库emp 可以使用以下命令:

      mysql> drop table emp;
      Query OK, 0 rows affected (0.00 sec)
      
    5. 修改表

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

      • 修改表类型,语法如下:

        ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
        

        例如:修改表emp 的ename 字段定义,将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.00 sec)
        mysql> alter table emp modify ename varchar(20);
        Query OK, 0 rows affected (0.02 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 tablename ADD [COLUMN] column_definition [FIRST | AFTER col_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.27 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 tablename DROP [COLUMN] col_name
        

        例如,将字段age 删除掉:

        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 drop age;
        Query OK, 0 rows affected (0.26 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 tablename CHANGE [COLUMN] old_col_name column_definition
        [FIRST|AFTER col_name]
        

        例如,将deptno改名为hehe,同时修改字段类型为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    |       |
        +----------+---------------+------+-----+---------+-------+
        4 rows in set (0.00 sec)
        
        mysql> alter table emp change deptno hehe int(4);
        Query OK, 0 rows affected (0.26 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    |       |
        | hehe     | int(4)        | YES  |     | NULL    |       |
        +----------+---------------+------+-----+---------+-------+
        4 rows in set (0.00 sec)
        

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

    6. 修改字段排列顺序

      前面介绍的的字段增加和修改语法(ADD/CNAHGE/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    |       |
      | hehe     | int(4)        | YES  |     | NULL    |       |
      +----------+---------------+------+-----+---------+-------+
      4 rows in set (0.00 sec)
      
      # 指定添加到ename之后
      mysql> alter table emp add birth date after ename;
      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    |       |
      | birth    | date          | YES  |     | NULL    |       |
      | hiredate | date          | YES  |     | NULL    |       |
      | sal      | decimal(10,2) | YES  |     | NULL    |       |
      | hehe     | int(4)        | YES  |     | NULL    |       |
      +----------+---------------+------+-----+---------+-------+
      5 rows in set (0.00 sec)
      
      # 默认添加到最后
      mysql> alter table emp add hello int(100);
      Query OK, 0 rows affected (0.26 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    |       |
      | hehe     | int(4)        | YES  |     | NULL    |       |
      | hello    | int(100)      | YES  |     | NULL    |       |
      +----------+---------------+------+-----+---------+-------+
      6 rows in set (0.00 sec)
      

      修改字段hehe,并将它放到最前面

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

      CHANGE/FIRST|AFTER COLUMN 这些关键字都属于MySQL 在标准SQL 上的扩展,在其他数据库上不一定适用。

    7. 更改表名,语法如下:
      ALTER TABLE tablename RENAME [TO] new_tablename
      

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

      mysql> alter table emp rename emp1;
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> show tables
          -> ;
      +---------------+
      | Tables_in_plf |
      +---------------+
      | emp1          |
      | hk_info       |
      | log_info      |
      | user_info     |
      +---------------+
      4 rows in set (0.00 sec)
      
      mysql> desc emp;
      ERROR 1146 (42S02): Table 'plf.emp' doesn't exist
      
      mysql> desc emp1;
      +----------+---------------+------+-----+---------+-------+
      | Field    | Type          | Null | Key | Default | Extra |
      +----------+---------------+------+-----+---------+-------+
      | hehe     | int(2)        | YES  |     | NULL    |       |
      | ename    | varchar(20)   | YES  |     | NULL    |       |
      | birth    | date          | YES  |     | NULL    |       |
      | hiredate | date          | YES  |     | NULL    |       |
      | sal      | decimal(10,2) | YES  |     | NULL    |       |
      | hello    | int(100)      | YES  |     | NULL    |       |
      +----------+---------------+------+-----+---------+-------+
      6 rows in set (0.00 sec)
      
  • 相关阅读:
    Java study 1:The note of studying Socket which based UDP
    关于Meta标签中formatdetection属性及含义
    编辑sass报错:error style.scss (Line 3: Invalid GBK character "\xE5")解决办法
    比较三个 CSS 预处理器:Sass、LESS 和 Stylus(下)
    vue引入bootstrap、jquery
    Something about SeekingJobResume简历
    Something about SeekingJobTelInterview(电话面试)
    此时彼时
    The method getTextContent() is undefined for the type Node
    单例模式实现方式
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11117701.html
Copyright © 2011-2022 走看看