SQL基础语法

2024/1/1

# SQL基础语法

点击勘误issues (opens new window),哪吒感谢大家的阅读

# 什么是SQL

SQL(Structured Query Language)结构化查询语言,是一种用于管理关系数据库的标准语言。SQL可以用来查询、插入、更新和删除数据库中的数据。

# SQL语句分类

# 1. DDL(Data Definition Language)数据定义语言

用于定义数据库结构,包括创建、修改和删除数据库对象。

-- 创建数据库
CREATE DATABASE company;

-- 创建表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    salary DECIMAL(10,2),
    hire_date DATE
);

-- 修改表结构
ALTER TABLE employees ADD COLUMN department VARCHAR(50);

-- 删除表
DROP TABLE employees;

# 2. DML(Data Manipulation Language)数据操作语言

用于操作表中的数据,包括插入、更新和删除。

-- 插入数据
INSERT INTO employees (name, email, salary, hire_date) 
VALUES ('张三', 'zhangsan@example.com', 8000.00, '2024-01-01');

-- 更新数据
UPDATE employees 
SET salary = 9000.00 
WHERE name = '张三';

-- 删除数据
DELETE FROM employees 
WHERE id = 1;

# 3. DQL(Data Query Language)数据查询语言

用于查询数据库中的数据。

-- 基本查询
SELECT * FROM employees;

-- 条件查询
SELECT name, salary 
FROM employees 
WHERE salary > 5000;

-- 排序查询
SELECT * FROM employees 
ORDER BY salary DESC;

# 4. DCL(Data Control Language)数据控制语言

用于控制数据库的访问权限。

-- 创建用户
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

-- 授权
GRANT SELECT, INSERT ON company.* TO 'newuser'@'localhost';

-- 撤销权限
REVOKE INSERT ON company.* FROM 'newuser'@'localhost';

# SQL语法规则

# 1. 基本规则

  • SQL语句不区分大小写,但建议关键字使用大写
  • 每条SQL语句以分号(;)结束
  • 字符串和日期值需要用单引号('')包围
  • 数值不需要引号

# 2. 注释

-- 单行注释
SELECT * FROM employees; -- 这是行末注释

/*
多行注释
可以跨越多行
*/
SELECT name, salary FROM employees;

# 3. 标识符命名规则

  • 数据库名、表名、列名等标识符可以包含字母、数字和下划线
  • 标识符不能以数字开头
  • 避免使用SQL关键字作为标识符
  • 建议使用有意义的名称
-- 好的命名
CREATE TABLE user_profiles (
    user_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    created_at TIMESTAMP
);

-- 避免的命名
CREATE TABLE table1 (
    col1 INT,
    select VARCHAR(50)  -- select是关键字
);

# 常用数据类型

# 1. 数值类型

INT          -- 整数
BIGINT       -- 大整数
DECIMAL(M,D) -- 精确小数
FLOAT        -- 单精度浮点数
DOUBLE       -- 双精度浮点数

# 2. 字符串类型

CHAR(n)      -- 固定长度字符串
VARCHAR(n)   -- 可变长度字符串
TEXT         -- 长文本

# 3. 日期时间类型

DATE         -- 日期 (YYYY-MM-DD)
TIME         -- 时间 (HH:MM:SS)
DATETIME     -- 日期时间 (YYYY-MM-DD HH:MM:SS)
TIMESTAMP    -- 时间戳

# 约束条件

# 1. 主键约束(PRIMARY KEY)

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50)
);

# 2. 外键约束(FOREIGN KEY)

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

# 3. 唯一约束(UNIQUE)

CREATE TABLE users (
    id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE
);

# 4. 非空约束(NOT NULL)

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);

# 5. 检查约束(CHECK)

CREATE TABLE products (
    id INT PRIMARY KEY,
    price DECIMAL(10,2) CHECK (price > 0)
);

# 6. 默认值(DEFAULT)

CREATE TABLE users (
    id INT PRIMARY KEY,
    status VARCHAR(20) DEFAULT 'active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

# 实践练习

# 练习1:创建学生管理系统表

-- 创建学生表
CREATE TABLE students (
    student_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    age INT CHECK (age > 0 AND age < 150),
    email VARCHAR(100) UNIQUE,
    enrollment_date DATE DEFAULT (CURRENT_DATE)
);

-- 创建课程表
CREATE TABLE courses (
    course_id INT PRIMARY KEY AUTO_INCREMENT,
    course_name VARCHAR(100) NOT NULL,
    credits INT DEFAULT 3
);

-- 创建选课表
CREATE TABLE enrollments (
    enrollment_id INT PRIMARY KEY AUTO_INCREMENT,
    student_id INT,
    course_id INT,
    grade DECIMAL(3,1),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

# 练习2:插入示例数据

-- 插入学生数据
INSERT INTO students (name, age, email) VALUES
('张三', 20, 'zhangsan@example.com'),
('李四', 21, 'lisi@example.com'),
('王五', 19, 'wangwu@example.com');

-- 插入课程数据
INSERT INTO courses (course_name, credits) VALUES
('数据库原理', 4),
('Java编程', 3),
('数据结构', 4);

-- 插入选课数据
INSERT INTO enrollments (student_id, course_id, grade) VALUES
(1, 1, 85.5),
(1, 2, 92.0),
(2, 1, 78.5);

# 总结

SQL基础语法是数据库操作的基础,掌握了这些基本概念和语法规则,就可以开始进行简单的数据库操作了。在实际应用中,还需要结合具体的数据库系统(如MySQL、PostgreSQL等)的特性来使用。

# 下一步学习