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. ubuntu的apt

    1. apt edit-sources  #编辑apt的源列表( 或者直接写这个命令:vim /etc/apt/sources.list ) 2. apt list   #列出包含条件的包(已安装,可 ...

  2. 【PAT甲级】1077 Kuchiguse (20 分)(cin.ignore()吃掉输入n以后的回车接着用getine(cin,s[i])输入N行字符串)

    题意: 输入一个正整数N(<=100),接着输入N行字符串.输出N行字符串的最长公共后缀,否则输出nai. AAAAAccepted code: #include<bits/stdc++. ...

  3. python中的分号(“;”)

    在C.Java等语言的语法中规定,必须以分号作为语句结束的标识.Python也支持分号,同样用于一条语句的结束标识.但在Python中分号的作用已经不像C.Java中那么重要了,Python中的分号可 ...

  4. 计算机基础 - 动态规划、分治法、memo

    动态规划 ≈ 分治法 + memo def memo(func): cache = {} def wrap(*args): if args not in cache: cache[args] = fu ...

  5. Plastic Bottle Manufacturer - Different Cosmetic Plastic Bottle Materials, Different Characteristics

    Plastic bottles are usually made of PP, PE, K, AS, abs, acrylic, PET, and the like. Dust caps for th ...

  6. socket 多连接

    socket 多连接 本文档为文档https://www.cnblogs.com/wodeboke-y/p/11241472.html 后续内容. 上一文档中的案例2给出了一个阻塞型socket se ...

  7. ubuntu---查看、安装、切换内核

    首先可以查看一下内核列表:sudo dpkg --get-selections | grep linux-image     查看Linux中安装了哪些内核: dpkg --get-selection ...

  8. linux 环境下安装 MySQL

    参考: Linux安装MySQL5.7 注意: 安装后 出现 navicat MySQL连接Linux下MySQL的及2003错误  需要看下 虚拟机的防火墙是否关闭!!!

  9. CSS - 权重,样式优先级

    关于CSS权重,一套计算公式来去计算,就是 CSS Specificity,我们称为CSS 特性或称非凡性,它是一个衡量CSS值优先级的一个标准. 遇到样式应用问题,计算一下权重就知道优先级. 具体规 ...

  10. Pycharm创建一个Django项目

    1.创建项目 如果本地没有安装与所选python版本对应Django版本,pycharm会自动下载相应的版本: 创建后运行项目,默认页面为http://127.0.0.1:8000/,打开后: 出现上 ...