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语句的结合实现的,也要多加练习。
回复 使用道具 举报
陈强
Oracle的第二天;
这一天知识全部都是围绕对数据的各种查询展开的
对于简单查询就不做过多的记录了
包含了 : 精确查询 \ 模糊查询 \ and \ or \ and 和 or 的组合 \
                 范围查询( between and ) \ 空值查询( null ) \ 去重 ( distinct ) \ 排序( order by )
然后是一个新的知识,伪列查询
        ---rowid :查询的是每条数据的物理地址值       
        ---rownum :查询的是结果集的序号
聚合函数 :
        ---SUM \ AVG \ MAX \ MIN \ COUNT
分组聚合 :
        ---group by
        分组后的条件使用关键字---having
重点来了-----连接查询
        ---内连接查询
                \\多表查询的时候,表赋予新的别名,可读性会比较强
                \\列可以重新命名,(用于查询结果的显示)
                ---inner   join   on
        ---左外连接 ---- left   join  on
                Oracle特有的语法是,在辅表后面加上 ( + ) ,所以左外连接在右边条件表写( + )
        ---右外连接 ---right   join  on
                Eg : SELECT * FROM 表1,表2 where 表1条件( + )  = 表2条件
所以,我们有不成文的规定:
        ---能用内连接就不用外连接
        ---能有左外连接就不用右外连接
        ====因为查询性能是如下: 内连接 >> 左外连接 >> 右外连接
子查询 :就是一条sql语句的查询结果被另一句sql语句拿来使用,分为:
        ---where子查询
        ---from子查询
        ---select子查询 ---- 一般使用inner查询代替
分页查询:其实就是嵌套的关系
        ---数据层:只提供数据---排序,分组,聚合,条件
        ---伪列层: (SELECT A.* , ROWNUM RN FROM ( 数据层 ) ) A
        ---分页层:条件的使用了
Eg:
SELECT * FROM (
SELECT表1-1 . * ,ROWNUM RN FROM (
( SELECT * FROM 表1 ORDER BY 日期 ) 表1-1  WHERE ROWNUM <=20)
) WHERE RN >10
然后是单行函数,就是一些简单的对字符,数字,日期等进行操作
最后还有的是行列转换和分析函数,也不难理解.
回复 使用道具 举报
4,rowid 和 rownum的区别;
1,rowid是在表每一行都有一个物理id,rowid伪列返回的就是改行的物理地址,可以根据rowid快速查找这一行,也是这一行的唯一标识;
2,rownum在查询的结果集中,rownum为结果集中的每一行标识一个行号,有序的往下顺延,可以通过rownum伪列可以限制查询结果集中返回的行数,也就是分页技术;
5,连接查询,内连接,外连接,子查询;
连接查询是关系数据库中最主要的查询,主要包过内连接,外连接和交叉连接等;
1,内连接的连接查询结果中仅包括满足条件的就行,可以把inner join 简写成join,
2,外连接,分为左外连接和右外连接, 左边的表为主表,主表中的所有的元数都列出来,并且能在副表中找到配备的元数,那么连接成功,没能找到配备元数副表对应的元数都是空值;
3,子连接查询是将一个查询语句的结果作为另一个查询的条件,也就是语句嵌套,外层的select语句叫做外部查询,里面的叫做子查询;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马