当前位置: 首页 > news >正文

【SQL基础:语法、分类与DDL操作全解析】

一、SQL通用语法

  1. 书写规范
    • SQL语句书写比较灵活,可以单行或多行书写,但需要以分号结尾。这种灵活性使得开发人员能够根据自己的习惯和代码的复杂程度来组织语句。例如,简单的查询语句可能一行就可以写完,如“SELECT * FROM users;”,而复杂的多表关联查询可能会写成多行以提高可读性,像:
SELECTu.name,o.order_number
FROMusers u
JOINorders o ON u.id = o.user_id;
  • 为了增强语句的可读性,可以使用空格或缩进。合理的空格和缩进就像给代码做了排版,让不同部分的功能一目了然。比如在嵌套的查询语句中,通过缩进可以清晰地看出内层查询和外层查询的关系。例如:
SELECT *
FROM (SELECTcolumn1,column2FROM sub_table
) AS new_table;
  1. 大小写问题(以MySQL为例)
    • MySQL数据库中的SQL语句不区分大小写,不过关键字建议使用大写。使用大写关键字有助于在阅读代码时快速区分SQL关键字和自定义的表名、列名等内容,例如“SELECT * FROM users”,“SELECT”大写很容易被识别为查询关键字。
  2. 注释
    • 单行注释有两种方式,一种是“-- 注释内容”,另一种是“# 注释内容”(这是MySQL特有的)。这些单行注释适合在语句旁边简单解释该语句的作用,比如“-- 这是查询用户表中年龄大于30岁的用户记录”,示例代码:
SELECT *
FROM users
WHERE age > 30; -- 只查询年龄大于30岁的用户
  • 多行注释使用“/* 注释内容 */”。当需要对一段较长的代码块或者复杂的逻辑进行解释时,多行注释就非常有用,例如在创建一个复杂的存储过程时,可以在开头使用多行注释来描述该存储过程的功能、输入输出参数等信息。示例:
/*
This stored procedure is used to calculate the total sales amount
for a given period.
It takes two parameters: start_date and end_date.
*/
CREATE PROCEDURE calculate_total_sales(IN start_date DATE, IN end_date DATE)
BEGIN-- Procedure code here
END;

二、SQL分类

  1. DDL(Data Definition Language)
    • 全称是数据定义语言,主要用于定义数据库对象,像数据库、表和字段等。通过DDL,可以创建新的数据库结构或者修改已有的数据库结构,这是构建数据库架构的基础。
  2. DML(Data Manipulation Language)
    • 这是数据操作语言,作用是对数据库表中的数据进行增加、删除和修改操作。例如,当有新用户注册时,使用DML语句将用户信息插入到用户表中;当用户修改自己的信息时,使用DML语句更新表中的相关记录;当用户注销账号时,使用DML语句删除表中的用户记录。
  3. DQL(Data Query Language)
    • 数据查询语言,用来查询数据库中表的记录。它是最常用的SQL部分之一,通过各种查询条件和操作符,可以从数据库中获取想要的数据。例如,可以查询满足特定条件的用户列表、统计某个表中的数据数量等。
  4. DCL(Data Control Language)
    • 数据控制语言,用于创建数据库用户并控制数据的访问权限。在多用户的数据库环境中,DCL可以确保不同用户只能访问他们被授权的数据,保障数据的安全性和完整性。

三、DDL相关操作

  1. 数据库操作 - 查询
    • 若要查询所有数据库,可以使用“SHOW DATABASES;”或者“show databases;”语句。执行该语句后会显示出所有的数据库。这在数据库管理中非常有用,例如当你不确定系统中有哪些数据库存在时,可以先使用这个语句来查看。示例:
SHOW DATABASES;
  • 查询当前数据库则使用“SELECT DATABASE();”或者“select database();”语句,执行后会显示当前所在的数据库。这在编写需要与当前数据库交互的脚本时很重要,因为知道当前数据库可以避免错误地操作其他数据库。示例:
SELECT DATABASE();
  1. 数据库操作 - 创建
    • 创建数据库的语句为“CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHAREST 字符集] [COLLATE 排序规则]”,其中方括号中的内容是可选的。这一语句可以根据需求创建数据库,并且可以通过可选内容来设置字符集和排序规则等属性。例如,创建一个名为“test_db”的数据库,设置字符集为UTF8:
CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET UTF8;
  1. 数据库操作 - 修改
    • 要修改数据库的属性,例如修改字符集,可以使用“ALTER DATABASE 数据库名 [CHARACTER SET 新字符集] [COLLATE 新排序规则]”语句。这在需要对数据库的编码或排序方式进行调整时非常必要,比如当数据库需要支持更多语言字符时,可能需要将字符集修改为更广泛的编码方式。例如,将“test_db”的字符集修改为UTF8MB4:
ALTER DATABASE test_db CHARACTER SET UTF8MB4;
  1. 数据库操作 - 删除
    • 如果要删除一个数据库,可以使用“DROP DATABASE [IF EXISTS] 数据库名”语句。“IF EXISTS”选项同样是为了避免在数据库不存在时产生错误,在清理不再需要的数据库时使用。不过在执行删除操作时要特别小心,因为一旦执行,数据库中的所有数据和结构都将被永久删除。例如,删除名为“test_db”的数据库:
DROP DATABASE IF EXISTS test_db;
  1. 表操作 - 查询
    • 要查询数据库中的表,可以在特定数据库下使用“SHOW TABLES;”语句。这有助于快速了解一个数据库中包含哪些表,例如在对一个新接手的数据库进行初步探索时。示例:
-- 假设当前在名为'my_database'的数据库下
SHOW TABLES;
  • 若要查看表的结构,包括列名、数据类型、键等信息,可以使用“DESCRIBE 表名;”或者“SHOW COLUMNS FROM 表名;”语句。这在对表进行操作前,了解表的结构是非常重要的,比如在编写数据插入或更新语句时。例如,查看名为“users”表的结构:
DESCRIBE users;
  1. 表操作 - 创建
    • 创建表的语句结构为“CREATE TABLE 表名 (列名1 数据类型 [约束条件], 列名2 数据类型 [约束条件], …)”。例如,创建一个用户表可以是“CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT)”,其中“id”列是自增的主键,“name”列是字符串类型,“age”列是整数类型。示例:
CREATE TABLE products (product_id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(100),price DECIMAL(10, 2)
);
  1. 表操作 - 修改
    • 对表进行修改可以使用“ALTER TABLE 表名”语句,后面可以跟添加列、修改列的数据类型、删除列等操作。例如,要给用户表添加一个新的列“email VARCHAR(100)”,可以使用“ALTER TABLE users ADD COLUMN email VARCHAR(100)”语句。示例:
    • 给“products”表添加一个“description”列:
ALTER TABLE products ADD COLUMN description VARCHAR(200);
  • 修改“products”表中“price”列的数据类型为DECIMAL(8, 2):
ALTER TABLE products MODIFY COLUMN price DECIMAL(8, 2);
  • 删除“products”表中的“description”列:
ALTER TABLE products DROP COLUMN description;
  1. 表操作 - 删除
    • 若要删除一个表,可以使用“DROP TABLE [IF EXISTS] 表名”语句。同样,“IF EXISTS”是为了避免表不存在时产生错误,在删除不再需要的表时使用。例如,删除名为“products”的表:
DROP TABLE IF EXISTS products;

http://www.mrgr.cn/news/58089.html

相关文章:

  • 利用 Google AI 工具提升应用智能化:ML Kit、TensorFlowLite、Cloud Vision、AutoML、Gemini
  • 论文《Text2SQL is Not Enough: Unifying AI and Databases with TAG》
  • 在 typescript 中,如何封装一个 class 类来接收接口的响应数据
  • 深入解析Golang GMP
  • 指针进阶(三)(C 语言)
  • 交换机:端口安全与访问控制指南
  • 我毕业后的8年嵌入式工作
  • 1024玩码神挑战赛,太太太上头了!!!
  • 虚拟机配置静态IP地址(人狠话不多简单粗暴)
  • Lucas带你手撕机器学习——朴素贝叶斯
  • 微知SOP-定位Linux crash问题的几个常用方面和常用命令?
  • php命令执行的一些执行函数----以ctfshow靶场为解题思路
  • 超级加速:轻松发现开源项目的终极秘籍
  • 文本相似度方案
  • 【OS】2.1.2 进程的状态与转换_进程的组织
  • 关闭或开启Win11系统的自动更新
  • 软件部署-Docker容器化技术(二)
  • Electron调用nodejs的cpp .node扩展【安全】
  • 【软件工程】软件项目管理/工程项目管理复习资料
  • 案例研究|DataEase嵌入式版助力软件开发商提升行业软件交付效率
  • SAM:Segment Anything
  • LSTM(Long Short-Term Memory,长短期记忆网络)在高端局效果如何
  • 新增Python运行环境、支持病毒扫描和计划任务短信告警,1Panel开源面板v1.10.20 LTS版本发布
  • 《计算机视觉》—— 换脸
  • 等差数列、等间距数据、等间隔数字、时间序列生成 by range(), arange(), linspace(), logspace()
  • Java-内部类