SQL 中HAVING的用法 及 OVER 的用法

碰到一个问 SQL  HAVING语句的用法的题目。结果没答上来。把用法摘抄在这儿,以为记录。

出处:http://www.w3school.com.cn/sql/sql_having.asp

HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SQL HAVING 语法

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

SQL HAVING 实例

我们拥有下面这个 "Orders" 表:

O_IdOrderDateOrderPriceCustomer
12008/12/291000Bush
22008/11/231600Carter
32008/10/05700Bush
42008/09/28300Bush
52008/08/062000Adams
62008/07/21100Carter

现在,我们希望查找订单总金额少于 2000 的客户。

我们使用如下 SQL 语句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000

结果集类似:

CustomerSUM(OrderPrice)
Carter1700

现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。

我们在 SQL 语句中增加了一个普通的 WHERE 子句:

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500

结果集:

CustomerSUM(OrderPrice)
Bush2000
Adams2000

另外需要注意的是:

当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:

执行where子句查找符合条件的数据;

使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;

最后用having 子句去掉不符合条件的组。

select dno,count(*)
   from employee
   group by dno
   having count(*)>3
需要注意:having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.

having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。

having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

select dno,sum(salary)
   from employee
   group by dno
   having sum(salary)>10000

又看到一个OVER 的用法,也是我所不清楚的,也抄记如下备查:

首先我觉得很奇怪的是W3SCHOOL的SQL教程部分中没有提到过OVER这个关键字,甚至索引中也没有,所以我想这个OVER关键字倒底是什么来头呀,这么神秘,莫非只是某一个DBMS中的一个特殊的语法特性?查了半天发现是好像是ORACLE中的一个特殊函数,所以暂时先不用理它啦!!!!!!!

<think>嗯,用户想要了解SQL中常用的语法和关键字,包括用法和示例注释。首先,我得确定用户的基础水平,可能是个刚开始学SQL的人,或者是有一定基础想复习的。需要从基础开始,结构清晰,分步骤讲解。 首先,常见的SQL关键字,比如SELECT、FROM、WHERE这些,应该先列出来。每个关键字都要有示例,并且加上注释说明。可能需要分几大类,比如数据查询、数据操作、数据定义、数据控制,还有高级功能。这样用户能更系统地理解。 然后,示例的格式要注意,用代码块的话会比较清晰,但用户要求使用中文,并且数学表达式用$...$,不过这里主要是SQL代码,可能不需要数学公式。但如果有涉及计算的表达式,比如在SELECT中的计算字段,可能需要用行内公式,不过SQL示例里应该用代码形式更合适。 另外,用户提到系统级指令中要求行内数学表达式用$...$,但在这个问题中,可能主要涉及的是SQL语法,所以需要确认是否需要转换某些部分。不过可能大部分是代码示例,所以重点放在正确展示SQL语句,注释用中文说明。 接下来,我需要组织内容结构。可以分为数据查询、数据操作(DML)、数据定义(DDL)、数据控制(DCL)、事务控制、常用函数、高级功能等部分。每个部分下举出常用的关键字,给出示例和注释。 比如,在数据查询部分,SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT这些都要涵盖。每个关键字用代码示例展示,注释解释其作用。 需要注意SQL语法的正确性,比如关键字的大小写(通常大写,但实际不区分),示例的正确性,比如INSERT INTO的语法,JOIN的不同类型等。 还要考虑用户可能的深层需求,比如是否想了解如何组合这些关键字解决实际问题,或者常见的错误用法。但根据问题描述,主要是介绍常用语法和关键字,所以示例要典型,注释要简洁明了。 另外,事务控制的COMMIT、ROLLBACK,以及ACID属性可能需要简要提及。函数部分可以包括字符串、数值、日期函数,各举几个例子。高级功能如子查询、窗口函数、CTE等,虽然可能属于进阶内容,但用户可能希望了解常用部分,所以简要介绍。 最后,检查是否覆盖了主要的SQL操作,是否有遗漏的关键字,比如DISTINCT、AS别名、JOIN的类型,UNION等。确保每个例子正确,注释准确,结构清晰,符合用户的要求。</think>以下为SQL常用语法及关键字的详细介绍,按功能分类并附带示例: --- ### 一、数据查询(SELECT) 1. **SELECT / FROM** ```sql SELECT column1, column2 FROM table_name; -- 查询指定列 SELECT * FROM employees; -- 查询所有列 ``` 2. **WHERE** ```sql SELECT * FROM products WHERE price > 100; -- 筛选价格>100的记录 SELECT name FROM users WHERE age BETWEEN 18 AND 30; -- 范围筛选 ``` 3. **DISTINCT** ```sql SELECT DISTINCT country FROM customers; -- 去重查询国家列表 ``` 4. **ORDER BY** ```sql SELECT * FROM orders ORDER BY order_date DESC; -- 按日期降序排序 ``` 5. **GROUP BY / HAVING** ```sql SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000; -- 分组后过滤 ``` 6. **LIMIT / OFFSET** ```sql SELECT * FROM logs LIMIT 10 OFFSET 20; -- 分页查询(第3页,每页10条) ``` --- ### 二、数据操作(DML) 1. **INSERT** ```sql INSERT INTO students (name, age) VALUES ('张三', 20); -- 插入单条数据 ``` 2. **UPDATE** ```sql UPDATE products SET price = price * 0.9 WHERE stock > 100; -- 更新符合条件的记录 ``` 3. **DELETE** ```sql DELETE FROM orders WHERE status = 'cancelled'; -- 删除已取消的订单 ``` --- ### 三、数据定义(DDL) 1. **CREATE TABLE** ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建带约束的表 ``` 2. **ALTER TABLE** ```sql ALTER TABLE employees ADD COLUMN email VARCHAR(100); -- 添加新列 ``` 3. **DROP TABLE** ```sql DROP TABLE temp_data; -- 删除表 ``` --- ### 四、数据控制(DCL) 1. **GRANT** ```sql GRANT SELECT, INSERT ON database.table TO 'user1'@'localhost'; -- 授权操作权限 ``` 2. **REVOKE** ```sql REVOKE DELETE ON database.table FROM 'user2'@'localhost'; -- 撤销权限 ``` --- ### 五、连接查询(JOIN) 1. **INNER JOIN** ```sql SELECT orders.id, customers.name FROM orders INNER JOIN customers ON orders.customer_id = customers.id; -- 内连接 ``` 2. **LEFT JOIN** ```sql SELECT employees.name, departments.name FROM employees LEFT JOIN departments ON employees.dept_id = departments.id; -- 左外连接 ``` --- ### 六、常用函数 1. **聚合函数** ```sql SELECT COUNT(*) AS total_users FROM users; -- 统计行数 SELECT MAX(salary), MIN(salary) FROM employees; -- 极值计算 ``` 2. **字符串函数** ```sql SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM contacts; -- 拼接字符串 SELECT UPPER(name) FROM cities; -- 转大写 ``` 3. **日期函数** ```sql SELECT NOW(); -- 当前时间 SELECT DATE_FORMAT(order_date, '%Y-%m') FROM orders; -- 格式化日期 ``` --- ### 七、高级功能 1. **子查询** ```sql SELECT name FROM products WHERE price > (SELECT AVG(price) FROM products); -- 嵌套查询 ``` 2. **窗口函数** ```sql SELECT name, salary, RANK() OVER (ORDER BY salary DESC) AS ranking FROM employees; -- 计算排名 ``` 3. **CTE(公共表表达式)** ```sql WITH dept_stats AS ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) SELECT * FROM dept_stats WHERE avg_salary > 6000; -- 使用临时结果集 ``` --- ### 八、事务控制 ```sql BEGIN TRANSACTION; -- 开始事务 UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; COMMIT; -- 提交事务(或 ROLLBACK 回滚) ``` --- **关键原则** 1. SQL关键字不区分大小写,但建议统一大写提高可读性 2. 字符串用单引号包裹,如 `'text'` 3. 使用缩进和换行保持代码结构化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值