常用SQL语句大全实例总结-进阶篇

进阶查询操作

1、聚合与分组(GROUP BY + 聚合函数)
-- 统计每个地区的用户数(带分组列)
-- 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column_name;
-- 实例
SELECT address, COUNT(user_id) as user_count 
FROM User 
GROUP BY address;

-- 获取年龄最大的用户信息
-- 语法
SELECT MAX(column_name) FROM table_name;
-- 实例
SELECT MAX(age) FROM User;

-- 同时使用多个聚合函数
SELECT address, 
       AVG(age) as avg_age,
       MIN(age) as min_age,
       MAX(age) as max_age 
FROM User 
GROUP BY address;
2、分组后过滤(HAVING)
-- 筛选用户数超过100的地区
-- 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
-- 实例
SELECT address, COUNT(user_id) as user_count 
FROM User 
GROUP BY address
HAVING COUNT(user_id) > 100;
3、表连接(JOIN)
-- 创建订单表
CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    user_id VARCHAR(255),
    amount DECIMAL(10,2),
    order_date DATE
);

-- 内连接(显示匹配记录)
-- 语法
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
-- 实例
SELECT u.user_name, o.order_id, o.order_date
FROM User u
INNER JOIN Orders o
ON u.user_id = o.user_id;

-- 左连接(保留所有左表记录)
SELECT u.user_name, o.order_id
FROM User u
LEFT JOIN Orders o
ON u.user_id = o.user_id;

-- 多表连接(连接三个表)
SELECT u.user_name, o.order_id, p.product_name
FROM User 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 
FROM User
WHERE user_id IN (
    SELECT user_id
    FROM Orders
    WHERE amount > (SELECT AVG(amount) FROM Orders)
);

-- 在FROM中使用子查询
SELECT sub.address, sub.avg_age
FROM (
    SELECT address, AVG(age) as avg_age
    FROM User
    GROUP BY address
) sub
WHERE avg_age > 25;
5、窗口函数
-- 给用户按年龄排序添加行号
-- 语法
SELECT column_name,
       window_function() OVER (PARTITION BY column ORDER BY column)
FROM table_name;
-- 实例
SELECT user_name, age,
       ROW_NUMBER() OVER (ORDER BY age DESC) as rank,
       RANK() OVER (ORDER BY age DESC) as dense_rank
FROM User;

-- 计算各地区的累计订单金额
SELECT o.order_date, o.amount,
       SUM(o.amount) OVER (PARTITION BY u.address ORDER BY o.order_date) 
       as running_total
FROM Orders o
JOIN User u ON o.user_id = u.user_id;
6、公用表表达式(CTE)
-- 使用WITH创建临时结果集
-- 语法
WITH cte_name AS (
    SELECT columns
    FROM table
)
SELECT * FROM cte_name;
-- 实例
WITH HighValueUsers AS (
    SELECT user_id 
    FROM Orders
    GROUP BY user_id
    HAVING SUM(amount) > 10000
)
SELECT u.* 
FROM User u
JOIN HighValueUsers h ON u.user_id = h.user_id;
7、分页查询
-- MySQL分页实现
-- 语法
SELECT columns
FROM table
LIMIT row_count OFFSET offset;
-- 实例
SELECT user_name, age
FROM User
ORDER BY age DESC
LIMIT 10 OFFSET 20;  -- 跳过前20条取10条(第3页)

-- SQL Server分页
SELECT user_name, age
FROM User
ORDER BY age DESC
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;
8、条件表达式(CASE)
-- 用户年龄段分类
SELECT user_name, age,
       CASE
           WHEN age < 20 THEN '青少年'
           WHEN age BETWEEN 20 AND 30 THEN '青年'
           ELSE '中年以上'
       END as age_group
FROM User;

-- 配合聚合函数使用
SELECT 
    SUM(CASE WHEN age < 20 THEN 1 ELSE 0 END) as teen_count,
    SUM(CASE WHEN age >= 60 THEN 1 ELSE 0 END) as senior_count
FROM User;
sql最全的常用命令语句 询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前10名其他等待类型 SELECT TOP 10 * from sys.dm_os_wait_stats ORDER BY wait_time_ms DESC SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%' OR wait_type like 'LAZYWRITER_SLEEP%' --CPU的压力 SELECT scheduler_id, current_tasks_count, runnable_tasks_count FROM sys.dm_os_schedulers WHERE scheduler_id 500 begin select text,CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) from master.sys.sysprocesses a end select text,a.* from master.sys.sysprocesses a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) where a.spid = '51' dbcc inputbuffer(53) with tb as ( select blocking_session_id, session_id,db_name(database_id) as dbname,text from master.sys.dm_exec_requests a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) ), tb1 as ( select a.*,login_time,program_name,client_interface_name,login_name,cpu_time,memory_usage*8 as 'memory_usage(KB)', total_scheduled_time,reads,writes,logical_reads from tb a inner join master.sys.dm_exec_sessions b on a.session_id=b.session_id ) select a.*,connect_time,client_tcp_port,client_net_address from tb1 a inner join master.sys.dm_exec_connections b on a.session_id=b.session_id --当前进程数 select * from master.dbo.sysprocesses order by cpu desc --查看当前活动的进程数 sp_who active --查询是否由于连接没有释放引起CPU过高 select * from master.dbo.sysprocesses where spid> 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -10, getdate()) and login_time 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -60, getdate()) and login_time 1 ORDER BY qs.plan_generation_num SELECT top 50 qt.text AS SQL_text ,SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, SUM(qs.total_worker_time)/SUM(qs.execution_count) AS avg_cpu_time, COUNT(*) AS number_of_statements FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt GROUP BY qt.text ORDER BY total_cpu_time DESC --统计总的CPU时间 --ORDER BY avg_cpu_time DESC --统计平均单次查询CPU时间 -- 计算可运行状态下的工作进程数量 SELECT COUNT(*) as workers_waiting_for_cpu,s.scheduler_id FROM sys.dm_os_workers AS o INNER JOIN sys.dm_os_schedulers AS s ON o.scheduler_address=s.scheduler_address AND s.scheduler_id<255 WHERE o.state='RUNNABLE' GROUP BY s.scheduler_id
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三告同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值