SQL— DDL语句学习【后端 9】
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命令对于深入理解数据库结构和进行复杂操作至关重要。希望以上内容能帮助你更好地管理数据库表结构。
相关文章:

SQL— DDL语句学习【后端 9】
SQL— DDL语句学习 在数据管理的广阔领域中,SQL(Structured Query Language)作为操作关系型数据库的编程语言,扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准,还为我们提供了强大的工具来管理、查…...

线程池介绍
1.线程池简介 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableDemo {public sta…...

如何备份电脑所有数据?有哪些方法值得参考借鉴?
备份电脑所有数据是防护数据丢失和泄密的重要一项措施,备份数据也有不同的方式和工具,正确的工具能帮你省时省力,下面盘点了几个方法,来看哪一种最适合你。 一、使用专业备份软件 第三方服务器文件自动备份软件:如安企…...

初识--树(1)
下面就是这篇博客要讲的内容 树 二叉树堆 树概念及结构二叉树的概念及结构二叉树的实现堆的概念及运用 这篇博客主要以二叉树为主要内容。 1、树的概念及结构 1.1树的概念: 树是一种非线性的数据结构,它是由n(n>0)个有限…...

渗透测试实战-菠菜站渗透测试(Nacos反序列化漏洞利用)
免责声明:文章来源于真实渗透测试,已获得授权,且关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本…...

Pytest框架直接右键运行 testcase.py,不执行最外层conftest
随笔记录 目录 1. 背景介绍 2. workaround method 2.1 通过命令行执行 某个测试用例 1. 背景介绍 Pytest 框架结构如下: TestCases:conftest.pyInstanta: conftest.pytest_instanta_tcpdump_pack_len.py# 当直接右键直接 运行 test_instanta_tcpdump_pack_l…...

Cxx primer-chap15-Object-Oriented Programming
面向对象编程的三个基本概念:数据抽象、继承和动态绑定(多态):基类应该提供一些类型无关的成员函数定义,将与类相关的函数留给不同的派生类定义:,派生类是通过类派生列表(class derivation list…...

当黑神话遇上AI:悟空背后的策划逆袭战
声明:此篇为 ai123.cn 原创文章,转载请标明出处链接:https://ai123.cn/2192.html 哈喽,亲爱的游戏迷,随着《黑神话:悟空》的上线,大家都在忙着“直面天命”了吧?今天我想和大家分享最…...

外呼触发通知发送闪信(mod_cti基于FreeSWITCH)
文章目录 前言联系我们手动外呼配置方法例子一:接收到180或183时触发闪信发送例子二:挂断后触发闪信发送 自动外呼配置方法例子:接收到180或183时触发闪信发送 前言 在呼叫中心中间件中,自动外呼触发闪信发送,我们可以…...

8.Java基础概念-方法
欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words! 什么是方法 方法是程序…...

360安全浏览器如何彻底卸载
360安全浏览器是一款广泛使用的网络浏览工具,然而由于各种原因,用户可能需要将其从计算机中彻底移除。下面小编就给大家分享几种彻底卸载360安全浏览器的方法,避免留下影响系统性能的残留信息。(本文由https://chrome.cmrrs.com/站…...

构建基于LLM的应用程序——使用LLM的搜索和推荐引擎
在上一章中,我们介绍了构建对话应用程序的核心步骤。我们从一个基础的聊天机器人开始,然后逐步添加了更复杂的组件,例如记忆、非参数化知识和外部工具。借助LangChain的预构建组件以及Streamlit的UI渲染,这一切都变得相对简单。尽…...

Unity3D 模型碰撞检测问题详解
前言 在Unity3D游戏开发中,模型碰撞检测是至关重要的一环,它负责处理物体之间的交互、触发事件以及物理效果的实现。通过精确的碰撞检测,游戏世界得以呈现出更为真实和动态的交互体验。本文将详细介绍Unity3D中的碰撞检测原理、技术实现以及…...

springcloud集成seata实现分布式事务
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网:Apache Seata 文章目录 一、部署1.下载2.修改配置,nacos作注册中心,db存储 二、集成到springcloud项目1.引入依赖2.修改…...

[Leetcode 61][Medium]-旋转链表
目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律:当k大于等于链表中节点总数n时,会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时,无论k的值为多少都可以…...

高效分页策略:掌握 LIMIT 语句的正确使用方法与最佳实践
本文主要介绍limit 分页的弊端及线上应该怎么用 LIMIT M,N 平时经常见到使用 <limit m,n> 合适的 order by 来实现分页查询,这样做到底性能如何呢? 先来简单分析下,然后再实际验证一下。 无索引条件下,需要做大量的文件排…...

拼图游戏02
文章目录 概要整体架构流程代码过程小结 概要 现在需要将图片添加界面中 关键点在于它如何动态地根据游戏状态更新用户界面。它使用了Swing的布局管理器来定位组件,并且通过ImageIcon和JLabel来显示图像。注意,路径字符串中的反斜杠在Java中是转义字符…...

在本地进行Django支付宝扫码支付-当面付开发
这几天涉及到一个个人项目的支付开发场景,正好完成之后,做一下开发记录,给有需要的朋友做一下参考 涉及安装Python环境请参考我专栏中的历史文章,这里不再重复说明 环境: Python3.11 使用Django框架 因本次代码为沙…...

redis-RedisTemplate.opsForGeo 的geo地理位置相关的方法演示
主要方法:add : 添加一个地理位置distance: 计算两个元素之间的距离hash: 获取元素经纬度坐标经过geohash算法生成的base32编码值position: 获取集合中任意元素的经纬度坐标,可以一次获取多个radius:查询某个坐标或某个成员&#…...

做短视频矩阵要十几人团队吗?云微客助阵,一人即可
现在市面上主流的新媒体平台都进军了短视频赛道,对于众多企业和个人来说,短视频矩阵更是成为了提升影响力和拓展业务的关键。企业或个人可以根据自身产品特点和目标用户群体,构建账号矩阵,在多平台上建立账号矩阵,还可…...

常用语音识别开源工具的对比与实践
常用语音识别开源工具的对比 一.工具概述 1. WeNet 设计目标:WeNet 的设计主要聚焦于端到端(E2E)语音识别,特别是在流式识别方面的优化。其目标是提供一个可以在实际应用中达到低延迟和高精度的系统。模型架构: Con…...

Fortify代码安全测试工具在静态应用安全测试(SAST)方面针对典型问题的改进
Fortify代码安全测试工具作为行业内资深的老牌软件安全测试工具,可以同时支持静态代码扫描和动态代码扫描,本文我们讲述的主要是在静态代码扫描领域Fortify所面临的问题,以及最新的改进。 在应用安全领域,特别是静态应用安全测试&…...

AWS 消息队列服务 SQS
AWS 消息队列服务 SQS 引言什么是 SQSSQS 访问策略 Access Policy示例:如何为 DataLake Subscription 配置 SQS 引言 应用系统需要处理海量数据,数据发送方和数据消费方是通过什么方式来无缝集成消费数据的,AWS 提供 SQS 消息队列服务来解决…...

【iOS】——响应者链和事件传递链
事件传递 事件传递流程 发生触摸事件后,系统会将该事件封装成UIEvent对象加入到一个由UIApplication管理的事件队列 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口…...

mysql查询慢
可能是连接数,或者缓存不够,可尝试添加如下参数,重启mysql [mysqld] max_connections50000 interactive_timeout604800 lock_wait_timeout600 wait_timeout604800 net_read_timeout604800 log-error/var/lib/mysql/mysqld.log slow_qu…...

【Java-==与equals】
与equals区别: 1.是关系运算符,equals()是0bject类中定义的方法 2.基本数据类型: 使用比较值,无法使用equals() 3.引用数据类型: 使用比较内存地址; 如果没有重写equals(),仍然调用的是0bject父类的equals(()方法,则比较的是内…...

ai回答 部署前端项目时需要使用ssh吗
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上安全地访问远程计算机。SSH 提供了加密的命令行登录到远程计算机的功能,以及远程命令执行和其他服务。它常用于系统管理员管理服务器、开发者进行远程开发、用户通过终端访问…...

结合ChatGPT与Discord,提高团队合作效率
本文将教你如何集成Discord Bot,助力团队在工作中实现更高效的沟通与协作。通过充分发挥ChatGPT的潜力,进一步提升工作效率和团队协作能力。无需编写任何代码即可完成本文所述的操作,进行个性化定制只需对参数进行微调即可。 方案介绍 如果在…...

VisualStudio|开发环境相关技巧及问题
哈喽,你好啊,我是雷工! 本节继续学习VisualStudio相关内容,以前学习都是以能用为主,没有系统的学习,接下来会系统的学习相关内容, 以下为学习笔记。 01 第三方dll调用 ①:如果第三…...

Redis远程字典服务器(11)—— redis客户端介绍
一,基本介绍 前面学习的主要是各种Redis的基本操作/命令,都是再Redis命令行客户端,手动执行的,但是这种方式不是我们日常开发中主要的形式更多的时候,是使用Redis的api,来实现定制化的Redis客户端程序&…...