标准SQL基础语句-数据查询语言(DQL)

225 阅读4分钟

前言

SQL(Structured Query Language)是用于管理关系型数据库的标准语言,主要分为以下几类:

  1. 数据查询语言(DQL) :SELECT
  2. 数据操作语言(DML) :INSERT, UPDATE, DELETE
  3. 数据定义语言(DDL) :CREATE, ALTER, DROP
  4. 数据控制语言(DCL) :GRANT, REVOKE
  5. 事务控制语言(TCL) :COMMIT, ROLLBACK

基础SQL语句-数据查询语言

  1. SELECT 语句(基础查询)

    SELECT语句用于从数据库表中检索数据,是最常用的SQL语句。

    基本语法:

    SELECT column1, column2, ...
    FROM table_name;
    

    练习:

    假设有一个students表,包含id, name, age, major列,请写出
    --查询所有学生姓名和专业
    select name, major from students;
    --查询所有学生信息
    select * from students;
    
    • SQL关键字(如SELECT, FROM)通常建议大写以提高可读性,但小写也是可以正常执行的
  2. SELECT 语句与WHERE语句

    WHERE子句用于过滤记录,只返回满足指定条件的行。 基本语法:

    SELECT column1, column2, ...
    FROM table_name
    WHERE condition;
    
    • WHERE子句必须放在FROM子句之后
    • 可以使用比较运算符:=, <>, >, <, >=, <=
    • 可以使用逻辑运算符:AND, OR, NOT
    • 字符串值需要用单引号括起来

    练习:

    假设有一个students表,包含id, name, age, major列,请写出
    --查询年龄大于20岁的学生姓名和专业
    SELECT name, major FROM students WHERE age > 20
    --查询主修"Computer Science"的所有学生信息
    SELECT * FROM students WHERE major = 'Computer Science'
    --查询年龄在18到22岁之间(包含18和22)且主修不是"Mathematics"的学生姓名
    SELECT name FROM students WHERE age >= 18 AND age <= 22 AND major <> 'Mathematics'
    
    • BETWEEN语法可以简化年龄范围查询:age BETWEEN 18 AND 22
    • 不等号也可以用!=代替<>
  3. ORDER BY排序子句

    ORDER BY 子句用于对结果集进行排序,可以按一个或多个列排序,并指定升序(ASC)或降序(DESC)。 基本语法:

    SELECT column1, column2, ...
    FROM table_name
    [WHERE condition]
    ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
    
    • ASC 表示升序(默认,可省略),DESC 表示降序
    • 可以按多列排序,先按第一个列排序,相同值再按第二个列排序
    • 可以按列名、列序号(从1开始)或表达式排序
    • NULL 值的排序位置取决于数据库系统(通常NULL被视为最小值)

    练习:

    使用`students`表(包含id, name, age, major列),请写出:
    --按学生年龄从大到小排序显示所有学生信息
    SELECT * FROM students ORDER BY age DESC
    --查询主修"Computer Science"的学生,按姓名升序排列
    SELECT * FROM students WHERE major='Computer Science' ORDER BY name ASC
    --先按专业升序排列,同专业再按年龄降序排列,显示姓名、专业和年龄
    SELECT name, major, age FROM students ORDER BY major ASC, age DESC
    
    • ASC可以省略,因为它是默认排序方式
    • 进阶知识:——待学
      • 可以按SELECT子句中未包含的列排序
      • 可以按列位置排序(如ORDER BY 2表示按第二列排序)
      • NULL值的排序行为:通常NULL会排在最后(DESC时排在最前)
  4. LIMIT/OFFSET子句(限制返回行数)

    LIMIT和OFFSET用于分页查询,控制返回的行数和起始位置。 基本语法:

    -- 限制返回行数
    SELECT * FROM table_name LIMIT number;
    -- 分页查询(跳过前offset行,返回limit行)
    SELECT * FROM table_name LIMIT limit OFFSET offset;
    -- 替代语法(MySQL支持)
    SELECT * FROM table_name LIMIT offset, limit;
    
    • 不同数据库语法略不同
    • OFFSET 0可省略
    • 常用于分页显示数据

    练习:

    使用`students`表:
    --查询年龄最大的5名学生
    SELECT * FROM students ORDER BY age DESC LIMIT 5
    --查询第6到第15名学生(按姓名排序)
    SELECT * FROM students ORDER BY name LIMIT 10 OFFSET 5
    
  5. 聚合函数(COUNT, SUM, AVG等)

    聚合函数对一组值执行计算并返回单个值,常与GROUP BY配合使用。

    常用聚合函数:

    • COUNT() - 计数
    • SUM() - 求和
    • AVG() - 平均值
    • MAX() - 最大值
    • MIN() - 最小值

    基本语法:

    SELECT AGG_FUNC(column_name)
    FROM table_name
    [WHERE condition];
    
    • COUNT(*)计算所有行数,COUNT(column)计算非NULL值
    • 聚合函数会忽略NULL值
    • 可以与WHERE条件结合使用

    练习:

    使用`students`表:
    --计算主修"Mathematics"的学生人数
    SELECT COUNT(*) FROM students WHERE major='Mathematics'
    --查询所有学生的平均年龄
    SELECT AVG(age) FROM students
    --找出年龄最小的学生姓名和年龄(提示:需要子查询)
    SELECT name, age FROM students WHERE MIN(age)    ×不能在WHERE子句中直接使用聚合函数
    需要子查询:SELECT name, age FROM students WHERE age = (SELECT MIN(age) FROM students)
    或
    使用ORDER BY和LIMIT:SELECT name, age FROM students ORDER BY age ASC LIMIT 1
    
    • 聚合函数不能直接用在WHERE子句中,这是SQL的一个重要规则

    • 要在条件中使用聚合结果,必须使用子查询——待学

    • 获取极值对应的记录时,ORDER BY + LIMIT是更简洁的方案