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 emp\G
    *************************** 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)

MySQL操作之DDL的更多相关文章

  1. Mysql 数据库操作之DDL、DML、DQL语句操作

    Mysql 数据库操作之DDL.DML.DQL语句操作 设置数据库用户名密码 l  Show databases 查看数据库列表信息 l  查看数据库中的数据表信息 ,格式: use 数据库名: sh ...

  2. MYSQL初级学习笔记一:MYSQL常用命令和数据库操作(DDL)!(视频序号:初级_3,4)

    知识点一:MYSQL常用命令(3) 登入方法:一,mysql –u 账号 –p 密码 退出方法:一,EXIT,QUIT 修改MYSQL命令提示符: 连接上客户机之后,通常使用prompt命令修改: 连 ...

  3. 学习笔记:MySQL操作初步

    对数据库的操作:SQL语言 一:SQL:Structured Query Language,结构化查询语言! 二:DDL:Data Definition Language,数据定义语言 三:DML:D ...

  4. MySQL InnoDB Online DDL学习

    MySQL Online DDL这个新特性是在MySQL5.6.7开始支持的,更早期版本的MySQL进行DDL对于DBA来说是非常痛苦的.现在主流版本都集中在5.6与5.7,为了更好的理解Online ...

  5. MySQL中的DDL,DML

    MySQL中的DDL,DMLDDL:数据定义语言:    CREATE,ALTER,DROP        DB组件:数据库.表.索引.视图.用户.存储过程.存储函数.触发器.事件调度器等    CR ...

  6. MySQL数据库之DDL(数据定义语言)

    1.MySQL数据库之DDL创建.删除.切换 (1)查看所有数据库 show databases: (2)切换数据库 use 数据库名: (3)创建数据库 create database 数据库名: ...

  7. Mysql操作初级

    Mysql操作初级 本节内容 数据库概述 数据库安装 数据库操作 数据表操作 表内容操作 1.数据库概述 数据库管理系统叫做DBMS 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建 ...

  8. python学习道路(day12note)(mysql操作,python链接mysql,redis)

    1,针对mysql操作 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); 设置密码 update user set password ...

  9. ecshop的Mysql操作类

    摘要,这是直接摘抄的ecshop的mysql操作类:不过他这里的缓存是用的文件缓存,我们如果想直接使用,可以替换成memcache的或者redis的! <?php /** * ECSHOP MY ...

随机推荐

  1. Sqlmap 工具用法详解

    Sqlmap 工具用法详解                                 sqlmap是一款自动化的sql注入工具.     1.主要功能:扫描.发现.利用给定的url的sql注入漏 ...

  2. python数组冒号取值操作

    1.冒号的用法 1.1 一个冒号 a[i:j] 这里的i指起始位置,默认为0:j是终止位置,默认为len(a),在取出数组中的值时就会从数组下标i(包括)一直取到下标j(不包括j) 在一个冒号的情况下 ...

  3. 手把手教你使用Hexo+GitHub搭建自己的个人博客网站

    安装nodejs环境 这个直接搜索安装即可,安装完成之后,通过如下命令检测环境变量是否安装成功: λ node -v # 输出版本号 v12.13.1 正确输入版本号即可. 安装cnpm cnpm是淘 ...

  4. ES-基本操作

    (1)创建索引 put 192.168.247.197:9200/type2 /type2 (2)创建映射 post 192.168.247.197:9200/type2/type/_mapping ...

  5. 【Java 二维码】生成二维码

    ZXingCodeEncodeUtils 生成及解析二维码项目 package utils; import java.awt.BasicStroke; import java.awt.Color; i ...

  6. 阿里云服务器安装nginx(ubantu16.04)

    下载安装包 sudo wget http://nginx.org/download/nginx-1.15.5.tar.gz 解压缩 tar zxvf nginx-1.15.5.tar.gz 打开目录 ...

  7. WPF 体系结构

    转载地址:http://blog.csdn.net/changtianshuiyue/article/details/38963477 本主题提供 Windows Presentation Found ...

  8. SpringMVC 入门demo

    (1)新建Spring项目 (2)添加所需要的jar包 spring的5+2: spring-core.jar spring.beans.jar spring-context.jar spring-e ...

  9. 【摘录自MDN】客户端和服务器

    客户端和服务器 连接到互联网的计算机被称作客户端和服务器.下面是一个简单描述它们如何交互的图表: 客户端是典型的Web用户入网设备(比如,你连接了Wi-Fi的电脑,或接入移动网络的手机)和设备上可联网 ...

  10. JavaScript图形实例:线段构图

    在“JavaScript图形实例:四瓣花型图案”和“JavaScript图形实例:蝴蝶结图案”中,我们绘制图形时,主要采用的方法是先根据给定的曲线参数方程计算出两点坐标,然后将两点用线段连接起来,线段 ...