Java面向对象系列[v1.0.0][SQL语法之DDL]

本文详细介绍了SQL语言的基础,包括查询、数据操作(DML)、数据定义(DDL)和数据控制(DCL)语句。重点讲解了如何创建、修改和删除数据表,以及如何使用子查询进行数据建表。此外,还讨论了Truncate命令在不同数据库系统中的行为差异及其效率。最后,文章涵盖了表结构的修改,如添加、修改和删除列,以及重命名表和列的操作。

SQL语法基础

SQL全称是Structured Query Language也就是结构化查询语言,它是操作和检索关系数据库的标准语言,标准的SQL语句可以用于操作任何关系数据库,标准的SQL语句通常分为几个类型:

  • 查询语句:由Select关键字完成,查询语句是SQL中最复杂,功能最丰富的语句
  • DML:Data Manipulation Language 数据操作语言,主要包括insert、update、delete
  • DDL:Data Definition Language 数据定义语言,主要包括create、alter、drop、truncate
  • DCL:Data Control Language 数据控制语言,主要包括grant和revoke
  • 事务控制语句:commit、rollback和savepoint

  • SQL语句的关键字不区分大小写,create和CREATE的作用完全一样
  • SQL如果使用标识符定义表名、列名、变量等,则必须符合如下规则:
    • 标识符通常必须以字母开头
    • 标识符包括字母、数字和三个特殊字符(#_$)
    • 不能使用当前数据库系统的关键字、保留字,通常建议是多个单词连缀并以下划线隔开
    • 同一个模式下的对象不应该同名

truncate是一个特殊的DDL语句,truncate在很多数据库中都被归类为DDL,它相当于先删除指定的数据库表,然后再重新创建该数据表,如果使用MySQL普通存储机制,truncate的确如此,但如果使用InnoDB存储机制,在MySQL5.0.3之前,truncate和delete完全一样,在5.0.3之后,trancate table比delete效率更高,但如果该表被外键约束,则依然被映射成delete操作,当使用快速truncate时,该操作会重设自动增长计数器,在5.0.13之后,快速truncate总是可用且比delete性能好

DDL语句的语法

DDL语句是操作数据库对象的语句,包括create、drop、alter数据库对象,而数据库最基本的对象便是表,数据表是存储数据的逻辑单元,但数据库里并不仅仅是数据表

对象对应关键字描述
table表是存储数据的逻辑单元,以行和列的形式存在,列是字段,行就是记录
数据字典也就是系统表,存放数据库相关信息的表,系统表里的数据通常由数据库系统,程序员通常不应该手动修改系统表及系统表数据,只可查看系统表数据
约束constraint执行数据校验的规则,用于保证数据完整性的规则
视图view一个或者多个数据表里数据的逻辑显示,视图并不存储数据
索引index用于提高查询性能,相当于书的目录
函数function用于完成一次特定的计算,具有一个返回值
存储过程procedure用于完成一次完整的业务处理,没有返回值,但可通过传出参数将多个值传给调用环境
触发器trigger相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理
建表

基本语法:

create table [模式名.](
	# 可以定义多个列
	columnName1 datatype [default expr],
	...
);
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.21 MySQL Community Server - GPL

Copyright (c) 2000, 2020, 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> create database if not exists davieyang;
Query OK, 1 row affected (0.16 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| davieyang          |
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
| world              |
+--------------------+
7 rows in set (0.00 sec)

mysql> use davieyang;
Database changed

mysql> create table davieyang_test(
    ->  test_id int,
    ->  test_name text,
    ->  test_price decimal,
    ->  test_desc text,
    ->  test_img blob,
    ->  test_date datetime);
Query OK, 0 rows affected (0.77 sec)

建表只是建立表结构,就是指定该数据表有多少列,列的数据类型,如果要指定默认值,则使用default关键字,而不是=号

mysql> create table davieyang_testtable(
    ->  test_name varchar(255) default 'davieyang',
    ->  test_id int,
    ->  test_price decimal,
    ->  test_desc text,
    ->  test_img blob,
    ->  test_date datetime);
Query OK, 0 rows affected (0.29 sec)

建表时需要指定每列的数据类型,不同数据库所支持的列类型不同

列类型说明
tinyint/smallint/mediumint/int(integer)/bigint1字节/2字节/3字节/4字节/8字节整数, 又可分为有符号和无符号两种,这些整数类型的区别仅仅是表述范围不同
float/double单精度、双精度浮点类型
decimal(dec)精确小数类型,相对于float和double不会产生精度丢失的问题
date日期类型,不能保存时间,java.util.Date对象保存进date列时,时间部分会丢失
time时间类型,不能保存日期,java.util.Date对象保存进time列时,日期部分将会丢失
datetime日期、时间类型
timestamp时间戳类型
year年类型,仅仅保存时间的年份
char定长字符串类型
varchar可变长度字符串类型
binary定长二进制字符串类型,它以二进制形式保存字符串
varbinary可变长度的二进制字符串类型,它以二进制形式保存字符串
tinyblob/blob/mediumblob/longblob1字节/2字节/3字节/4字节的二进制对象,可用于存储图片、音频文件等二进制数据,分别可存储:255B/64KB/16MB/4GB的大小
tinytext/text/mediumtext/longtext1字节/2字节/3字节/4字节 的文本对象,可用于存储超长长度的字符串,分别可存储:255B/64KB/16MB/4GB大小的文本
enum(‘value1’,‘value2’, …)枚举类型,该列的值只能是enum后括号里多个值得其中之一
set(‘value1’, ‘value2’, …)集合类型,该列的值可以是set后括号里多个值得其中几个
子查询建表

之前的建表只是创建一个空表,该表里没有任何数据,如果使用子查询建表,则可以在建表的同时插入数据

create table [模式名.]表名[column[, column...]]
as subquery;

新表的字段列表必须与子查询中的字段列表数量匹配,创建新表的时候字段列表可以省略,如果省略了该字段列表,则新表的列名与选择结果完全相同

create table davieyang_test_table
as 
select * from davieyang_test;
mysql> desc davieyang_test;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| test_id    | int           | YES  |     | NULL    |       |
| test_name  | text          | YES  |     | NULL    |       |
| test_price | decimal(10,0) | YES  |     | NULL    |       |
| test_desc  | text          | YES  |     | NULL    |       |
| test_img   | blob          | YES  |     | NULL    |       |
| test_date  | datetime      | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.02 sec)

mysql> desc davieyang_testtable;
+------------+---------------+------+-----+-----------+-------+
| Field      | Type          | Null | Key | Default   | Extra |
+------------+---------------+------+-----+-----------+-------+
| test_name  | varchar(255)  | YES  |     | davieyang |       |
| test_id    | int           | YES  |     | NULL      |       |
| test_price | decimal(10,0) | YES  |     | NULL      |       |
| test_desc  | text          | YES  |     | NULL      |       |
| test_img   | blob          | YES  |     | NULL      |       |
| test_date  | datetime      | YES  |     | NULL      |       |
+------------+---------------+------+-----+-----------+-------+
6 rows in set (0.00 sec)
mysql> create table davieyang_test_table as select * from davieyang_testtable;
Query OK, 0 rows affected (1.76 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show tables;
+----------------------+
| Tables_in_davieyang  |
+----------------------+
| davieyang_test       |
| davieyang_test_table |
| davieyang_testtable  |
+----------------------+
3 rows in set (0.00 sec)

mysql> desc davieyang_test_table;
+------------+---------------+------+-----+-----------+-------+
| Field      | Type          | Null | Key | Default   | Extra |
+------------+---------------+------+-----+-----------+-------+
| test_name  | varchar(255)  | YES  |     | davieyang |       |
| test_id    | int           | YES  |     | NULL      |       |
| test_price | decimal(10,0) | YES  |     | NULL      |       |
| test_desc  | text          | YES  |     | NULL      |       |
| test_img   | blob          | YES  |     | NULL      |       |
| test_date  | datetime      | YES  |     | NULL      |       |
+------------+---------------+------+-----+-----------+-------+
6 rows in set (0.02 sec)

当数据表创建成功后,MySQL使用information_schema数据库里的TABLES表来保存该数据库实例中的所有数据表,用户可通过查询TABLES表来获取该数据库的表信息

修改表结构
添加列

使用alter table修改表结构包括增加列定义、修改列定义、删除列、重命名列等操作

alter table 表名
add
(
	# 多个列的定义
	column_name datatype [default expr],
	...
);
mysql> alter table davieyang_test_table add test_selenium varchar(255);
Query OK, 0 rows affected (1.32 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table davieyang_test_table add (test_pycharm varchar(255) default 'davieyang', test_idea varchar(255));
Query OK, 0 rows affected (1.79 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc davieyang_test_table;
+---------------+---------------+------+-----+-----------+-------+
| Field         | Type          | Null | Key | Default   | Extra |
+---------------+---------------+------+-----+-----------+-------+
| test_name     | varchar(255)  | YES  |     | davieyang |       |
| test_id       | int           | YES  |     | NULL      |       |
| test_price    | decimal(10,0) | YES  |     | NULL      |       |
| test_desc     | text          | YES  |     | NULL      |       |
| test_img      | blob          | YES  |     | NULL      |       |
| test_date     | datetime      | YES  |     | NULL      |       |
| test_selenium | varchar(255)  | YES  |     | NULL      |       |
| test_pycharm  | varchar(255)  | YES  |     | davieyang |       |
| test_idea     | varchar(255)  | YES  |     | NULL      |       |
+---------------+---------------+------+-----+-----------+-------+
9 rows in set (0.03 sec)
  • 增加字段的时候需要注意:如果数据表中已有数据记录,除非给新增的列指定了默认值,否则新增的数据列不可制定非空约束,因为那些已有的记录在新增列上肯定是空的
  • 修改表结构很容易失败,只要新增的约束与已有数据冲突,修改就会失败
修改列
alter table 表名
modify column_name datatype [default expr] [first|after col_name];
mysql> alter table davieyang_test_table add test_jmeter varchar(255) FIRST;
Query OK, 0 rows affected (2.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table davieyang_test_table add test_qtp varchar(255) AFTER test_date;
Query OK, 0 rows affected (2.24 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc davieyang_test_table;
+---------------+---------------+------+-----+-----------+-------+
| Field         | Type          | Null | Key | Default   | Extra |
+---------------+---------------+------+-----+-----------+-------+
| test_jmeter   | varchar(255)  | YES  |     | NULL      |       |
| test_name     | varchar(255)  | YES  |     | davieyang |       |
| test_id       | int           | YES  |     | NULL      |       |
| test_price    | decimal(10,0) | YES  |     | NULL      |       |
| test_desc     | text          | YES  |     | NULL      |       |
| test_img      | blob          | YES  |     | NULL      |       |
| test_date     | datetime      | YES  |     | NULL      |       |
| test_qtp      | varchar(255)  | YES  |     | NULL      |       |
| test_selenium | varchar(255)  | YES  |     | NULL      |       |
| test_pycharm  | varchar(255)  | YES  |     | davieyang |       |
| test_idea     | varchar(255)  | YES  |     | NULL      |       |
+---------------+---------------+------+-----+-----------+-------+
11 rows in set (0.02 sec)

mysql> alter table davieyang_test_table modify test_qtp varchar(255) AFTER test_idea;
Query OK, 0 rows affected (1.97 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc davieyang_test_table;
+---------------+---------------+------+-----+-----------+-------+
| Field         | Type          | Null | Key | Default   | Extra |
+---------------+---------------+------+-----+-----------+-------+
| test_jmeter   | varchar(255)  | YES  |     | NULL      |       |
| test_name     | varchar(255)  | YES  |     | davieyang |       |
| test_id       | int           | YES  |     | NULL      |       |
| test_price    | decimal(10,0) | YES  |     | NULL      |       |
| test_desc     | text          | YES  |     | NULL      |       |
| test_img      | blob          | YES  |     | NULL      |       |
| test_date     | datetime      | YES  |     | NULL      |       |
| test_selenium | varchar(255)  | YES  |     | NULL      |       |
| test_pycharm  | varchar(255)  | YES  |     | davieyang |       |
| test_idea     | varchar(255)  | YES  |     | NULL      |       |
| test_qtp      | varchar(255)  | YES  |     | NULL      |       |
+---------------+---------------+------+-----+-----------+-------+
11 rows in set (0.00 sec)

mysql> alter table davieyang_test_table modify test_qtp varchar(255) FIRST test_date;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'test_date' at line 1

MySQL的一个modify命令不支持一次修改多个列定义,但其他数据库如Oracle支持,要让MySQL达到相同的效果,则需要一次给出多个modify

删除列
alter table 表名
drop column_name;
MySQL专属
  • 重命名数据表
    alter table 表名
    rename to 新表名;
    
  • 修改列名
    alter table 表名
    change old_column_name new column_name type [default expr] [first|after col_name]
    
删除表
drop table 表名;

删除表意味着,表结构被删除,表对象将不存在;表数据被删除;表相关索引、约束被删除

truncate表

对于大部分数据库而言,truncate都被当成了DDL处理,truncate被称为“截断”某个表,实际上就是删除表里的全部数据但保留表结构,相对于DML里的delete命令来说,truncate的速度要更快,但truncate不像delete可以删除指定的记录,truncate只能一次性删除整个表的全部记录

truncate 表名

MySQL对于truncate的处理比较特别,如果使用非InnoDB存储机制,truncate比delete速度要快,如果使用InnoDB存储机制,在MySQL5.0.3之前,truncate和delete完全一样,在这之后truncate比delete效率更高,但如果数据表被外键约束truncate又变为delete操作,5.0.13之后truncate总是可用,且比delete效率更好

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Davieyang.D.Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值