SQL语句面试问答(四)

一、单表查询

1、基础查询

1)查询所有列

SELECT * FROM TableName;

2)查询特定列

SELECT Column1, Column2 FROM TableName;

3) 列别名

SELECT Column1 AS name1, Column2 AS name2 FROM TableName;

4) 去重查询

SELECT DISTINCT Column1 FROM TableName;

5)限制返回行数

SELECT  FROM TableName LIMIT 10;

6)分页查询

SELECT  FROM TableName 
LIMIT 10 -- 限制返回结果的数量为 10 条记录
OFFSET 20; -- 跳过查询结果的前 20 条记录

7) 排序查询

SELECT * FROM TableName ORDER BY Column1 DESC;

8) 多列排序

SELECT * FROM TableName ORDER BY Column1 DESC, Column2 ASC;
-- DESC 排序从大到小,ASC 排序从小到大

2、数据过滤

1) 基础过滤

SELECT * FROM TableName WHERE Column1 > value1; 
-- >, <, >=, <=,!=,=

2) 多条件过滤

SELECT * FROM TableName WHERE Column1 > value1 AND Column2 > value2;
SELECT * FROM TableName WHERE Column1 > value1 OR Column2 > value2;

3)范围查询

SELECT * FROM TableName WHERE Column1 BETWEEN value1 AND value2;

4) IN操作符

SELECT * FROM TableName WHERE Column1 IN (value1, value2,value3); 

5)模糊查询

SELECT * FROM TableName WHERE Column1 LIKE '%value%';-- 匹配值中间为value
SELECT * FROM TableName WHERE Column1 LIKE '%value';-- 匹配值以value结尾
SELECT * FROM TableName WHERE Column1 LIKE 'value%';-- 匹配值以value开头

6) NULL值判断

SELECT * FROM TableName WHERE Column1 IS NULL;           

7)排除特定值

SELECT * FROM TableName WHERE Column1 != value;

3、聚合函数

1) 计算总数

SELECT COUNT(*) AS cnt FROM TableName WHERE column1 = value;

2)分组求和

SELECT column1 AS col1. SUM(column2) AS col2 FROM TableName GROUP BY column1;

3)分组平均值

SELECT column1 AS col1, AVG(column2) AS col2 FROM TableName GROUP BY column1;

4) 分组最大值

SELECT column1 AS col1, MAX(column2) AS col2 FROM TableName GROUP BY column1;

5) 分组最小值

SELECT column1 AS col1, MIN(column2) AS co12 FROM TableName GROUP BY column1;

6) 分组筛选(HAVING)

SELECT column1 AS col1, SUM(column2) AS col2 FROM TableName            
WHERE column3=value HAVING SUM(column2) > value;

7) 多列分组

SELECT column1 AS col1, column1 AS col2, SUM(column3) AS col3 FROM TableName
GROUP BY column1, column2;

4、高级窗口函数

1)ROW_NUMBER 生成唯一序号

SELECT column1, column2, ROW_NUMBER() OVER (ORDER BY column2) AS row FROM TableName;

2) RANK 与 DENSE_RANK 排名

SELECT column1, column2, RANK() OVER (ORDER BY column2 DESC) AS rank, 
DENSE_RANK() OVER (ORDER BY column2 DESC) AS dense_rank FROM TableName;

3) 累计百分比计算

SELECT column1, column2, SUM(column2) OVER (ORDER BY column1) / SUM(column2) 
OVER() AS cumulative_percent FROM TableName;

4)移动平均(最近三个窗口)

SELECT column1, column2,AVG(column2) OVER (ORDER BY column1 ROWS BETWEEN 2
PRECEDING AND CURRENT ROW) AS moving_avg FROM TableName;

5)分组内前N名

SELECT * FROM
 (SELECT column1, column2, column3, ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY
column2 DESC) AS rn 
FROM TableName) WHERE In <= 3;

二、多表查询

1、表连接操作

1) 内连接

SELECT t1.column1, t2.column2 FROM Table1 t1
JOIN Table2 t2 ON t1.column3 = t2.column3;

2) 左连接

SELECT t1.column1, t2.column2 FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.column3 = t2.column3;

3) 右连接

SELECT t1.column1, t2.column2 FROM Table1 t1
RIGHT JOIN Table2 t2 ON t1.column3 = t2.column3;

4) 全外连接

SELECT t1.column1, t2.column2 FROM Table1 t1
FULL OUTER JOIN Table2 t2 ON t1.column3 = t2.column3;

5) 自连接

SELECT t1.column as column1, t2.column as column2
FROM Table1 t1 JOIN Table1 t2 ON t1.column1=t2.column2;

6) 交叉连接

SELECT * FROM Colors CROSS JOIN Sizes;

2、子查询

1)标量子查询

SELECT column1, (SELECT COUNT(*) FROM TableB 
WHERE column2= a.column2) AS cnt FROM TableA a;

2) IN子查询

SELECT column1 FROM TableA
WHERE column2 IN 
(SELECT column2 FROM Categories WHERE Name= 'xxxxxxx');

3)EXISTS子查询

SELECT column1 FROM TableA a  
WHERE EXISTS (SELECT 1 FROM TableB WHERE column2 = a.column2);

4)子查询作为派生表

SELECT AVG(sum) AS avg  
FROM (SELECT SUM(column2) AS sum FROM TABLEA GROUP BY column1) AS t;

5)多条件子查询

SELECT column1, column2 FROM TableA  
WHERE column2 > (SELECT AVG(column2) FROM TableA);

3、联合查询部分

1)去重联合(UNION(去重))

SELECT column1 FROM TableA UNION SELECT column1 FROM TableB;

2)不去重联合(UNION ALL(保留重复))

SELECT column1 FROM TableA UNION ALL SELECT column1 FROM TableB;

三、常用函数

1、字符串处理

1)字符串长度

SELECT LENGTH(column1) FROM TableName;

2)字符串截取(SUBSTRING(字符串, 起始位置, 截取长度))

SELECT SUBSTRING (, start, length) FROM TableName;

3)字符串替换

SELECT REPLACE(column1, 'old_string', 'new_string') FROM TableName;

4)字符串拼接

SELECT CONCAT(column1, column2) FROM TableName;

5)字符串转大写

SELECT UPPER(column_name) FROM TableName;

6)字符串转小写

SELECT LOWER(column_name) FROM TableName;

2、时间日期函数

1)当前时间

SELECT CURTIME();

2)当前日期

SELECT CURDATE();

3)当前日期和时间

SELECT NOW();

4)日期向后加天数

SELECT DATE_ADD(NOW(), INTERVAL 10 DAY);

5)日期减天数

SELECT DATE_SUB(NOW(), INTERVAL 10 DAY);

6)获取两个日期差值

SELECT DATEDIFF(date1, date2);

7)获取日期年份

SELECT YEAR(date) FROM TableName;

8)获取月份

SELECT MONTH(date) FROM TableName;

9)获取日

SELECT DAY(date) FROM TableName;

10)获取小时

SELECT HOUR(time_column) FROM TableName;

11)获取分钟

SELECT MINUTE(time_column) FROM TableName;

12)获取秒

SELECT SECOND(time_column) FROM TableName;

13)获取周数(一年中的第几周)

SELECT WEEK(date_column) FROM TableName;
-- 可添加模式参数:WEEK(date_column, 0)(0-周日开始,1-周一开始)

14)日期转字符串

SELECT DATE_FORMAT(date_column, '%Y-%m-%d') FROM TableName;

-- 常用格式:
-- %Y:4位年份
-- %m:月份(01-12)
-- %d:日(01-31)
-- %H:%i:%s:时分秒

15)字符串转日期

SELECT CAST(string_column AS DATE) FROM TableName;

SELECT STR_TO_DATE('2023-01-15', '%Y-%m-%d');

四、常用操作

1、数据操作

1)插入单条数据

INSERT INTO TableName (Column1, Column2) VALUES (value1, value2);

2)插入多条数据(批量插入)

INSERT INTO TableName (Column1, Column2) VALUES (value1, value2), (value3, value4);

3)更新数据(带条件)

UPDATE TableName SET Column1 = value1 WHERE Column2 = value2;

4)条件删除数据

DELETE FROM Orders WHERE OrderDate < '2020-01-01';

5)全表删除(保留表结构)

DELETE FROM TempData;

6)清空表数据(高效重置)

TRUNCATE TABLE Logs;
-- 特点:不可回滚,重置自增计数器,不触发DELETE触发器*

2、表操作

1)创建新表

CREATE TABLE TableName (
    column1 INT PRIMARY KEY,
    column2 VARCHAR(50),
    column3 DATE
);

2)添加新列

ALTER TABLE TableName ADD COLUMN new_column INT;

3)修改列类型

ALTER TABLE TableName MODIFY COLUMN column1 VARCHAR(20);
-- MySQL语法,其他数据库可能使用 ALTER COLUMN

4)删除列

ALTER TABLE TableName DROP COLUMN column1;

5)重命名表

ALTER TABLE TableName RENAME TO NewTableName;
-- SQL Server使用 sp_rename,Oracle使用 RENAME

6)删除表

DROP TABLE TableName;
--  将同时删除表结构和数据

3、约束与索引

1)添加主键约束

ALTER TABLE TableName ADD PRIMARY KEY (column1);

2)添加唯一约束

ALTER TABLE TableName ADD UNIQUE (column1);

3)添加外键约束(补充)

ALTER TABLE Orders 
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES Customers(id);
-- 注:确保被引用列(column2)是主键或唯一键

4)创建索引

CREATE INDEX idx_column ON TableName (column1);

-- 扩展为复合索引
CREATE INDEX idx_multi ON TableName (column1, column2);

5)删除索引

DROP INDEX idx_column1 ON TableName;

-- 不同数据库语法差异:
-- PostgreSQL/Oracle: DROP INDEX idx_column1;
-- SQL Server: DROP INDEX TableName.idx_column1;

6)设置非空约束

ALTER TABLE TableName MODIFY COLUMN column1 VARCHAR(100) NOT NULL;

7)移除非空约束

ALTER TABLE TableName MODIFY COLUMN column1 VARCHAR(100) NULL;

4、视图

1)创建视图

CREATE VIEW ViewName AS SELECT column1, column2 FROM TableName WHERE condition;

-- 添加计算列
CREATE VIEW SalesSummary AS
SELECT product_id, SUM(quantity) AS total_qty FROM Orders GROUP BY product_id;

2)通过视图更新数据

UPDATE ViewName SET column1 = 'value' WHERE condition;
-- 限制:视图必须满足可更新条件(不包含聚合、DISTINCT等)

3)删除视图

DROP VIEW IF EXISTS ViewName;

5、事务控制

1)开启事务

START TRANSACTION;

-- 使用数据库特定语法:
-- SQL Server: BEGIN TRANSACTION
-- Oracle: SET TRANSACTION

2)提交事务

COMMIT;
-- 确认所有操作永久生效

3)回滚事务

ROLLBACK;
-- 撤销事务内所有未提交的操作

4)设置保存点

SAVEPOINT savepoint1;
-- 在事务中创建回滚标记点

5)回滚到保存点

ROLLBACK TO savepoint1;
-- 撤销保存点之后的操作,保留之前的操作

6、权限管理

1)授予查询权限

-- 允许user1读取指定表数据
GRANT SELECT ON TableName TO user1;

2)授予所有权限

-- 权限范围包括:SELECT, INSERT, UPDATE, DELETE等
GRANT ALL PRIVILEGES ON DatabaseName.* TO 'admin'@'localhost';

3)撤销权限

-- 移除user2对指定表的删除权限
REVOKE DELETE ON TableName FROM user2;

7、其他操作

1)列出所有数据库

SHOW DATABASES;

-- MySQL语法,其他数据库等效命令:
-- SQL Server: SELECT name FROM sys.databases
-- PostgreSQL: \l (psql命令行)
-- Oracle: SELECT * FROM v$database

2)列出当前数据库所有表

SHOW TABLES;

-- 查看指定数据库的表:
SHOW TABLES FROM database_name;

3)查看表结构

DESCRIBE TableName;

-- 等效命令:
-- MySQL: DESC TableName
-- SQL Server: sp_help 'TableName'
-- PostgreSQL: \d TableName

4)查看建表语句

SHOW CREATE TABLE TableName;
-- 输出结果包含完整DDL语句,可用于表重建

5)查询表的所有列

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'database_name' 
  AND TABLE_NAME = 'table_name';

6)查看表索引信息

SHOW INDEX FROM TableName;

-- 输出字段说明:
-- Non_unique: 是否唯一索引 (0=唯一, 1=非唯一)
-- Key_name: 索引名称
-- Seq_in_index: 索引中的列序号
-- Column_name: 索引列名

7)查询表存储大小

SELECT 
  table_name AS 'Table',
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'  -- 修正原图的LEMETH拼写错误
FROM information_schema.TABLES
WHERE table_schema = 'database_name';

-- (data_length + index_length)  -- 数据大小 + 索引大小(字节)
-- / 1024 / 1024                 -- 转换为MB
-- ROUND(..., 2)                 -- 保留2位小数

-- SQL Server查看表大小
EXEC sp_spaceused 'TableName';

-- PostgreSQL查看表大小
SELECT pg_size_pretty(pg_total_relation_size('TableName'));

8)设置会话时区

SET time_zone = 'Asia/Shanghai';

SET time_zone = '+8:00';  -- 东八区偏移量表示

9)创建数据库

CREATE DATABASE database_name 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

CREATE DATABASE inventory 
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_0900_ai_ci;  -- MySQL 8.0+推荐排序规则

10)删除数据库

DROP DATABASE IF EXISTS database_name;

-- Oracle等效命令:
DROP USER schema_name CASCADE;  -- Oracle中数据库用户即schema

测试岗面经 文章被收录于专栏

整理面试过程中的测试问答,常看常新,多多学习!有些问题是从其他人那里转载而来,会在文章下面注明出处,希望大家多多支持~~

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务