《SQL必知必会》总结

  • 数据库是一个以某种有组织的方式存储的数据集合
  • 表是一种结构化的文件,可用来存储某种特定类型的数据
  • 表具有一些特性,包含了存储什么样的数据,数据如何分解,个部分信息如何命名等信息。这组信息称作Schema
  • 主键应该满足:
    1. 任意两行都不具有相同的主键值
    2. 每一行都必须具有一个主键值(主键列不允许为NULL)
    3. 主键列中的值不允许修改或更新
    4. 主键值不能复用(如果某行从表中删除,它的主键不能赋给以后的新行)
  • 如果使用DISTINCT关键字,它必须直接放在列名的前面。DISTINCT关键字作用于所有的列,不仅仅是其后一列
  • Oracle的分页需要基于ROWNUM(行计数器)来计算行,MYSQL、MariaDB、PostgreSQL或者SQLite直接Limit就可以了。
SELECT prod_name FROM products WHERE ROWNUM <= 5 -- ORACLE
SELECT prod_name FROM products LIMIT 5;	-- MYSQL
  • 关系型数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有任何意义。
  • ORDER BY 字句应该保证它是SELECT语句中最后一条字句。
  • 多列排序时,仅在第一列有多行相同值时才会对第二列排序,如果第一列所有值是唯一的,则不会对第二列排序。
  • BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
  • SQL在处理OR操作符之前,会优先处理AND操作符,即AND操作符的优先级更高。
  • IN操作符一般比一组OR操作符执行得更快,IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE字句。
  • 通配符搜索只能作用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
  • 下划线_是匹配单个字符。百分号%匹配多个字符。方括号[]通配符用来指定一个字符集。
--找出所有名字以J或者M开头的联系人:
SELECT cust_contact FROM customers WHERE cust_contact LIKE '[JM]%' ORDER BY cust_contact;
  • 此语句的WHERE子句中的模式为’[JM]%’,其中[JM]匹配方括号中任意一个字符,匹配单个字符,%匹配多个字符,所以上面的意思是匹配以J或M开头的人。此通配符可以用前缀字符^(脱字号)来否定。’[^JM]%’。
  • 通配符搜索一般比其他搜索耗费更长的处理时间,所以:
    1. 不要过度使用通配符。
    2. 需要使用通配符时,尽量不要把他们用在搜索模式的开始处。
  • 虽然SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地访问和处理表达式了,例SELECT 3*2 返回6
  • 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值NULL还是非空值,都会计数。
  • 使用COUNT(column) 对特定列中具有值的行进行计数,会忽略NULL值。
  • 使用GROUP BY子句时需要注意:
    1. GROUP BY子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致地进行数据分组。
    2. 如果在GROUP BY子句中嵌套了分组,数据将在最后指定的分组上进行汇总。换句话说就是在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)
    3. GROUP BY子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚集函数),如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用列名。
    4. 大多数SQL实现不允许GROUP BY列带有长度可变的数据类型。
    5. 除聚集计算语句外,SELECT语句中的每一列都必须在GROUP BY子句中给出。
    6. 如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回,如果列中有多行NULL,将被分为一组。、
    7. GROUP BY子句必须放在WHERE子句之后,ORDER BY子句之前。
  • WHERE过滤行,在分组前进行过滤,HAVING过滤分组,在分组后进行过滤。
--列出具有两个以上产品且其加个大于等于4的供应商:
SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 4 GROUP BY vend_id HAVING COUNT(*) >= 2;
-- WHERE子句过滤所有prod_price至少为4的行,然后按vend_id分组数据,HAVING子句过滤计数为2或者2以上的分组。
  • 在SELECT语句中,子查询总是从内向外处理的。不过在实际使用时由于性能限制,不能嵌套太多的子查询。
  • 作为子查询的SELECT语句只能查询单个列。
  • 联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。使用特殊的语法可以联结多个表返回一组输出,联结在运行时关联表中正确的行。
  • 在联结两个表时,实际要做的是将第一个表中的每一行和第二个表中的每一行配对。WHERE子句作为过滤条件,只包含那些匹配给定条件(联结条件)的行。
  • 由没有联结条件的表关系返回的结果称为笛卡尔积。检索出的行的数目等于第一个表行数乘以第二个表行数。
  • 在复杂的过滤条件中,使用UNION可能会使处理更简单。
  • 使用UNION需要保证列数据类型必须兼容,类型不必完全相同。UNION从查询结果中自动去除了重复的行。如果想返回所有的行可以使用UNION ALL。
  • INSERT还存在另一种形式,可以利用它将SELECT语句的结果插入表中,这就是所谓的INSERT SELECT。
  • 视图不包含任何列或数据,包含的是一个查询。视图的优势是:
    1. 重用SQL语句
    2. 简化复杂的SQL操作
    3. 保护数据
  • 创建视图之后,可以用与表基本相同的方式使用他们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至添加和更新数据。视图本身不包含数据,因此返回的数据是从其他表中检索出来的。
  • 因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时需要的所有检索,如果用多个联结和过滤创建了复杂的视图或者嵌套了视图,性能可能会下降的很厉害。
  • 视图注意事项:
    1. 嵌套视图可能会严重降低查询的性能
    2. 许多DBMS禁止在视图查询中使用ORDER BY子句
    3. 视图不能索引,也不能有关联的触发器或默认值
    4. 有些DBMS把视图作为只读的查询,可以检索,但不能将数据写回底层表。
  • 存储过程就是为了以后使用而保存的一条或多条SQL语句,可将其视为批文件,虽然他们的作用不仅限于批处理。
  • 执行存储过程使用EXECUTE,EXECUTE接受存储过程名和需要传递给它的任何参数。
EXECUTE AddNewProduct(xxx, xxx, xx);
  • 这个存储过程有一个名为ListCount的参数,此参数从存储过程返回一个值而不是传递一个值给存储过程。关键字OUT用来指示这种行为。Oracle支持IN(传递值给存储过程),OUT(从存储过程返回值),INOUT(既传递值给存储过程也从存储过程传回值)类型的参数。存储过程的代码包括在BEGIN和END语句中,这里执行一条简单的SELECT语句,它检索具有邮件地址的顾客,然后用检索出的行数设置ListCount(要传递的输出参数)。
CREATE PROCEDURE MailingListCount(ListCount OUT INTEGER) IS v_rows INTEGER;
BEGIN
	SELECT COUNT(*) INTO v_rows FROM Customers WHERE NOT cust_email IS NULL;
	ListCount := v_rows;
  • 这段代码声明了一个变量来保存存储过程返回的任何值,然后执行存储过程,在使用SELECT语句显示返回的值。
var ReturnValue NUMBER EXEC MailingListCount(:ReturnValue);
SELECT ReturnValue;
  • 利用事务处理,可以保证一组操作不会中途停止,他们要么完全执行,要么完全不执行(除非明确指示)。如果没有错误发生,整组语句提交到数据库表;如果发生错误,则进行回退,将数据库恢复到某个已知且安全的状态。
  • 有时候需要在检索出来的行中前进或后退一行或多行,这就是游标的用途所在。游标是一个存储在DBMS服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。
  • 索引的注意事项:
    1. 索引改善了检索操作的性能,但降低了数据插入、修改和删除的性能。在执行这些操作时,DBMS必须动态地更新索引。
    2. 索引数据可能占用大量的存储空间。
    3. 并非所有数据都适合做索引,取值不多的数据,不如具有更多可能值的数据,能通过索引得到的好处多。
    4. 索引用于数据过滤和数据排序,如果经常以某种特定的顺序排序数据,则该数据适合做索引。
  • 与存储过程不一样,触发器与单个的表相关联。与Orders表上的INSERT操作相关联的触发器只在Orders表中插入行时执行。
  • 约束的处理比触发器快。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值