本书所用的表:
第一章:了解SQL
- 数据库:保存有组织的数据的容器(通常是一个文件或一组文件)。
- 数据库软件:DBMS(数据库管理系统),如MySQL等。
- 表:某种特定类型数据的结构化清单。
- 表名:表名的唯一性取决于多个因素,如数据库名和表名等的结合。
- 模式:关于数据库和表的布局及特性的信息。
- 列:表中的一个字段。所有表都是由一个或多个列组成的。每个列都有相应的数据类型。
- 数据类型:所容许的数据的类型。限制可存储在列中的数据种类。
- 行:表中的一个记录。表中的数据是按行存储的。
- 主键(primary key):一列(或一组列),其值能够唯一区分表中的每个行。
- SQL:结构化查询语言(Structured Query Language),用来与数据库通信。
第二章:MySQL简介
- MySQL是一种DBMS,即它是一种数据库软件。
- DBMS可分为两类:一类为基于共享文件系统的DBMS,另一类为基于客户机-服务器的DBMS。MySQL、Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据库。
- 客户机是与用户打交道的软件,与数据文件打交道的只有服务器软件。客户机软件通过网络与服务器软件交流。
第三章:使用MySQL
- 连接MySQL,需要以下信息:
1.主机名——如果连接到本地MySQL服务器,为localhost
2.端口(如果使用默认端口3306之外的端口)
3.一个合法的用户名
4.用户口令(如果需要) - 选择数据库可使用use关键字,例如:use dbone;
- 了解数据库和表:
1.show databases;返回可用数据库的一个列表
2.show tables;返回一个数据库内的表的列表
3.show columns from customers;显示表的列的信息
4.show status;用于显示广泛的服务器状态信息
5.show create database;显示创建特定数据库的MySQL语句
6.show create table;显示创建特定表的MySQL语句
7.show grants;显示授予用户的安全权限
8.show errors;和show warnings;显示服务器错误或警告信息
第四章:检索数据
本章介绍如何使用select语句从表中检索一个或多个数据列
- 检索单个列:select cust_address from customers;
- 检索多个列:select cust_address,cust_city,cust_zip from customers;
- 检索所有列:select * from customers;
- 检索不同的行: select distinct cust_country from customers; distinct关键字指示MySQL只返回不同的值。
- 限制结果:select cust_address from customers limit 5;
select cust_address from customers limit 2,3;
第五章:排序检索数据
本章讲授如何使用select语句的order by子句
- 排序数据:select cust_zip from customers order by cust_zip;
- 按多个列排序:select cust_id,cust_zip,cust_contact from customers order by cust_zip,cust_contact;
- 指定排序方向:select cust_id,cust_zip,cust_contact from customers order by cust_zip desc,cust_contact;倒序 desc关键字只应用到直接位于其前面的列名。
第六章:过滤数据
本章使用where子句指定索引条件
where子句操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between | 在指定的两个值之间 |
第七章:数据过滤
本章讲授如何组合where子句,使用and,or,not,in操作符
- and:用在where子句中的关键字,用来指示检索满足所有给定条件的行。
- or: where子句中使用的关键字,用来表示检索匹配任一给定条件的行。
- where子句中使用圆括号分组操作符
- in:where子句中用来指定要匹配值的清单的关键字,功能与or相当。
- not:where子句中用来否定后跟条件的关键字。
第八章:用通配符进行过滤
本章介绍什么是通配符,如何使用通配符,如何使用like操作符。
- 通配符:用来匹配值的一部分的特殊字符
- 搜索模式:由字面值、通配符或两者组合构成的搜索条件
- 百分号(%) 通配符:表示任何字符出现任意次数。
- 下划线(_) 通配符:下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符
- 使用通配符的技巧:
1.不要过度使用通配符。
2.在确实需要使用通配符,除非绝对有必要,否则不要把他们用在搜索模式的开始处。
3.仔细注意通配符的位置。
第九章:用正则表达式进行搜索
本章将学习如何在MySQL where子句内使用正则表达式来控制数据过滤。
- 正则表达式是用来匹配文本的特殊的串(字符集合)。
- MySQL仅支持多数正则表达式实现的一个很小的自己。MySQL中的正则表达式匹配不分区大小写,regexp后所跟的东西作为正则表达式处理。
- like匹配整个列,regexp在列值内进行匹配
- 基本字符匹配
- or匹配:使用|
- 匹配几个字符之一:[]
- 匹配范围:[0-9] [a-z]
- 匹配特殊字符:\. \\
- 匹配字符类
- 匹配多个实例
- 定位符
字符类 | 说明 |
---|---|
[:alnum:] | 任意字母和数字(同[a-zA-Z0-9]) |
[:alpha:] | 任意字符(同[a-zA-Z]) |
[:blank:] | 空格和制表(同[\t]) |
[:cntrl:] | ASCII控制字符(ASCII 0到31和127) |
[:digit:] | 任意数字(同[0-9]) |
[:graph:] | 与[:print:]相同,但不包括空格 |
[:lower:] | 任意小写字母(同[a-z]) |
[:print:] | 任意可打印字符 |
[:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
[:space:] | 包括空格在内的任意空白字符(同[\f\n\r\t\v]) |
[:upper:] | 任意大写字母(同[A-z]) |
[:xdigit:] | 任意十六进制数字(同[a-fA-f0-9]) |
重复元字符 | 说明 |
---|---|
* | 0个或多个匹配 |
+ | 一个或多个匹配(等于{1,}) |
? | 0个或1个匹配(等于{0,1}) |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
定位元字符 | 说明 |
---|---|
^ | 文本的开始 |
$ | 文本的结尾 |
[[:<:]] | 词的开始 |
[[:>:]] | 词的结尾 |
第十章:创建计算字段
- 字段基本上与列的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
- 拼接:将值联结到一起构成单个值。可使用Concat()函数来拼接两个列。
- 别名:a as b
- RTrim()函数:去除数据右侧多余的空格
- 执行算术计算:+ - * /
第十一章:使用数据处理函数
本章介绍什么是函数,MySQL支持何种函数,以及如何使用这些函数。
- SQL支持利用函数来处理数据。函数一般是在数据上执行的,它给数据的转换和处理提供了方便。
- 大多数SQL实现支持以下类型的函数:
1.用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
2.用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
3.用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
4.返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。
常用的文本处理函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的空格 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转换为大写 |
常用日期和时间处理函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天、周等) |
AddTime() | 增加一个时间(时、分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月数部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
常用数值处理函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个数的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |
第十二章:汇总数据
本章介绍什么是SQL的聚集函数以及如何利用它们汇总表的数据。
- 聚集函数:运行在行组上,计算和返回单个值的函数。
SQL聚集函数 | 说明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的函数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
第十三章:分组数据
本章介绍如何分组数据,以便能汇总表内容的子集,这涉及两个新select语句子句,分别是group by子句和having子句
- 分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
- 分组是在select语句的group by子句中建立的,group by子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。
- 在具体使用group by子句前,需要知道一些重要的规定。
1.group by子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
2.如果在group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算。
3.group by子句中列出的每个列都必须是检索列或有效的表达式。如果在select中使用表达式,则必须在group by子句中指定相同的表达式。不能使用别名。
4.除聚集计算语句外,select语句中的每个列都必须在group by子句中给出。
5.如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,它们将分为一组。
6.group by子句必须出现在where子句之后,order by子句之前。 - 使用with rollup关键字,可以得到每个分组以及每个分组汇总级别的值。
- 使用having子句过滤分组。
- where在数据分组前进行过滤,having在数据分组后进行过滤。
- 以下二者区别:
order by | group by |
---|---|
排序产生的输出 | 分组行。但输出可能不是分组的顺序 |
任意列都可以使用 | 只可能使用选择列或表达式列,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列,则必须使用 |
- select子句及其顺序:
select子句 | 说明 | 是否必须使用 |
---|---|---|
select | 要返回的列或表达式 | 是 |
from | 从中检索数据的表 | 仅在从表选择数据时使用 |
where | 行级过滤 | 否 |
group by | 分组说明 | 仅在按组计算聚集时使用 |
having | 组级过滤 | 否 |
order by | 输出排序顺序 | 否 |
limit | 要检索的行数 | 否 |
第十四章:使用子查询
本章介绍什么是子查询以及如何使用它们。
- 子查询:即嵌套在其他查询中的查询。
- 利用子查询进行过滤。
- 在where子句中使用子查询,应该保证select语句具有与where子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。
- 作为计算字段使用子查询。
- 相关子查询:涉及外部查询的子查询。
- 子查询最常见的使用是在where子句的in操作符中,以及用来填充计算列。
- 例子一:列出订购物品tnt2的所有客户:
1.检索包含物品tnt2的所有订单的编号
2.检索具有前一步骤列出的订单编号的所有客户的ID。
3.检索前一步骤返回的所有客户ID的客户信息。 - 例子二:显示customers表中每个客户的订单总数。
1.从customers表中检索客户列表。
2.对于检索出的每个客户,统计其在orders表中的订单数目。
第十五章:联结表
本章介绍什么是联结,为什么要使用联结,如何编写使用联结的select语句。
- 关系表的设计就是要保证把信息分解成多个表,一类数据一个表。各表通过某些常用的值(即关系设计中的关系)互相关联。
- 外键:外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
- 可伸缩性:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序称之为可伸缩性好。
- 联结是一种机制,用来在一条select语句中关联表。
- 创建联结:规定要联结的所有表以及它们如何关联即可。
- 完全限定列名:在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。
- 笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。
- 等值联结:基于两个表之间的相等测试,也称为内部联结。
第十六章:创建高级联结
本章讲解另外一些联结类型,介绍如何对被联结的表使用表别名和聚集函数。
- 别名除了用于列名和计算字段外,SQL还允许给表名起别名。理由:
1.缩短SQL语句。
2.允许在单条select语句中多次使用相同的表。 - 表别名不仅能用于where子句,它还可以用于select的列表、order by子句以及语句的其他部分。
- 自联结:自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。
- 自然联结:只能选择那些唯一的列。通过对表使用通配符(select *),对所有其他表的列使用明确的子集来完成。
- 外部联结:联结包含了那些在相关表中没有关联行的行。包括左外联结和右外联结。它们之间的唯一差别是所关联的表的顺序不同。
- 使用带聚集函数的联结。
- 关于联结及其使用的某些要点:
1.注意所使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的。
2.保证使用正确的联结条件,否则将返回不正确的数据。
3.应该总是提供联结条件,否则会得出笛卡尔积。
4.在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一起测试它们前,分别测试每个联结。这将使故障排除更为简单。
第十七章:组合查询
本章讲述如何利用union操作符将多条select语句组合成一个结果集。
- MySQL也允许执行多个查询,并将结果作为单个查询结果集返回。这些组合查询称为并(union)或复合查询。
- 有两种基本情况,其中需要使用组合查询:
1.在单个查询中从不同的表返回类似结构的数据
2.对单个表执行多个查询,按单个查询返回数据。 - 使用union可极大地简化复杂的where子句,简化从多个表中检索数据的工作。
- union规则:
1.union必须由两条或两条以上的select语句组成,语句之间用关键字union分隔。
2.union中的每个查询必须包含相同的列、表达式或聚集函数。
3.列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含地转换的类型 - 使用union all,MySQL不取消重复的行。