select s.student_id,s.name,count(*)
from students,students_grade sg
where s.student_id=sg.student_id
group by s.student_id,s.name
having count(*)>1
order by s.student;
1.select 1 from table 增加临时列,每行的列值是写在select后的数,这条语句中是1
注:exists(select 1 from table )只是看结果集是否存在,无关乎select后的数值是多少;
2.select count(1) from table 不管count(a)a的值如何变化,得出来的始终都是table的行数;
3.select sum(1) from table 计算临时列的和;
4.exists :强调的是是否返回结果集,不要求知道返回什么
exists: sql返回的结果集为真
not exists: sql返回的结果集不为真
------------------------------------------------------------------------------------------exists,not exists举例------------------------------------------------------------------
方法:按照exists的思路来写sql,最后再取not exists数据
如下:
表A: ID NAME
1 A1
2 A2
3 A3
表B: ID AID NAME
1 1 B1
2 2 B2
3 2 B3
表A和表B的关系是一对多的关系 A.ID=>B.AID
SELECT ID,NAME FROM A WHERE EXISTS (SELECT *FROM B WHERE A.ID=B.AID)
执行结果为:
1 A1
2 A2
NOT EXISTS 就是反过来
SELECT ID,NAME FROM A WHERE NOT EXISTS (SELECT *FROM B WHER A.ID=B.AID)
执行结果为:
3 A3
-------------------------------------------------------------------------------INNER JOIN ,LEFT LEFT JOIN -----------------------------------------------------------------------
内连接: A inner join B 表示取满足条件的A,B表中的共同条件数据;
外链接: 包括左外链接 left outer join 或者left join
右外链接 right outer join 或者 right join
全外链接 full outer join 或者 full join
A LEFT JOIN B :取A中的所有数据,满足条件的B中的部分数据,B中不满足条件的用空值填充;
A right join B : 取B。。。。。。。。。。。。。A。。。。。。。A...........................................;
A full join B : 取A,B表满足条件的所有数据,包括填充的空值部分,等价于:
A LEFT JOIN B
UNION
A RIGHT JOIN B;
------------------------------------------------------------------------------------常用函数------------------------------------------------------------------------------------------------------
1.concat(x,y)字符连接;
instr (x,y,n,m):在x中查找y,n为查找的起始位置,m为Y中第几次出现的位置;
lpad(x,n,y):在x的左边补充y字符,得到总长度为n个字符的字符串;
nvl(x,y):x为空,返回y,否则返回x;
nvl2(x,y,z):x不为空,返回y,否则返回z;
substr(,n[m]):从第n个字符开始截取m个字符;
2、
rank()/ dense_rank() over (partion by e.deptno order by e.sal desc) 语法
over:在什么条件之上;
partion by : 按照什么字段分区,分类
oeder by e.sal desc:按照工资从高到底进行排序
注意:使用rank()/dense_rank()时,必须要带order by,否则非法;
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用;
带order by的是连续求和/排名,不带oeder by的是不连续的;
rank():分级
整条语句的意思:在按照部门划分的基础上,按照工资的高低对雇员进行分级排序,级别由小到大的数值表示(最小值一定为1)
rank():跳跃排序,如果有两个第一级时,接下来就是第三极;
dense——rank():连续排序,如果有两个第一级时,接下来仍然是第二级;