《SQL21自学通》是一本致力于帮助读者快速掌握SQL语言的书籍,涵盖了从SQL的基础概念到高级查询技术的全面内容。以下是对该书部分章节的知识点总结与扩展。
### 第一天:SQL简介
#### SQL简史与数据库简史
SQL(Structured Query Language)是一种用于管理关系型数据库的标准语言,其历史可追溯至1970年代初,由IBM的E.F. Codd提出的关系模型理论为基础发展而来。SQL首次被标准化是在1986年,由ANSI(美国国家标准协会)和ISO(国际标准化组织)共同制定,此后经过多次修订,形成了今天的SQL标准。
数据库的历史更久远,从最初的层次模型、网状模型到现代的关系模型,数据库技术经历了数次革命性的发展。关系模型的提出,使得数据的存储与检索更加灵活高效,而SQL正是为了充分利用这种模型而诞生的。
#### 设计数据库的结构
设计数据库结构是构建有效数据库的关键步骤,涉及选择合适的数据类型、定义主键、外键以及确保数据的一致性和完整性。良好的数据库设计能够提高查询效率,减少数据冗余,并简化数据管理。
#### SQL总览
SQL主要用于执行以下任务:
- 数据查询:通过SELECT语句获取所需信息。
- 数据操纵:使用INSERT、UPDATE、DELETE语句进行数据的增删改。
- 数据定义:利用CREATE、ALTER、DROP语句创建、修改或删除数据库对象如表、视图等。
- 数据控制:通过GRANT和REVOKE语句管理用户权限。
#### 流行的SQL开发工具
常见的SQL开发工具有:
- SQL Server Management Studio:专为Microsoft SQL Server设计的集成环境。
- MySQL Workbench:适用于MySQL数据库的官方图形化工具。
- Oracle SQL Developer:针对Oracle数据库的免费开发工具。
- phpMyAdmin:一款基于Web的MySQL管理工具,适合远程管理和共享访问。
- DBVisualizer:跨平台的数据库工具,支持多种数据库系统。
### 第二天:查询——SELECT语句的使用
#### SELECT语句的基本语法
SELECT语句用于从数据库中检索数据,其基本格式如下:
```sql
SELECT column_name(s)
FROM table_name
WHERE condition;
```
其中,`column_name(s)`表示要检索的列名,`table_name`是数据表的名称,`condition`则是用于过滤结果集的条件表达式。
#### 一般语法规则
- `*`作为通配符,代表所有列。
- 可以使用AS关键字为列名设置别名。
- WHERE子句用于添加筛选条件,如等于(=)、不等于(<>或!=)、大于(>)、小于(<)等比较运算符。
#### 你的第一个查询
示例:
```sql
SELECT employee_name, hire_date
FROM employees
WHERE department_id = 50;
```
此查询将从`employees`表中选择`employee_name`和`hire_date`两列,条件是`department_id`等于50。
### 第三天:表达式、条件语句与运算
#### 表达式
SQL中的表达式可以包含常量、变量、列名、函数调用以及算术或逻辑运算符,用于计算或比较数据。
#### 条件语句
包括IF...ELSE、CASE...WHEN等,用于根据不同的条件执行不同的操作。例如:
```sql
CASE
WHEN sales > 1000 THEN 'High'
ELSE 'Low'
END AS SalesLevel
FROM sales_data;
```
#### 运算
算术运算包括加(+)、减(-)、乘(*)、除(/)等;逻辑运算有AND、OR、NOT等。
### 第四天:函数
#### 汇总函数
- COUNT:统计非NULL值的数量。
- SUM:求和。
- AVG:平均值。
- MAX、MIN:最大值、最小值。
- VARIANCE、STDDEV:方差和标准差。
#### 日期/时间函数
- ADD_MONTHS:增加月份。
- LAST_DAY:返回月份的最后一天。
- MONTHS_BETWEEN:计算两个日期之间的月份数。
- NEW_TIME、NEXT_DAY、SYSDATE:分别用于时区转换、查找下一个工作日和获取当前系统日期。
#### 数学函数
- ABS:绝对值。
- CEIL、FLOOR:向上、向下取整。
- COS、COSH、SIN、SINH、TAN、TANH:三角函数及双曲函数。
- EXP:指数函数。
- LN、LOG:自然对数和对数函数。
- MOD:求模。
- POWER:幂函数。
- SIGN:符号函数。
- SQRT:平方根。
#### 字符函数
- CHR:ASCII码转字符。
- CONCAT:字符串连接。
- INITCAP:首字母大写。
- LOWER、UPPER:转换为小写或大写。
- LPAD、RPAD:左填充或右填充。
- LTRIM、RTRIM:去除左侧或右侧空白字符。
- REPLACE:替换字符串。
- SUBSTR:提取子串。
- TRANSLATE:字符替换。
- INSTR:查找子串位置。
- LENGTH:字符串长度。
#### 转换函数
- TO_CHAR:将数字或日期转换为字符串。
- TO_NUMBER:将字符串转换为数字。
- TO_DATE:将字符串转换为日期。
#### 其它函数
- GREATEST、LEAST:返回一组值中的最大值或最小值。
- USER:返回当前用户的用户名。
### 第五天:SQL中的子句
#### WHERE子句
用于过滤结果集,只显示满足特定条件的行。
#### STARTING WITH子句
用于模糊匹配字符串的开头。
#### ORDER BY子句
按一列或多列的升序(ASC,默认)或降序(DESC)排序结果集。
#### GROUP BY子句
将数据按一列或多列分组,通常与聚合函数一起使用。
#### HAVING子句
用于过滤GROUP BY子句生成的汇总行,类似于WHERE子句,但应用于聚合后的结果。
#### 子句的综合应用
在复杂查询中,多个子句可以结合使用,形成更精细的数据筛选和整理逻辑。
### 第六天:表的联合
#### 等值联合
连接具有相同字段的多个表,基于相等条件进行匹配。
#### 不等值联合
当连接条件不是相等时,使用不等值联合。
#### 外部联合与内部联合
- 内部联合(INNER JOIN):仅返回两个表中匹配的行。
- 外部联合(OUTER JOIN):返回所有可能的行组合,分为左外部联合(LEFT OUTER JOIN)、右外部联合(RIGHT OUTER JOIN)和全外部联合(FULL OUTER JOIN)。
#### 表的自我联合
当一个表与自身进行联合,通常用于处理具有层次结构的数据。
### 第七天:子查询
#### 子查询的使用
子查询是一个嵌入在另一个查询中的查询,可以用于各种复杂的筛选和计算。
#### 在子查询中使用汇总函数
可以在子查询中使用COUNT、SUM等函数,以进行数据汇总后再进行外层查询。
#### 子查询的嵌套
子查询可以嵌套多层,实现更为复杂的逻辑。
#### 相关子查询
子查询的结果依赖于外部查询的每行数据,通常用于处理行级的复杂逻辑。
#### EXISTS、ANY、ALL的使用
这些关键字用于处理子查询中的逻辑,如检查是否存在满足条件的行、比较单个值与子查询结果集合等。
### 第一周回顾
第一周的学习涵盖了SQL的基础知识、常用查询语句、函数使用以及表和数据的管理,为后续深入学习奠定了坚实的基础。接下来的章节将逐步引导读者掌握更高级的SQL技巧,如数据操作、数据库设计和优化等。