主键的作用

对于关系表,有个很重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键

  • 插入相同主键的两条记录是不被允许的。
  • 记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
  • 不使用任何业务相关的字段作为主键。
  • 对于大部分应用来说,通常自增类型的主键就能满足需求。

查询语法:

  • SELECT * FROM <表名> WHERE <条件表达式>
  • SQL引擎不能把多个name的值放入一行记录中。因此,聚合查询的列中,只能放入分组的列。

SELECT 的作用

A subquery in SELECT can be treated as a single numeric value to use in your calculations

SELECT 
    -- Select the stage and average goals for each stage
    m.stage,
    ROUND(avg(m.home_goal + m.away_goal),2) AS avg_goals,
    -- Select the average overall goals for the 2012/2013 season
    ROUND((SELECT avg(home_goal + away_goal) 
           FROM match 
           WHERE season = '2012/2013'),2) AS overall
FROM match AS m
-- Filter for the 2012/2013 season
WHERE season = '2012/2013'
-- Group by stage
GROUP BY m.stage;

图片说明

但如果加上GROUP BY 则不会被聚合成单独的一个值

SELECT
         stage,
         avg(home_goal + away_goal) AS avg_goals
     FROM match
     WHERE season = '2012/2013'
     GROUP BY stage

图片说明

关联子查询Correlated Subqueries与简单子查询的区别

https://zhuanlan.zhihu.com/p/279209849
简单子查询和关联子查询的主要区别是:前者是独立于主查询的,会先一次性执行在作为固定的结果用在主查询中,后者是依赖于主查询的,是逐条循环执行的,会显著拖慢速度,所以小心别在查询中加入过多关联子查询,否则可能执行很长时间

SELECT的书写顺序和执行顺序

https://zhuanlan.zhihu.com/p/41844742

书写顺序:
SELECT》FROM 》WHERE》GROUP BY》HAVE》ORDER BY
执行顺序:
FROM 》WHERE》GROUP BY》HAVE》SELECT》ORDER BY

FROM子查询

https://blog.csdn.net/qq_42539533/article/details/88310855

1.FROM 子查询的数据来源是另外一个查询的结果,这个子查询的结果相当于一张临时数据表
2.必须为子查询定义别名
3.如果要使用子查询中的字段,则应该使用"别名.字段名"的方式进行引用

查询出平均工资高于2000的职位名称以及该职位的平均工资

第一种方式:可以使用HAVING字句实现

SELECT job,AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal)>2000;

第二种方式:使用FROM子查询

SELECT job,avgsal
FROM (
  SELECT job,AVG(sal) AS avgsal
    FROM emp
      GROUP BY job) temp
WHERE temp.avgsal>2000;  

共用表表达式CTE

https://www.cnblogs.com/careyson/archive/2011/12/12/2284740.html
对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了.

公用表达式的定义非常简单,只包含三部分:
请在这里输入引用内容

  1. 公用表表达式的名字(在WITH之后)
  2. 所涉及的列名(可选)
  3. 一个SELECT语句(紧跟AS之后)

一个简单的非递归公用表表达式:
图片说明

公用表表达式的好处之一是可以在接下来一条语句中多次引用:
图片说明

Limit

限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。

SELECT *
FROM mytable
LIMIT 2, 3;

组合查询

http://www.cyc2018.xyz/%E6%95%B0%E6%8D%AE%E5%BA%93/SQL%20%E8%AF%AD%E6%B3%95.html#%E5%8D%81%E5%85%AD%E3%80%81%E7%BB%84%E5%90%88%E6%9F%A5%E8%AF%A2
使用 UNION 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行。
每个查询必须包含相同的列、表达式和聚集函数。
默认会去除相同行,如果需要保留相同行,使用 UNION ALL。
只能包含一个 ORDER BY 子句,并且必须位于语句的最后

SELECT col
FROM mytable
WHERE col = 1
UNION
SELECT col
FROM mytable
WHERE col =2;

事务管理

基本术语:
事务(transaction)指一组 SQL 语句;
回退(rollback)指撤销指定 SQL 语句的过程;
提交(commit)指将未存储的 SQL 语句结果写入数据库表;
保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。

例题

查询出所有科目都大于80分学生的姓名

参考 https://blog.csdn.net/lkwan123/article/details/89020792
select distinct name
from grade
where name not in (select distinct name from grade where score<=80);

简单写法

select name from grade group by name having min(score)>80;

查询平均分大于80分的学生

select name from ( 
    select count() t, sum(score) num, name from grade group by name   
) as a where a.num>80;

简单写法

select name, avg(score) as sc from grade group by name having avg(score)>80;