第1课.了解SQL
数据库:保存有组织的数据的容器。
数据库软件应被称为数据库管理系统(DBMS)。
表:某种特定类型数据的结构化清单。
储存在表中的数据是同一种类型的数据或清单。
使表名成为唯一的。
模式:关于数据库和表的布局及特性的信息。
数据类型:所允许的数据的类型。每个表列都有的相应的数据类型,它限制(或允许)该列中储存的数据。
行 = 数据库记录
主键(primer key):一列(或一组列),其值能够唯一标识表中每一行。
表中的任何列都可以作为主键,只要满足以下条件:
- 任意两行都不具有相同的主键值;
- 每一行都必须具有一个主键值(主键列不允许NULL值);
- 主键列中的值不允许修改或更新;
- 主键值不能重用(如果某行从表中删除,她的主键不能赋给以后的新行)。
SQL(Structured Query Language 结构化查询语言),专门用来与数据库沟通的语言。
设计的目的是提供一种从数据库中读写数据的简单有效的方法。
标准SQL由ANSI标准委员会管理,称为ANSI SQL。
参照 https://blog.csdn.net/Z_zfer/article/details/82971793 更改路径,
https://blog.csdn.net/bobo553443/article/details/81383194, 安装了MySQL。
进入bin目录,按住shift键然后点击鼠标右键可以选择在该目录下打开命令窗口,或者在地址栏中输入cmd进入命令窗口。输入mysql -u root -p后回车,然后会提示输入密码,输入密码后就会进入MySQL的操作管理界面。
第2课.检索数据
1.SELECT语句
所需的列名写在SELCT关键字后,FROM关键字指出从哪个表中检索数据。
返回的数据没有特定的顺序。
多条SQL语句以分号(;)分隔。
不区分大小写,一般关键字大写,列名和表名小写。
所有空格都被忽略。
在实际的列名位置使用星号(*)通配符,可以做到检索所有的列而不必逐个列出它们。
2.DISTINCT关键字,指示数据库只返回不同的值。使用时放在列名前面。
DISTINCT关键字作用于所有列,不仅仅是跟在其后的一列。
LIMIT关键字限制最多返回多少行(MySQL)。
OFFSET指定从哪儿开始以及检索的行数。
第一个被检索的行是第0行。
3.注释使用–(两个连字符)嵌在行内。–之后的文本就是注释。
在一行的开始处使用#,使得整行都成为注释。
/* */进行多行注释
第3课.排序检索数据
ORDER BY语句取一个或者多个列的名字,据此对对输出进行排序。应该保证是最后一条子句。
按多个列排序,简单指定列名,列名之间用逗号分开即可。
按列所在的相对位置排列。
DESC关键字进行降序排列,只应用到直接位于其前面的列名。
第4课.过滤数据
只检索所需数据需要指定搜索条件(过滤条件)。
SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。
支持的操作符:
- 常见的= ,!=,<,<=,>,>=
- <>不等于,!<不小于,!>不大于
- BETWEEN 在制定的两个值之间,两个值用AND分割,包括开始值和结束值
- IS NULL 为NULL值
如果将值与字符串类型的列进行比较,就需要限定引号‘ ’。
第5课.高级数据过滤
SQL允许给出多个WHERE子句,可以以AND或者OR子句的方式使用。
SQL在处理OR操作符前,优先处理AND操作符。
使用圆括号对操作符进行明确分组。
IN操作符指定条件范围,范围中的每个条件都可以进行匹配。
IN取一组由逗号分隔、括在圆括号中的合法值。
优点:
- 比一组OR操作符执行得更快
- 可以包含其他SELECT语句,能动态地建立WHERE子句。
WHERE子句中地NOT操作符只有否定其后所跟的任何条件。
第6课.用通配符进行过滤
利用通配符(用来匹配值的一部分的特殊字符),可以创建比较特定数据的搜索模式。
为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE从操作符指示DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较。
通配符搜索只能用于文本字段(字符串)。
1.% 表示任何字符出现任意次数,还可以匹配0个字符。
可能为了填满空格,在本文后有若干空格。 可以在搜索模式的结尾增加一个%
%不会匹配NULL
2._ 只匹配单个字符
3.[ ] 指定一个字符集,必须匹配指定位置(通配符的位置)的每一个字符。[JM] 只能匹配单个字符J或者M
4.前缀字符 ^ 表示否定
第7课.创建计算字段
储存在数据表中的数据一般不是应用程序所需要的格式。
计算字段并不实际存在于数据库表中,是运行SELECT语句内创建的。
只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。
拼接:将值联结到一起(将一个值附加到另一个值)构成单个值。
用括号将需要拼接的后面的列括起来。
用加号(+)或者两个竖杠(||)表示。
SELECT Concat(vend_name, ’ (’, vend_country,’)’)
FROM xx
PTRIM()函数 去掉值右边所有的空格
LTRIM() 函数去掉字符串左边的空格
TRIM() 去掉字符串左右两边的空格
别名 (有时称为导出列)是一个字段或者值的替换名,用关键字AS赋予。
支持 +, -, *, / 运算符
SELECT省略FROM子句后就是简单地访问和处理表达式。
Now() 函数返回当前日期和时间。
第8课.使用函数处理数据
每个DBMS都有特定的函数。
函数 | 语法(MySQL) |
---|---|
提取字符串的组成部分 | SUBSTRING() |
数据类型转化 | CONVERT() |
取当前日期 | CURDATE() |
- 处理文本字符串的文本函数 。
- 数值数据进行算术操作的数值函数。
- 处理日期和时间值并从这些值中提取特定成分的日期和时间函数。
- 返回DBMS正使用的特殊信息的系统函数。
常用的文本处理函数
函数 | 说明 |
---|---|
LEFT() (或使用子字符串函数) | 返回字符串左边的字符 |
LENGTH() (或使用DATALENGTH() 或 LEN() ) | 返回字符串的长度 |
LOWER() | 将字符串转换成小写 |
SOUNDEX() | 返回字符串的SOUNDEX值 |
RIGHT(), UPPER()
SOUNDEX将任何文本串转换为描述其语音表示的字母数字模式的算法,考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。
YEAR() 函数从日期中提取月份
WHERE YEAR(order_date) =2012;
第九课.汇总数据
有时需要汇总表中的数据,而不需要实际数据本身。
聚集函数:对某些行运行的函数,计算并返回一个值。
函数 | 说明 |
---|---|
AVG() | 返回某列的平均值,只用于单个列,忽略列值为NULL的行 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列之和 |
- COUNT(*) 对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
- COUNT(column) 对特定列(column)中具有值的行进行计数,忽略NULL值。
MAX() 要求指定列名。
- MAX() 一般用来找出最大的数值或日期值,但许多DBMS允许用它返回任意列中的最大值,包括返回本文列中的最大值。
- 用于文本数据时,MAX() 返回按该列排序后的最后一行。
- MAX() 忽略列值为NULL的行。
MIN() 一切与上面的MAX() 类似。
SUM() 忽略列值为NULL的行。
以上5个聚集函数都可以如下使用。
- 对所有行执行计算,指定ALL参数或不指定参数(ALL是默认行为)。
- 只包含不同的值,指定DISTINCT参数。
DISTINCT只能用于COUNT(),不能用于COUNT(*)。
DISTINCT必须使用列名。
SELECT语句可根据需要包括多个聚集函数。
第10课.分组数据
使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。
- 分组是使用SELECT语句的GROUP BY子句建立的。
GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套。
如果GROUP BY嵌套了分组,数据将在最后指定的分组上进行汇总。
如果SELECT中使用表达式,必须在GROUP BY子句中指定相同的表达式,不能使用别名。
除聚集计算语句外,SELECT中的每一列都必须在GROUP BY子句中给出。
如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
-
HAVING过滤分组,WHERE过滤行。
HAVING支持所有WHERE操作符。
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
ORDER BY | GROUP BY |
---|---|
对产生的输出排序 | 对行分组,但输出可能不是分组的顺序 |
任意列都可以使用(甚至非选择的列也可以使用) | 只可能使用选择列或表达式列,而且必须使用每个选项列表达式 |
不一定需要 | 如果与聚集函数一起使用列(或表达式),则必须使用 |
- 使用的前后顺序
SELECT FROM WHERE GROUP BY HAVING ORDER BY