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)

 

posted @ 2020-06-10 18:09  北冥雪  阅读(469)  评论(0编辑  收藏  举报