SQL— DDL语句学习
在数据管理的广阔领域中,SQL(Structured Query Language)作为操作关系型数据库的编程语言,扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准,还为我们提供了强大的工具来管理、查询和修改数据库中的数据。今天,我们将一起走进SQL的世界,了解其语法、分类以及在数据库操作中的应用。
SQL语法基础
在学习SQL的具体语句之前,了解其基本语法是非常重要的。SQL语句的书写具有一定的灵活性,但也有一些基本的规则需要遵循:
- 语句结构:SQL语句可以单行或多行书写,但每条语句的结束需要以分号(
;
)作为标记。 - 可读性:为了提高代码的可读性,SQL语句中可以使用空格和缩进来组织代码结构。
- 大小写敏感性:在MySQL数据库中,SQL语句是不区分大小写的,这意味着
SELECT
、select
或SeLeCt
都会被正确执行。但出于代码规范和可读性的考虑,建议使用统一的大小写规则。 - 注释:SQL支持两种注释方式,单行注释可以使用
--
(或MySQL特有的#
)后跟注释内容,而多行注释则使用/* 注释内容 */
。
SQL语句分类
SQL语句根据其功能被划分为四大类:DDL、DML、DQL和DCL,每一类都对应着数据库管理中的不同方面。
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用于定义数据库对象(如数据库、表、字段) |
DML | Data Manipulation Language | 数据操作语言,用于对数据库表中的数据进行增、删、改操作 |
DQL | Data Query Language | 数据查询语言,用于查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用于创建数据库用户、控制数据库的访问权限 |
DDL:数据定义语言
DDL是SQL中用于定义数据库结构的部分,它允许我们创建、修改或删除数据库对象。在数据库设计阶段,DDL语句是不可或缺的工具。
DDL的常见操作
- 查询数据库:虽然DDL主要用于定义数据库对象,但了解如何查询现有数据库也是数据库管理的一部分。不过,需要注意的是,DDL本身并不直接提供查询数据库的语句(这通常属于DQL的范畴),但我们可以使用
SHOW DATABASES;
(MySQL)等命令来查看数据库列表。 - 创建数据库:使用
CREATE DATABASE dbname;
语句来创建一个新的数据库。 - 创建表:通过
CREATE TABLE tablename (column1 datatype, column2 datatype, ...);
语句来定义表的结构。 - 修改数据库/表:DDL也提供了修改数据库和表结构的机制,但需要注意的是,直接修改表结构(如添加或删除列)通常需要使用
ALTER TABLE
语句,而修改数据库本身(如重命名)则可能依赖于特定数据库的特定命令。 - 删除数据库/表:使用
DROP DATABASE dbname;
和DROP TABLE tablename;
语句可以分别删除整个数据库和单个表。这是一个非常危险的操作,因为一旦执行,数据将不可恢复,因此在使用时需要格外小心。
1 有关数据库的DDL语句
在数据库管理中,DDL(Data Definition Language,数据定义语言)是一组用于定义和修改数据库结构的SQL语句。DDL语句主要用于创建、修改、删除数据库及其对象(如表、索引等)。下面,我们将详细介绍几个常见的DDL语句,包括查询数据库、创建数据库、使用数据库以及删除数据库。
查询所有数据库
要查看MySQL服务器中所有现有的数据库,可以使用SHOW DATABASES;
命令。
show databases;
执行该命令后,将列出MySQL服务器上所有的数据库。
查询当前数据库
如果你想要知道当前正在使用哪个数据库,可以使用SELECT DATABASE();
语句。
select database();
注意,这里的DATABASE()
是一个函数,用于返回当前数据库的名称。
创建数据库
创建数据库的基本语法如下:
create database [if not exists] 数据库名;
[if not exists]
是一个可选参数,用于防止在数据库已存在时执行创建操作时出现错误。
例如,创建一个名为itcast
的数据库:
create database itcast;
或者,使用if not exists
防止重复创建:
create database if not exists itcast;
注意:原笔记中的extists
应为exists
,这是一个常见的拼写错误。
使用数据库
在创建或选择了一个数据库之后,你需要使用USE
语句来指定接下来要操作的数据库。
use 数据库名;
例如,切换到itcast
数据库:
use itcast;
只有在使用了USE
语句之后,你才能在该数据库下创建表、插入数据等。
删除数据库
如果某个数据库不再需要,可以使用DROP DATABASE
语句来删除它。为了防止删除不存在的数据库时出错,可以使用IF EXISTS
选项。
drop database [if exists] 数据库名;
例如,删除itcast
数据库(如果存在):
drop database if exists itcast;
额外说明
在SQL中,DATABASE
和SCHEMA
这两个词经常可以互换使用,特别是在MySQL中。因此,CREATE DATABASE
和CREATE SCHEMA
、SHOW DATABASES
和SHOW SCHEMAS
等命令在MySQL中是等价的。但在其他数据库管理系统中,这种等价性可能不成立,因此在使用时需要注意。
DDL语句是数据库管理和维护的重要工具,掌握它们对于进行高效的数据库设计和管理至关重要。
2 有关表的DDL语句表的DDL语句详解
在数据库管理中,表是存储数据的基本结构。通过DDL(Data Definition Language,数据定义语言)语句,我们可以对表结构进行创建、查询、修改和删除等操作。下面,我们将详细探讨这些操作,特别是关于创建表的语法和注意事项。
创建表
语法
创建表的基本语法如下:
create table 表名(
字段1 字段1类型 [约束] [comment 字段1注释],
字段2 字段2类型 [约束] [comment 字段2注释],
......
字段n 字段n类型 [约束] [comment 字段n注释]
) [comment 表注释];
[ ]
中的内容为可选参数。- 最后一个字段后面没有逗号。
示例
假设我们要创建一个用户表tb_user
,包含ID、用户名、姓名、年龄和性别等字段,其建表语句如下:
create table tb_user (
id int comment 'ID,唯一标识',
username varchar(20) comment '用户名',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '性别'
) comment '用户表';
约束
在创建表时,我们可以为字段添加约束以保证数据的正确性、有效性和完整性。MySQL中常见的约束包括:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 字段值不能为null | not null |
唯一约束 | 字段值必须唯一 | unique |
主键约束 | 字段值非空且唯一,作为行的唯一标识 | primary key |
默认约束 | 字段值未指定时采用默认值 | default |
外键约束 | 关联两个表,保证数据一致性和完整性 | foreign key |
示例(包含约束)
create table tb_user (
id int primary key auto_increment comment 'ID,唯一标识',
username varchar(20) not null unique comment '用户名',
name varchar(10) not null comment '姓名',
age int comment '年龄',
gender char(1) default '男' comment '性别'
) comment '用户表';
在这个例子中,id
字段被设置为主键并自动增长,username
字段被设置为非空且唯一,name
字段被设置为非空,gender
字段具有默认值“男”。
主键自增
auto_increment
关键字用于自动增长主键的值,每次插入新记录时,数据库会自动生成一个唯一的ID。
数据类型
MySQL支持多种数据类型,主要分为数值类型、字符串类型和日期时间类型。
数值类型
类型 | 大小 | 有符号范围 | 无符号范围 | 描述 |
---|---|---|---|---|
TINYINT | 1byte | (-128, 127) | (0, 255) | 小整数值 |
SMALLINT | 2bytes | (-32768, 32767) | (0, 65535) | 大整数值 |
MEDIUMINT | 3bytes | (-8388608, 8388607) | (0, 16777215) | 大整数值 |
INT/INTEGER | 4bytes | (-2147483648, 2147483647) | (0, 4294967295) | 大整数值 |
BIGINT | 8bytes | (-263, 263-1) | (0, 2^64-1) | 极大整数值 |
FLOAT | 4bytes | (-3.402823466 E+38, 3.402823466351 E+38) | 0 和 (1.175494351 E-38, 3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8bytes | (-1.7976931348623157 E+308, 1. |
对于数值类型,TINYINT
、DOUBLE
等是常用的数据类型,它们分别适用于不同范围的数值存储需求。
-
年龄字段(
age
)- 考虑到年龄通常不会为负数,且人的年龄范围相对固定,使用
TINYINT UNSIGNED
是一个合理的选择。这样既保证了数据的非负性,又有效地限制了存储空间。
age TINYINT UNSIGNED
- 考虑到年龄通常不会为负数,且人的年龄范围相对固定,使用
-
分数(
score
)- 如果分数总分是100分,且最多出现一位小数,可以使用
DOUBLE(4,1)
来存储。但考虑到分数的精度和存储效率,使用DECIMAL(3,1)
可能更为合适,因为它更适合存储精确的十进制数。
score DECIMAL(3,1)
- 如果分数总分是100分,且最多出现一位小数,可以使用
字符串类型
字符串类型包括CHAR
、VARCHAR
、TEXT
等,它们适用于存储不同长度的文本数据。
-
用户名(
username
)- 用户名长度通常不定,但会有一个最大长度限制。在这种情况下,使用
VARCHAR(50)
是一个好的选择,因为它可以根据实际存储的字符串长度动态调整存储空间。
username VARCHAR(50)
- 用户名长度通常不定,但会有一个最大长度限制。在这种情况下,使用
-
手机号(
phone
)- 手机号是固定长度的字符串(通常为11位数字),因此使用
CHAR(11)
是合适的。这样可以确保每个手机号都占用相同的存储空间,提高查询效率。
phone CHAR(11)
- 手机号是固定长度的字符串(通常为11位数字),因此使用
日期和时间类型
日期和时间类型包括DATE
、TIME
、DATETIME
等,它们用于存储日期和时间信息。
-
生日(
birthday
)- 生日只需要存储年月日信息,因此使用
DATE
类型是最合适的。
birthday DATE
- 生日只需要存储年月日信息,因此使用
-
创建时间(
createtime
)- 创建时间需要精确到时分秒,因此使用
DATETIME
类型是最合适的。它可以存储日期和时间信息,满足大多数应用场景的需求。
createtime DATETIME
- 创建时间需要精确到时分秒,因此使用
数据库表结构的查询 修改 删除
在数据库管理中,对表结构的查询、修改、删除等操作是日常工作中不可或缺的一部分。尽管现代数据库管理工具提供了图形化界面来简化这些操作,但了解背后的SQL命令仍然非常重要。以下将详细介绍如何在MySQL数据库中查询、修改和删除表结构。
查询
查询当前数据库所有表
要查看当前数据库中所有的表,可以使用SHOW TABLES;
命令。这个命令会列出当前数据库中的所有表名。
SHOW TABLES;
查看指定表结构
要查看某个表的具体结构,包括字段名、字段类型、是否允许为空、默认值等信息,可以使用DESC
命令或DESCRIBE
命令(两者是等价的)。
DESC 表名;
-- 或者
DESCRIBE 表名;
查询指定表的建表语句
如果你需要查看某个表的完整建表语句,包括所有的字段定义、索引、约束等,可以使用SHOW CREATE TABLE
命令。
SHOW CREATE TABLE 表名;
修改
添加字段
向表中添加新字段,可以使用ALTER TABLE
命令配合ADD
子句。
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT '注释'] [约束];
案例:为tb_emp
表添加名为qq
的字段,字段类型为VARCHAR(11)
,并添加注释“QQ号码”。
ALTER TABLE tb_emp ADD qq VARCHAR(11) COMMENT 'QQ号码';
修改数据类型
修改表中字段的数据类型,可以使用MODIFY
子句或CHANGE
子句。MODIFY
用于修改字段的数据类型和长度,而CHANGE
还可以修改字段名。
修改数据类型:
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
案例:将tb_emp
表中的qq
字段长度由11修改为13。
ALTER TABLE tb_emp MODIFY qq VARCHAR(13) COMMENT 'QQ号码';
修改字段名和数据类型:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT '注释'] [约束];
案例:将tb_emp
表中的qq
字段名改为qq_num
,字段类型保持为VARCHAR(13)
。
ALTER TABLE tb_emp CHANGE qq qq_num VARCHAR(13) COMMENT 'QQ号码';
删除字段
从表中删除字段,可以使用DROP
子句。
ALTER TABLE 表名 DROP 字段名;
案例:删除tb_emp
表中的qq_num
字段。
ALTER TABLE tb_emp DROP qq_num;
修改表名
修改表名,可以使用RENAME TABLE
命令。
RENAME TABLE 表名 TO 新表名;
案例:将tb_emp
表名修改为emp
。
RENAME TABLE tb_emp TO emp;
删除
删除表
删除表及其所有数据,可以使用DROP TABLE
命令。为了避免在表不存在时执行删除操作导致错误,可以添加IF EXISTS
子句。
DROP TABLE [IF EXISTS] 表名;
案例:如果tb_emp
表存在,则删除它。
DROP TABLE IF EXISTS tb_emp; -- 在删除表时,表中的全部数据也会被删除。
尽管图形化界面提供了便捷的操作方式,但掌握SQL命令对于深入理解数据库结构和进行复杂操作至关重要。希望以上内容能帮助你更好地管理数据库表结构。