根据提供的信息,《DB2 SQL 精萃》一书由尚波编写,主要围绕IBM DB2数据库中的SQL语言展开深入探讨。以下是对该书中部分关键知识点的概括与解释: ### 一、DB2 SQL基础 #### 1. 连接字符串 在DB2中,连接字符串是指用于建立与数据库服务器连接的一系列参数。这些参数通常包括服务器地址、端口号、数据库名称等。例如,一个典型的连接字符串可能如下所示: ``` DATABASE=mydb;HOSTNAME=myserver;PORT=50000;PROTOCOL=TCPIP;UID=myuser;PWD=mypassword; ``` 通过设置正确的连接字符串,可以确保应用程序能够成功地连接到指定的DB2数据库。 #### 2. 在字符串中输入单引号 在SQL查询中,如果要在字符串内包含单引号,则需要使用两个连续的单引号。例如: ```sql SELECT * FROM employees WHERE name = 'John''s'; ``` 这里,`John''s` 表示字符串“John's”,即在字符串中包含一个实际的单引号。 #### 3. 在字符串中输入回车换行或其它特殊字符 对于需要在字符串中插入回车换行等特殊字符的情况,DB2支持使用转义序列。例如,`\n` 可以用来表示换行符: ```sql SELECT 'Hello\nWorld' AS greeting; ``` ### 二、数据操纵语言(DML) #### 1. INSERT语句 用于向数据库表中插入新的记录。基本语法如下: ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ``` 例如,向名为 `employees` 的表中插入一条新记录: ```sql INSERT INTO employees (name, age) VALUES ('John Doe', 30); ``` #### 2. UPDATE语句 用于更新已存在的数据记录。基本语法如下: ```sql UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE some_column = some_value; ``` 例如,将名为 `John Doe` 的员工年龄更新为 31 岁: ```sql UPDATE employees SET age = 31 WHERE name = 'John Doe'; ``` #### 3. DELETE语句 用于删除表中的数据记录。基本语法如下: ```sql DELETE FROM table_name WHERE some_column = some_value; ``` 例如,删除名为 `John Doe` 的员工记录: ```sql DELETE FROM employees WHERE name = 'John Doe'; ``` ### 三、高级查询技巧 #### 1. 相关子查询 相关子查询是指子查询依赖于外层查询中的某个值。这种查询通常用于复杂的条件判断。例如: ```sql SELECT e.name FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees); ``` 这个例子中,外层查询返回所有工资高于平均工资的员工姓名。 #### 2. 多字段查询 当需要从多个表中同时检索数据时,可以使用多字段查询。例如: ```sql SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id; ``` 这里,`JOIN` 用于连接 `employees` 和 `departments` 两个表,并从中选取员工姓名和部门名称。 #### 3. 使用 GROUP BY 子句 `GROUP BY` 子句用于按一个或多个列的值进行分组。例如: ```sql SELECT department_id, COUNT(*) FROM employees GROUP BY department_id; ``` 此查询将返回每个部门的员工数量。 ### 四、集合运算符 #### 1. UNION `UNION` 用于合并两个或多个 SELECT 语句的结果集,但会去除重复行。例如: ```sql (SELECT name FROM employees WHERE age > 30) UNION (SELECT name FROM interns WHERE age > 25); ``` 这个例子中,结果集包含了年龄大于30岁的员工以及年龄大于25岁的实习生的名字。 #### 2. INTERSECT `INTERSECT` 用于获取两个或多个 SELECT 语句结果集的交集。例如: ```sql (SELECT name FROM employees WHERE age > 30) INTERSECT (SELECT name FROM interns WHERE age > 25); ``` 此查询返回年龄大于30岁且同时出现在 `employees` 和 `interns` 表中的人员名字。 #### 3. EXCEPT `EXCEPT` 用于获取第一个 SELECT 语句结果集中不在第二个 SELECT 语句结果集中的行。例如: ```sql (SELECT name FROM employees WHERE age > 30) EXCEPT (SELECT name FROM interns WHERE age > 25); ``` 这个例子中,结果集包含了年龄大于30岁的员工中没有出现在年龄大于25岁的实习生名单中的人员名字。 ### 五、优化技巧 #### 1. 尽量避免在SQL语句中使用 OR 使用 `OR` 运算符可能会导致查询效率降低。例如: ```sql SELECT * FROM employees WHERE department_id = 1 OR department_id = 2; ``` 可以考虑使用 `IN` 运算符来替换: ```sql SELECT * FROM employees WHERE department_id IN (1, 2); ``` #### 2. 尽量避免在SQL语句的 WHERE 子句中使用函数 在 WHERE 子句中使用函数可能会导致索引失效,从而降低查询性能。例如: ```sql SELECT * FROM employees WHERE UPPER(name) LIKE 'JOHN%'; ``` 如果可能的话,尽量使用预处理方式来避免这种情况: ```sql CREATE INDEX idx_upper_name ON employees (UPPER(name)); ``` #### 3. 尽量避免在SQL语句中使用 LIKE 使用 `LIKE` 运算符可能会导致索引扫描,特别是在模式匹配发生在字符串开头的情况下。例如: ```sql SELECT * FROM employees WHERE name LIKE '%John%'; ``` 如果可能的话,尽量使用等值比较或范围比较来替代 `LIKE`。 ### 六、高级功能 #### 1. DB2函数概览 DB2 提供了一系列内置函数,用于执行各种计算和数据处理任务。例如: - 数学函数:`ABS`, `CEIL`, `FLOOR`, `MOD`, `ROUND` 等。 - 字符串函数:`CHAR`, `CONCAT`, `LEFT`, `LENGTH`, `REPLACE`, `SUBSTR` 等。 - 日期/时间函数:`CURRENT_DATE`, `CURRENT_TIME`, `DATE`, `EXTRACT`, `INTERVAL`, `TRUNC` 等。 - 转换函数:`CAST`, `TO_CHAR`, `TO_DATE`, `TO_NUMBER` 等。 - 条件函数:`CASE` 语句,用于根据不同的条件返回不同的结果。 #### 2. 半角全角转换 在处理包含半角和全角字符的字符串时,可以使用 DB2 提供的相关函数进行转换。例如: ```sql SELECT TRANSLATE('ABC', 'A', 'a') FROM DUAL; ``` 这里,`TRANSLATE` 函数用于将全角字符转换为半角字符。 #### 3. 将 NULL 值转化为其他值 有时需要将查询结果中的 NULL 值转换为其他有意义的值。例如: ```sql SELECT COALESCE(salary, 0) FROM employees; ``` 这里,`COALESCE` 函数用于将 `salary` 列中的 NULL 值转换为 0。 #### 4. 操作日期和时间 DB2 提供了丰富的日期和时间函数,用于处理和操作日期时间数据。例如: ```sql SELECT CURRENT_TIMESTAMP, DATEADD(DAY, 7, CURRENT_DATE) FROM DUAL; ``` 这里,`CURRENT_TIMESTAMP` 返回当前的日期时间戳,`DATEADD` 函数则用于计算从当前日期起七天后的日期。 #### 5. 数据类型转换 当需要将一种数据类型转换为另一种数据类型时,可以使用 DB2 的转换函数。例如: ```sql SELECT CAST('123' AS INT), TO_CHAR(123.45, 'FM999990.00') FROM DUAL; ``` 这里,`CAST` 用于将字符串转换为整型,而 `TO_CHAR` 用于将数值转换为格式化的字符串。 #### 6. CASE 语句的使用 `CASE` 语句用于根据不同的条件返回不同的结果。例如: ```sql SELECT name, CASE WHEN salary > 5000 THEN 'High Salary' ELSE 'Low Salary' END AS salary_level FROM employees; ``` 此查询将根据员工的薪水将其分类为“High Salary”或“Low Salary”。 #### 7. 定义临时集合(VALUES 语句的使用) `VALUES` 语句可以用于定义一个包含固定数据的临时集合。例如: ```sql SELECT * FROM (VALUES (1, 'John Doe'), (2, 'Jane Doe')) AS t(id, name); ``` 这里,`t` 是一个包含两行数据的临时集合。 #### 8. DB2公共表表达式(WITH 语句的使用) `WITH` 语句用于定义一个临时的、只在当前查询中可见的表。例如: ```sql WITH cte AS (SELECT name, salary FROM employees WHERE department_id = 1) SELECT * FROM cte; ``` 这里,`cte` 是一个公共表表达式,它包含了部门 ID 为 1 的所有员工的信息。 #### 9. 嵌套表表达式(Nested Table Expression) 嵌套表表达式允许在一个查询中嵌套多个子查询。例如: ```sql SELECT * FROM (SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)) AS high_salary_employees; ``` 这里,内部子查询用于计算平均工资,外部查询则返回工资高于平均工资的员工姓名。 #### 10. DB2 临时表 临时表是在会话期间创建并仅在该会话中可见的表。例如: ```sql CREATE GLOBAL TEMPORARY TABLE temp_employees (id INT, name VARCHAR(50)) ON COMMIT PRESERVE ROWS; INSERT INTO temp_employees (id, name) VALUES (1, 'John Doe'); SELECT * FROM temp_employees; ``` 这里,`temp_employees` 是一个全局临时表,即使在事务提交后,其中的数据仍然存在。 #### 11. DB2 在线分析处理(OLAP)函数的使用 OLAP 函数用于执行复杂的聚合计算,如分组、排序、汇总等。例如: ```sql SELECT SUM(salary), department_id FROM employees GROUP BY ROLLUP (department_id); ``` 这里,`ROLLUP` 函数用于按照 `department_id` 分组并计算每个部门的薪资总和,同时还计算整个公司的薪资总和。 通过上述内容,我们可以看出《DB2 SQL 精萃》一书涵盖了DB2数据库中SQL语言的各个方面,从基础操作到高级查询技巧均有涉及,非常适合希望深入了解DB2 SQL的读者阅读。
剩余134页未读,继续阅读
- 粉丝: 2
- 资源: 47
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助