第1章 了解SQL
1.1 数据库基础
1.1.1 数据库和数据库管理系统
- 数据库:保留有组织的数据的容器
- 数据库管理系统:管理数据库的软件
1.1.2 表: 某种特定类型数据的结构化清单
1.1.3 列和数据类型
- 列:表中的一个字段
- 分解数据:正确的将数据分解为多个列极为重要
1.1.4 行: 表中的一个记录
1.1.5 主键: 一列(或一组列),其值能够唯一区分表中的每个行。
- 应该总是定义主键
- 满足下列两个条件的任何列都可作为主键:
- 任意两行都不具有相同的主键值
- 每个行都必须具有一个主键值(主键不允许为NULL值)
- 主键的最好习惯:
- 不更新主键列中的值
- 不重用主键列中的值
- 不在主键列中使用可能会更改的值
1.2 什么是SQL
1.2.1 SQL
SQL, 即Structured Query Language, SQL是一种数据库语言,而不是数据库。
第2章 什么是MySQL
2.1 什么是MySQL
第3章 使用MySQL
3.1 自动增量
3.2 DESCRIBE语句
- DESCRIBE table_name 等于 SHOW COLUMNS FROM table_name
第4章 检索数据
4.1 使用SELECT语句检索数据
- 查询结果的顺序没有特殊意义(即相同的查询语句得到的返回结果的显示顺序可能不同)
- 以分号(;)作为SQL语句的结束符号
- 对所有的SQL关键字进行大写,而对所有的列和表名使用小写。这样做使代码更易于阅读和调试。
- 在处理SQL语句时,其中所有的空格都被忽略。 因此SQL语句可以在一行上给出,也可以分成许多行。
- 多数SQL开发人员认为将SQL语句分成多行更容易阅读和调试。
4.2 通配符*
- 一般,除非你确实需要表中的每个列,否则最好别使用*通配符。因为检索不需要的列通常会降低检索和应用程序的性能。
4.3 DISTINCT
- 使用DISTINCT使检索结果只包含不同的值的记录。
- 不能部分使用DISTINCT。DISTINCT作用于所有的列,而不仅是前置它的列。
4.4 LIMIT
- LIMIT的用法: LIMIT index, length; 指示MySQL返回从行index开始的length行。如LIMIT 5, 5; 返回从行5开始的不多于5行数据。
- 行0: 检索出来的第一行为行0而不是行1. 因此LIMIT 1, 1将检索出第二行而不是第一行。
- 在行数不够时, MySQL将值返回它能返回的那么多行。
- LIMIT length OFFSET index
- e.g. LIMIT 4 OFFSET 3 表示从行3开始取4行,等同于 LIMIT 3, 4
第5章 排序检索数据
5.1 ORDER BY
- ORDER BY 默认使用升序排序(按字母表顺序)
- 可按多个列排序
- DESC
- DESC 降序排序
- DESC关键字只应用到直接位于其前面的列名。如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。
- 可以通过非选择列进行排序,这是完全合法的。
5.2 ORDER BY子句的位置
- ORDER BY子句必须出现在FROM子句和WHERE子句之后,在LIMIT子句之前。
第6章 过滤数据
6.1 WHERE 子句
- WHERE子句应位于FROM子句之后,ORDER BY子句之前
- =, !=, <, >, <=, >=, BETWEEN
6.2 何时使用引号
- 单引号用来限定字符串。 如果将值与串类型的列进行比较,则需要限定引号。
- 用来与数值列进行比较的值不用引号。
6.3 NULL
- 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。
第7章: 数据过滤
7.1 操作符优先级:
7.2 使用圆括号没什么坏处,它能消除歧义
7.3 IN操作符:功能上等价与OR操作符
- 优点:
- 当具有长的合法选项清单时, IN操作符的语法更清楚且更直观
- 计算的次序更容易管理
- 一般比OR操作符执行更快
- 最大的优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句
7.4 NOT操作符: 只有一个功能: 否定它之后所跟的任何条件。
- MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。
第8章:用通配符进行过滤
8.1 LIKE操作符
- 通配符(wildcard) :用来匹配值的一部分的特殊字符
- 搜索模式(search pattern) 由字面值、通配符或两者组合构成的搜索条件。
- 在子句中使用通配符时,必须使用LIKE操作符。LIKE操作符指示MySQL其之后跟的搜索模式利用通配符而不是直接相等匹配进行比较。
8.2 百分号(%)通配符
- %表示任何字符出现任意次数(任意次数指0次或1次或多次)(类似正则表达式中的*通配符)
- %不能匹配NULL
8.3 下划线(_)通配符
- _表示匹配单个字符一次。有且只匹配一次,不能多也不能少, ONLY 1 TIME
8.4 使用通配符的技巧:
- 不要过度的使用通配符。 如果其他操作符能达到同样的目的,应该使用其他操作符。(原因大概是资源的消耗和耗时?)
- 再确实需要使用通配符时,除非绝对有必要,否则不要把它们用于搜索模式的最开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。把通配符置于搜索模式的开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。
第9章: 用正则表达式进行搜索
9.1 MySQL仅支持多数正则表达式实现的一个很小的子集
9.2 MySQL使用REGEXP操作符来进行正则匹配
9.3 REGEXP与LIKE的区别
- LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到她,相应的行也不会被返回。(除非使用通配符)
- REGEXP在列值中进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它并返回相应的行。
- REGEXP可以通过使用^和$定位符来达到与LIKE相同的效果(即匹配整个列)
9.4 OR匹配 : |
9.5 匹配几个字符之一: []
9.6 ^可以用于否定
9.7 匹配范围: [0123456789]等同于[0-9]
9.8 匹配特殊字符:必须使用\为前导。
- 匹配\:需要使用\\\
- \或\\: 多数正则表达使实现使用单个反斜杠转义特殊字符,以便能够使用这些字符自身(如.和*等)。但MySQL要求两个反斜杠(MySQL自身解释一个,正则表达式解释另一个)。
9.9 匹配字符类
- [: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])
9.10 匹配多个实例
- * 0个或多个匹配
- + 1个或多个匹配,等于{1, }
- ? 0个或1个匹配,等于{0, 1}
- {n} 指定数目的匹配
- {n, } 不少于指定数目的匹配
- {n, m} 匹配数目的范围(m不超过255)
9.11 定位符
- ^ 文本的开始
- $ 文本的结束
- [[:<:]] 词的开始
- [[:>:]] 词的结尾
9.12 简单的正则表达式测试
- 可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0(没有匹配)或1(匹配)。 可以用带文字串的REGEXP来测试表达式,并试验他们。 相应的语法如下:
- SELECT ‘hello’ REGEXP ‘[0-9]’; 返回0
第10章: 创建计算字段
10.1 计算字段:
- 计算字段是运行时在SELECT语句内创建的。
- 在数据库服务器上完成数据格式的处理操作要比在应用程序上完成要快得多。
10.2 拼接字段: Concat()函数
- 多数DBMS使用+或||来实现拼接,而MySQL使用Concat()函数来实现拼接。
10.3 Trim()函数:
- 去除串两边的空格。
- RTrim()去除右边的空格
- LTrim()去除左边的空格。
10.4 使用AS创建别名(也称导出列)
10.5 计算字段还可以用来执行算数计算。
第11章:使用数据处理函数
11.1 大多数SQL实现支持以下类型的函数:
- 用于处理文本串(如删除或填充值,转换值为大写或小写)的文本函数。
- 用于在数值数据上进行算术运算(如返回绝对值,进行代数运算)的数值函数。
- 用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。
- 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。
11.2 常用的文本处理函数
- Left() 返回串左边的字符
- Length() 返回串的长度
- Locate() 找出一个串的字串
- Locate(substr, str) 返回substr从str开始的下标(从1开始)
- Lower() 将串转换为小写
- LTrim() 去掉串左边的空格
- Right() 返回串右边的字符
- RTrim() 去掉串右边的空格
- Soundex() 返回串的SOUNDEX值
- SubString() 返回字串的字符
- Upper() 将串转换为大写
11.3 常用日期和时间处理函数
- AddDate() 增加一个日期(天、周等)
- AddTime() 增加一个时间(时、分等)
- CurDate() 返回当前日期
- CurTime() 返回当前时间
- Date() 返回日期时间的日期部分
- DateDiff() 计算两个日期之差
- Date_Add() 高度灵活的日期运算函数
- Date_Format() 返回一个格式化的日期或时间串
- Day() 返回一个日期的天数部分
- DayOfWeek() 对于一个日期,返回对应的星期几
- Hour() 返回一个时间的小时部分
- Minute() 返回一个时间的分钟部分
- Month() 返回一个日期的月份部分
- Now() 返回当前日期和时间
- Second() 返回一个时间的秒部分
- Time() 返回一个日期时间的时间部分
- Year() 返回一个日期的年份部分
11.4 常用数值处理函数
- Abs(n) 取绝对值
- Cos(n) 取余弦值
- Exp(n) 取指数值, e^n
- Mod(n) 取模
- Pi() 返回圆周率
- Rand() 返回一个随机数
- Sin(n) 取正弦值
- Sqrt(n) 取平方根
- Tan(n) 取正切值