-- 创建订单表CREATETABLE Orders (
order_id INTPRIMARYKEY,
user_id VARCHAR(255),
amount DECIMAL(10,2),
order_date DATE);-- 内连接(显示匹配记录)-- 语法SELECTcolumnsFROM table1
INNERJOIN table2
ON table1.column= table2.column;-- 实例SELECT u.user_name, o.order_id, o.order_date
FROMUser u
INNERJOIN Orders o
ON u.user_id = o.user_id;-- 左连接(保留所有左表记录)SELECT u.user_name, o.order_id
FROMUser u
LEFTJOIN Orders o
ON u.user_id = o.user_id;-- 多表连接(连接三个表)SELECT u.user_name, o.order_id, p.product_name
FROMUser u
JOIN Orders o ON u.user_id = o.user_id
JOIN Products p ON o.product_id = p.product_id;
4、子查询
-- 在WHERE中使用子查询-- 查找订单金额高于平均值的用户SELECT user_name
FROMUserWHERE user_id IN(SELECT user_id
FROM Orders
WHERE amount >(SELECTAVG(amount)FROM Orders));-- 在FROM中使用子查询SELECT sub.address, sub.avg_age
FROM(SELECT address,AVG(age)as avg_age
FROMUserGROUPBY address
) sub
WHERE avg_age >25;
5、窗口函数
-- 给用户按年龄排序添加行号-- 语法SELECT column_name,
window_function()OVER(PARTITIONBYcolumnORDERBYcolumn)FROM table_name;-- 实例SELECT user_name, age,
ROW_NUMBER()OVER(ORDERBY age DESC)as rank,
RANK()OVER(ORDERBY age DESC)as dense_rank
FROMUser;-- 计算各地区的累计订单金额SELECT o.order_date, o.amount,SUM(o.amount)OVER(PARTITIONBY u.address ORDERBY o.order_date)as running_total
FROM Orders o
JOINUser u ON o.user_id = u.user_id;
6、公用表表达式(CTE)
-- 使用WITH创建临时结果集-- 语法WITH cte_name AS(SELECTcolumnsFROMtable)SELECT*FROM cte_name;-- 实例WITH HighValueUsers AS(SELECT user_id
FROM Orders
GROUPBY user_id
HAVINGSUM(amount)>10000)SELECT u.*FROMUser u
JOIN HighValueUsers h ON u.user_id = h.user_id;
7、分页查询
-- MySQL分页实现-- 语法SELECTcolumnsFROMtableLIMIT row_count OFFSEToffset;-- 实例SELECT user_name, age
FROMUserORDERBY age DESCLIMIT10OFFSET20;-- 跳过前20条取10条(第3页)-- SQL Server分页SELECT user_name, age
FROMUserORDERBY age DESCOFFSET20ROWSFETCHNEXT10ROWS ONLY;
8、条件表达式(CASE)
-- 用户年龄段分类SELECT user_name, age,CASEWHEN age <20THEN'青少年'WHEN age BETWEEN20AND30THEN'青年'ELSE'中年以上'ENDas age_group
FROMUser;-- 配合聚合函数使用SELECTSUM(CASEWHEN age <20THEN1ELSE0END)as teen_count,SUM(CASEWHEN age >=60THEN1ELSE0END)as senior_count
FROMUser;