面试题:基础的sql命令
基础的 SQL 命令主要用于对数据库进行查询、新增、修改、删除等操作,可分为以下几类:
一、数据查询(SELECT)
用于从表中获取数据,是最常用的命令。
基本语法:
SELECT 列名1, 列名2... FROM 表名 WHERE 条件;
- 示例:查询
students
表中所有 18 岁以上的学生姓名和年龄SELECT name, age FROM students WHERE age > 18;
- 常用扩展:
DISTINCT
(去重)、ORDER BY
(排序)、LIMIT
(限制结果数量)等。
我来扩写这个 SQL 查询,加入 DISTINCT、ORDER BY 和 LIMIT 等常用扩展功能:
-- 查询18岁以上不重复的学生姓名和年龄,按年龄降序排列,年龄相同的按姓名升序排列,只返回前20条记录
SELECT DISTINCT name, age
FROM students
WHERE age > 18
ORDER BY age DESC, name ASC
LIMIT 20;
这个扩展查询包含以下功能:
DISTINCT
- 确保返回的结果中没有重复的行WHERE age > 18
- 筛选条件,只返回18岁以上的学生ORDER BY age DESC, name ASC
- 先按年龄降序排列,年龄相同的再按姓名升序排列LIMIT 20
- 只返回前20条记录
如果需要更复杂的查询,还可以考虑:
添加 GROUP BY 进行分组
使用 HAVING 对分组结果进行筛选
使用 JOIN 连接其他表
添加 OFFSET 实现分页功能
我将扩展这个 SQL 查询,加入 GROUP BY、HAVING、JOIN 和 OFFSET 分页功能,同时保持之前的 DISTINCT、ORDER BY 和 LIMIT 条件:
假设场景:
students
表存储学生信息(id
,name
,age
,class_id
)classes
表存储班级信息(id
,class_name
,teacher_id
)exam_scores
表存储考试成绩(student_id
,score
)
查询目标:
"查询18岁以上、平均分≥60分的学生姓名、年龄和班级名称,按年龄降序排列,并实现分页(每页10条记录)"
完整 SQL:
SELECT s.name,s.age,c.class_name,AVG(e.score) AS avg_score
FROM students s
LEFT JOIN classes c ON s.class_id = c.id
LEFT JOIN exam_scores e ON s.id = e.student_id
WHERE s.age > 18
GROUP BY s.id, s.name, s.age, c.class_name
HAVING AVG(e.score) >= 60
ORDER BY s.age DESC,s.name ASC
LIMIT 10 OFFSET 0; -- 第一页(0-10条记录)
关键功能说明:
JOIN(连接表):
连接
students
和classes
获取班级名称连接
students
和exam_scores
计算平均分
GROUP BY(分组):
按学生ID、姓名、年龄和班级名称分组
确保聚合函数(如
AVG
)正确计算每个学生的平均分
HAVING(筛选分组):
筛选出平均分≥60的学生(
WHERE
不能用于聚合条件)
DISTINCT(去重):
由于
GROUP BY
已经确保唯一性,这里可以省略DISTINCT
ORDER BY(排序):
优先按年龄降序(
DESC
),其次按姓名升序(ASC
)
LIMIT + OFFSET(分页):
LIMIT 10
每页10条OFFSET 0
从第1条开始(第2页改为OFFSET 10
)
进阶扩展:
如果需要计算总页数,可结合
COUNT(*) OVER()
窗口函数:SELECT s.name,s.age,c.class_name,AVG(e.score) AS avg_score,COUNT(*) OVER() AS total_count FROM ...
二、数据插入(INSERT)
用于向表中新增记录。
基本语法:
INSERT INTO 表名 (列名1, 列名2...) VALUES (值1, 值2...);
- 示例:向
students
表插入一条新记录INSERT INTO students (name, age, gender) VALUES ('张三', 20, '男');
三、数据更新(UPDATE)
用于修改表中已有记录。
基本语法:
- 示例:将
students
表中id=1
的学生年龄改为 21UPDATE students SET age=21 WHERE id=1;
注意:若省略WHERE
,会修改表中所有记录,需谨慎使用。
四、数据删除(DELETE)
用于删除表中的记录。
基本语法:
- 示例:删除
students
表中age < 18
的记录DELETE FROM students WHERE age < 18;
注意:若省略WHERE
,会删除表中所有记录(表结构保留)。
五、表结构操作
1. 创建表(CREATE TABLE)
sql
CREATE TABLE 表名 (列名1 数据类型 约束,列名2 数据类型 约束...
);
- 示例:创建
students
表CREATE TABLE students (id INT PRIMARY KEY, -- 主键(唯一标识)name VARCHAR(50) NOT NULL, -- 非空age INT );
2. 删除表(DROP TABLE)
DROP TABLE 表名; -- 彻底删除表(包括结构和数据)
3. 修改表结构(ALTER TABLE)
- 新增列:
ALTER TABLE 表名 ADD 列名 数据类型;
- 删除列:
ALTER TABLE 表名 DROP COLUMN 列名;
六、其他常用命令
DESCRIBE 表名;
(或DESC 表名;
):查看表结构。USE 数据库名;
:切换到指定数据库。SHOW DATABASES;
:查看所有数据库。SHOW TABLES;
:查看当前数据库中的所有表。
这些命令覆盖了 SQL 的核心操作,掌握后可完成大部分基础数据库交互。
左链接,右链接的区别
右链接:最大的条数取决于右边
左链接:最大的条数取决于左边