SQL 操作集合
Posted 北冥雪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 操作集合相关的知识,希望对你有一定的参考价值。
一、几种 join 的用法
1、inner join 和 join 一样的
中间交集
2、left join
以左边为主,右侧匹配不到全赋为 null
3、right join
以右边为主,左侧匹配不到全赋为 null
4、full outer join
两侧全匹配,任一元组中匹配不到的值全赋为 null
可用灵活使用 null 作为条件查询(需注意不是 ‘=’,是 is 判断)
SELECT DISTINCT course.* FROM course full join score on course.courseno = score.courseno WHERE score.courseno is null
参考:https://www.cnblogs.com/reaptomorrow-flydream/p/8145610.html
二、排序
默认升序,上面最小。使用 desc 降序
select top 1 score.* from score INNER JOIN course on score.courseno = course.courseno where course.cname = \'电子技术\' ORDER BY final desc
对不同的属性可相应设置值
ORDER BY studentno DESC , final DESC
参考:https://www.w3school.com.cn/sql/sql_orderby.asp
三、like 匹配模式
where 语句中的一种匹配模式,和 % 通配符搭配使用查询
SELECT COUNT(DISTINCT score.studentno) FROM score join course on score.courseno = course.courseno WHERE course.cname like \'%软件%\'
四、as 别名使用
select score.studentno, score.usually*0.4+score.final*0.6 as sco
要注意 sco 只能在子 select 中使用
五、substring(str, start, length)字段截取
搜索某属性的某字段具有某种意义,要单独拿出来作为条件使用(left/right (str, length) 扩展函数)
select * from dbo.student a join dbo.score b on a.studentno=b.studentno join dbo.course c on b.courseno=c.courseno where substring(a.studentno,1,2)=\'17\' and c.cname=\'电子技术\' order by final
参考:https://blog.csdn.net/album_gyd/article/details/81365573
六、聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含的子查询中,并且要对其进行聚合的列是外部引用。
聚合函数优先级比 where 低,比 having 高,所以 where 不能使用而 having 可以使用
SELECT * FROM student WHERE student.point > ( SELECT avg(student.point) FROM student ) ORDER BY student.birthday
七、group by 语句报错
[Err] 42000 - [SQL Server]选择列表中的列 \'score.studentno\' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
SELECT score.* FROM score GROUP BY score.courseno HAVING avg(score.final) < ( SELECT MIN(score.final) FROM score, course WHERE score.courseno = course.courseno and course.cname = \'机械制图\' )
是因为 select 中必须是 group 中的或者是聚合函数
八、cash语句(可代替 if 语句)
SELECT SUM(course.credit) FROM course join score on course.courseno = score.courseno WHERE ( course.type = \'必修\' and score.final > 70 ) or ( course.type = \'选修\' and score.final > 80 ) SELECT SUM( CASE WHEN course.type = \'必修\' and score.final > 70 THEN course.credit WHEN course.type = \'选修\' and score.final > 80 THEN course.credit ELSE 0 END ) FROM course, score WHERE course.courseno = score.courseno
九、drop 和 truncate 清除表格
drop table a:连 a 表也直接删除
truncate table a:只清除数据,保留表
十、精度 decimal(a,b)
a:指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38
b:指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0
select studentno, cast(AVG(final) as decimal(10,3)) from dbo.score group by studentno order by 2 desc
十一、alter table 对表进行修改,增加或删除
//增加列 ALTER TABLE table_name ADD column_name datatype //更改列属性 ALTER TABLE table_name ALTER COLUMN column_name datatype //删除列 ALTER TABLE table_name DROP COLUMN column_name
十二、datediff 日期差
DATEDIFF ( date-part, start_date, end_date )
SELECT DISTINCT sfzh
FROM spb
WHERE DATEDIFF(day, sprq, qfrq) >= 30
https://www.w3school.com.cn/sql/func_datediff.asp
十三、添加约束
ALTER TABLE hbb add CHECK(sdf<>mdd)
以上是关于SQL 操作集合的主要内容,如果未能解决你的问题,请参考以下文章
spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段