记录一下自己SQL的学习过程,主要针对Oracle的学习。当然,MySQL的内容也是涉及到的。
第一章 了解SQL
SQL全称为Structed Query Launge,主要是对数据库中的数据进行操作,市面上常用的数据库有Oracle和MySQL两种。
1.1 表
表是一种结构化的文件,可用来存储某种特定类型的数据。表由行(row) 和 列(column) 所组成。行就是一行数据,也称之为记录,列就是一个字段。
第二章 检索数据
检索数据是SQL中最为常用的功能,需要狠狠地掌握。
2.1 SELECT关键字
没什么好说的,每次查询都要有SELECT和FROM两个关键字。检索多个列时,用“,”来隔开。检索所有列时,用"*"(慎用!)。同时,SQL语言都以“;"来结尾。
SELECT prod_id, prod_name, prod_price FROM Products;
值得一提的是,关键字不要作为列名,以及最好写关键字的时候大写,和其他做出区别。
2.2 DISTINCT去重
想要去重时,用DISTNCT关键字,它指示数据库只返回不同的值,其必须放在列名之前。 SELECT DISTINCT vend_id FROM Products;
注意,DISTINCT 关键字作用于所有的列,不仅仅是跟在其后的那一列。
2.3 限制返回的数量
如果你使用 Oracle,需要基于 ROWNUM(行计数器)来计算行,像这样:
SELECT prod_name FROM Products WHERE ROWNUM <=5;
2.4 注释
--这是oracle中的单行注释
/*这是oracle中的多行注释*/
我最恨两件事,一种是看别人代码没有注释,还有一种是自己写代码被要求写注释,可千万别当这种人阿,骚年。
第三章 排序
其实,检索出的数据并不是随机显示的。如果不排序,数据一般将以它在表中出现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,如果数据随后进行过更新或删除,那么这个顺序将会受到 DBMS 重用回收存储空间的方式的影响。因此,如果不明确控制的话,则最终的结果不能(也不应该)依赖该排序顺序。关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意义。对检索后的数据进行排序,就要使用ORDER BY关键字。
3.1 ORDER BY
ORDER BY可以对一列或者多列进行排序,位于SELECT语句中靠后的位置(我印象中,在MySQL中只有limit能排在它后边,Oracle还没实战过,后面遇到问题了再来更新)。下面的代码检索 3 个列,并按其中两个列对结果进行排序——首先按价格,然后按名称排序。
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name;
默认升序,ASC。如果想要降序的话,DESC。
大部分情况下,ORDER BY排序时不区分字段的大小写。在字典(dictionary)排序顺序中,A 被视为与 a 相同,这是大多数数据库管理系统的默认做法。但是,许多 DBMS 允许数据库管理员在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)。
此外,ORDER BY还可以通过列的位置来进行排序(但是我觉得不太好,有点魔术数的感觉,代码可阅读性很差)。同时,如果想在多个列上进行降序排序,必须对每一列指定 DESC 关键字。
第四章 过滤数据
使用WHERE来过滤数据也是SELECT中最为常用的操作啦。HAVING也是很常用的,他俩最重要的区别就是,一个是对行进行过滤,一个是对分组进行过滤,因此WHERE后不可以加分组函数!!
4.1 WHERE
WHERE子句很简单,经常跟在FROM后面。可以使用任意多个WHERE子句,用AND或OR来连接。值得注意的是,AND的优先级就远高于OR,因此使用时要注意,可以使用"()"来表明优先级。
4.2 HAVING
HAVING常用在分组函数后,对分组后的数据进行过滤。
第五章 通配符
这一章没啥好讲的,%可以表示任意多个字符,_只可以表示一个字符,使用LIKE进行模糊搜索,主要用于字符串的操作
第六章 创建计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式,因此需要对其进行计算或者更改别名
6.1 拼接列表
想把两个字段拼起来,可以使用"+"或"||"。
SELECT vend_name + '(' + vend_country + ')' FROM Vendors ORDER BY vend_name;
Bear Emporium (USA )即为拼接后的结果。
6.2 列表参与计算
SELECT中,选中的字段也是可以参加运算的。
6.3 添加别名
可以使用AS或者仅仅用空格,不过还是建议使用AS,增加可读性。
第七章
常用的函数
这一章我就不列章了,用到了就写上,当成字典来用。值得一提的是,SQL的函数不同数据库并不完全通用,这里主要是Oracle的函数。
1 分组函数
顾名思义,就是用于分组计算的,常常和GROUP连用,俺知道的有5个:AVG,SUM,COUNT,MAX,MIN,没啥好说的。
2 对字符串进行操作
RTRIM() 去除右边空格, LTRIM() 去除左边空格,TRIM() 去除左右两边空格。还有其他的如下:
SUBSTR(String string, int a, int b) 对string进行截取,从a开始,截取b个,值得一提的是,a为0或1,均从第一个开始截取。
SOUNDEX() 是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。就是转换成拼音吧。。
SELECT cust_name, cust_contact FROM Customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
返回结果为:
cust_name cust_contact
Kids Place Michelle Green
3 时间日期函数
EXTRACT(),字符串提取,比如:
WHERE EXTRACT(year FROM order_date) = 2020;
TO_DAte(),将字符串转为月份,比如
WHERE order_date BETWEEN to_date('2020-01-01', 'yyyy-mm-dd') AND to_date('2020-12-31', 'yyyy-mm-dd');
4 对数的操作
ROUND( ,1)可以指定小数点的位数,并对其进行四舍五入。