A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

同学们,今天重心就是sql语句,涉及到单表、多表以及相关函数学习。

今日需要掌握的有:
  • 掌握单表查询
  • 掌握多表内连接,外连接,子查询
  • 了解各函数的使用


请同学们按照如上要求,总结今日所学。

5 个回复

倒序浏览
常小天
      今天深入学习了Oracle数据库的查询方法。由浅入深的学习了单表查询,连接查询,子查询,分页查询,单行函数,行列转换,分析函数,集合运算。
      单表查询中需要注意的点有:简单条件查询里and和or混合使用时and的优先级比or大,我们可以需要用 ( ) 来改变优先级。基于伪列查询。伪列跟表中的列一样,但它在表中并不存储,只能查询,不能进行增删改操作,是表中默认附加的列。ROWID 伪列返回的就是该行在数据文件中的物理地址。ROWNUM 为查询结果集中每一行标识一个行号。聚合统计中的having是在排序后进行的判断条件。
      连接查询中需要注意的点有:内连接可以连接2张以上的表,连接条件用and连接。左外连接和右外连接中主表全部显示,即使对应的附表没有值。在SQL语句上新学习了Oracle特有的一种书写方式,就是在where后的条件中的附表后添加(+)。
      分页查询中,利用rownum伪列作为记录的序号。但由于rownum是在查询语句扫描每条记录时产生的,只能使用“小于”或“小于等于”。如果使用大于或等于,或者单纯的使用等于,这时查询语句扫描第一条记录,生成rownum,判断查询条件,第一条记录的rownum一定是1,肯定不符合判断条件(大于等于1或等于1除外),这条记录就不会被记录进要查询的结果表中,这样扫描下一条记录的时候生成的rownum又是从1 开始,如此反复,所以无法查出任何数据。也因此不能室友“大于等于”和“等于”来判断rownum。这就对分页查询造成了阻碍。解决的方法是子查询。先在子查询中带上rownum查询数据库,这里可以使用“小于”做第一步的条件查询,对子查询查询到的临时表再进行查询,此时子查询中产生的rownum就不再具有伪列属性,与正常列一样了,这样就可以使用“大于等于”和“等于”的判断了。从而达到分页查询的目的。
      基于排序的分页查询中我们遇到了一个新的问题。就是rownum是在排序前进行的,rownum产生后再按照其他排序条件排序,这时rownum就被打乱了,无法再作为分页查询的序号使用了。为了解决这个问题,需要使用3层子查询嵌套。最里面的子查询对数据进行排序,差生的临时表再被中间层的子查询查询一遍,这时加上rownum,然后产生中间层的临时表。最外层的查询再对中间层的查询结果进行查询,同时进行分页的操作。从而达成基于排序的分页查询的目的。
单行函数中需要注意的点有:求字符串的子串 SUBSTR方法中表示开始截取位置的参数(第二个参数)是从1开始的,但0也可以用,和1表示的同样的位置,即第一个字符。还有,concat只能拼接两个字符串,拼接多个字符串可以使用||。此外,空值处理函数和条件取值函数的格式需要多加练习以加强记忆。
      行列转换是借助于子查询和case when then语句的结合实现的,也要多加练习。
回复 使用道具 举报
4,rowid 和 rownum的区别;
1,rowid是在表每一行都有一个物理id,rowid伪列返回的就是改行的物理地址,可以根据rowid快速查找这一行,也是这一行的唯一标识;
2,rownum在查询的结果集中,rownum为结果集中的每一行标识一个行号,有序的往下顺延,可以通过rownum伪列可以限制查询结果集中返回的行数,也就是分页技术;
5,连接查询,内连接,外连接,子查询;
连接查询是关系数据库中最主要的查询,主要包过内连接,外连接和交叉连接等;
1,内连接的连接查询结果中仅包括满足条件的就行,可以把inner join 简写成join,
2,外连接,分为左外连接和右外连接, 左边的表为主表,主表中的所有的元数都列出来,并且能在副表中找到配备的元数,那么连接成功,没能找到配备元数副表对应的元数都是空值;
3,子连接查询是将一个查询语句的结果作为另一个查询的条件,也就是语句嵌套,外层的select语句叫做外部查询,里面的叫做子查询;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马