-
2019-03-31 20:15:00
题目:把“SC”表中“谌燕”老师教的课的成绩都更改为此课程的平均成绩;
这道题需要我们得出“谌燕”老师教的每个课程的平均成绩,然后将该平均成绩更新到成绩表中对应的课程。那么问题来了,课 程是多个的,因此平均成绩也有多个,那我要怎样才能将该课程平均成绩的更新到对应的成绩表中呢。
在这个问题上,老师给我指导了一番,
我个人得出了结论:在对某个列更新数据赋值的子查询中,我们在子查询中表的某个列去join对应更新表的某个列,这样就可以做到数据的对接。完成了数据对接后,我们就可以筛选出需要更的行,就完成了。
所以在这道题,我的做法如下:UPDATE SC C SET SCORE=(SELECT AVG(SCORE) FROM SC WHERE C.CNO = SC.CNO AND CNO IN(SELECT CNO FROM COURSE JOIN TEACHER USING(TNO) WHERE TNAME='谌燕') GROUP BY CNO) WHERE CNO IN(SELECT CNO FROM COURSE JOIN TEACHER USING(TNO) WHERE TNAME='谌燕')
更多相关内容 -
sql语句的子查询
2021-01-28 10:19:03子查询就是将一个查询语句嵌套在另一个查询语句中,内层语句的查询结果,可以作为外层查询语句的条件。 使用条件:引发子查询的情况 1、使用【not】in 的子查询 2、使用比较运算符的子查询(=、> 、>=、 &...子查询又叫嵌套查询,总结一下子查询的各种操作和处理,以便于记忆和熟练的运用。
概念:什么是子查询?
子查询就是将一个查询语句嵌套在另一个查询语句中,内层语句的查询结果,可以作为外层查询语句的条件,本文重点讲解的是放在where或者having关键词之后的情况,当然不仅限这种情形。
子查询分为一下三种情况(这里只总结运用较多的三种)
一、列子查询(多行子查询,即子查询的结果集是多行单列),位置放在where和having之后。
包含一下几种常见的情形:
1、使用【not】in 的子查询
2、使用比较运算符的子查询(=、> 、 >=、 <=、 <>、 !=、 <=>)
3、使用[not] exists 的子查询
4、使用any some 或者 all 的子查询,具体如右图:
操作浮 含义 IN/NOT IN 等于列表中的任意一个 ANY|SOME 和子查询返回的某一个值比较 ALL 和子查询返回的所有值比较 运算符 |关键字 any some all > >= 最小值 最小值 最大值 < <= 最大值 最大值 最小值 = 任意值 任意值 <> != 任意值 (仅示例) select id ,username from student where score >=any(select level from scholarship);大于等于任意一个,即取最小值 select id ,username from student where score >=some(select level from scholarship)同上 select id ,username from student where score >=all(select level from scholarship)大于等于所有的,就是大于等于里面最大的那个 其他情况参考这个示例
二、标量子查询
标量子查询的子结果集是单行单列,并且子查询条件一般放在where或者having的后面,要注意放在()内,且不加“;”。
举例说明一下:
select * from employees where salary >( select salary from employees where last_name='Abel' );
select department_id ,min(salary) from employees group by department_id having min(salary) >( select min(salay) from employees where department_id =50 );
三、行子查询(结果集是一行多列或者多行多列,用法较少,不做推荐)
举例说明:
select * from employees where (employee_id ,salary )=( select min(employee_id),max(salary) from employees ); 当然用之前的方法也是可以解决的: select * from empioyees where employee_id=( select min(employee_id) from employees ) and salary=( select max(salary) from employees );
当然子查询还有一些其他的用法,比如下面的在创建表格时的运用。
将查询结果写入到数据表格中
insert table [column_name,.......] select column_name,....... from table;
创建数据表的同时将查询结果写入到数据表中
create table if not exists table_name [create_definition,......] select_statement
ps:这里需要注意的是,新建表格的字段要与查询的字段保持一致,才可以按照对应的字段生成数据,如果不一致,会在原来的基础上生成新的字段。
create table test2 (id tinyint unsigned auto_increment key ,num tinyint unsigned ) select id ,level from scholarship ; +------+----+-------+ | num | id | level | +------+----+-------+ | NULL | 1 | 90 | | NULL | 2 | 80 | | NULL | 3 | 70 | +------+----+-------+ 这样就多出了一个level字段或者说num字段没有用上,如果我们把num字段改成level就能生成合适的表格内容了。 +----+-------+ | id | level | +----+-------+ | 1 | 90 | | 2 | 80 | | 3 | 70 | +----+-------+
另外还有一些子查询语句是放在select下面的,举一个例子说明一下:
select d.*,( select count(*) from employees e where e.department=d.department ) from departments d; select ( select department_name from departments d join employees e on d.department_id =e.department_id ) from departments d;
还有一部分是放在from后面的,一般from后面跟着的是表格,这里相当于把子查询的结果集当成是表格来处理,不再做示例了,有兴趣的可以百度一下。
-
SQL语句(五)子查询
2021-08-03 10:16:54行子查询(结果为一行多列或多行多列)四 、SELECT后面的子查询五、FROM后面的子查询六、EXISTS后面的子查询EXISTS语句的作用简单应用 一、子查询含义 出现在其他语句中的select语句,称为子查询或内查询。 二、子...文章目录
一、子查询含义
出现在其他语句中的
select语句
,称为子查询
或内查询
。二、子查询分类
按子查询的位置分
位置 支持的查询 SELECT
后面支持 标量子查询
FROM
后面支持 表子查询
WHERE
或HAVING
后面支持 标量子查询
、列子查询
和行子查询
EXISTS
后面支持 表子查询
按结果集的行列数不同分
分类类型 结果集行数 标量子查询 一行一列 列子查询 一列多行 行子查询 一行多列 表子查询 多行多列 三、WHERE后面的子查询
1. 标量子查询
tips: 单行操作符(> < =等)只能搭配标量子查询
查询工资比
Abel
高的所有员工信息①查询Abel的工资
SELECT salary FROM employees WHERE last_name = 'Abel';
结果为
单行单列
:
②查询员工的信息,满足salary>①
查询公司工资最少的员工的last_name
,job_id
,salary
:
①查询MIN(salary)SELECT MIN(salary) FROM employees;
②查询符号这项工资的员工,
salary=①
SELECT last_name, job_id, salary FROM employees WHERE salary=( SELECT MIN(salary) FROM employees );
查询
job_id
与141号员工相同,salary
比143号员工多的员工的姓名
,job_id
和工资
①141号员工的job_id
SELECT job_id FROM employees WHERE employee_id=141;
②143号员工的
salary
SELECT salary FROM employees WHERE employee_id=143;
③ 结果集映射到
last_name
,job_id
,salary
,且满足条件job_id=①
和salary>②
SELECT last_name, job_id, salary FROM employees WHERE job_id=( SELECT job_id FROM employees WHERE employee_id=141 )AND salary>( SELECT salary FROM employees WHERE employee_id=143 );
2. 列子查询(多行子查询)
使用多行操作符:
IN
/NOT IN
IN()
等价于=ANY()
NOT IN()
等价于<>ALL()
ANY
/SOME
ALL
返回
location_id
是1400或1700
的部门中的所有员工姓名
使用
联表查询
操作得到结果:SELECT last_name FROM departments d INNER JOIN employees e ON d.department_id = e.department_id WHERE d.location_id IN (1400, 1700);
使用
列子查询
得到结果:
①查询location_id
是1400或1700
的所有部门的编号
SELECT department_id FROM departments WHERE location_id IN (1400, 1700);
②查询满足部门编号在列表内的员工的姓名
SELECT last_name FROM employees WHERE department_id IN( SELECT department_id FROM departments WHERE location_id IN (1400, 1700) );
查询
其他工种
中的
比job_id
为IT_PROG
工种的任一员工工资低的
员工的:工号
,姓名
①获取
IT_PROG
工种所有工资SELECT DISTINCT salary FROM employees WHERE job_id='IT_PROG'
②查询其他部门中符合条件
salary<min(①)
的员工信息SELECT job_id, last_name FROM employees WHERE salary < ANY( SELECT DISTINCT salary FROM employees WHERE job_id='IT_PROG' ) AND job_id!='IT_PROG';
3. 行子查询(结果为一行多列或多行多列)
查询
员工编号最小
而且工资最高的员工信息
①查询最小的员工编号SELECT MIN(employee_id) FROM employees;
②查询员工的最高工资
SELECT MAX(salary) FROM employees;
③查询符合
employee_id=①,salary=②
的员工SELECT * FROM employees WHERE employee_id=( SELECT MIN(employee_id) FROM employees )AND salary=( SELECT MAX(salary) FROM employees );
使用
行子查询
的等价写法:SELECT * FROM employees WHERE (employee_id, salary) = ( SELECT MIN(employee_id), MAX(salary) FROM employees );
四 、SELECT后面的子查询
查询
每个部门
的员工个数
使用
联表查询
操作:SELECT department_name 部门名, COUNT(1) 员工数量 FROM employees e RIGHT JOIN departments d ON e.department_id = d.department_id GROUP BY department_name
使用
子查询
:SELECT department_id, department_name,( SELECT COUNT(1) FROM employees e WHERE e.department_id=d.department_id ) 对应员工数 FROM departments d;
在使用子查询中,外部的表名的别名可以传递到子查询中,例如上面的
departments
表的别名d
就传递到了子查询中。该子查询可以理解为:
- 先获取
外层查询的结果集
- 然后对结果集的
每条记录进行遍历
,将对应的参数填入到子查询中
得到单条记录的结果拼接到新列中
五、FROM后面的子查询
查询
每个部门的平均工资
的工资等级
①查询每个部门的平均工资
SELECT AVG(salary) ag,department_id FROM employees e WHERE e.department_id IS NOT NULL GROUP BY department_id;
②查询对应的工资等级,连接
①的结果集和job_grades
表SELECT department_id, ag, grade_level FROM ( SELECT AVG(salary) ag,department_id FROM employees e WHERE e.department_id IS NOT NULL GROUP BY department_id ) ag_dep INNER JOIN job_grades j ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
即可以将子查询的结果集
作为一张表
用于联表查询操作六、EXISTS后面的子查询
EXISTS语句的作用
EXISTS语句后的括号中填入一个子查询语句,返回的结果为
false
(0
)或true
(1
),分别代表查询结果是否为空。例:
SELECT EXISTS(SELECT employee_id FROM employees); SELECT EXISTS(SELECT employee_id FROM employees WHERE salary=30000);
简单应用
查询
有员工
的部门名
:SELECT department_name FROM departments d WHERE EXISTS( SELECT * FROM employees e WHERE e.department_id = d.department_id );
这里等价于用
IN
SELECT department_name FROM departments d WHERE d.department_id IN( SELECT DISTINCT department_id FROM employees );
查询
没有女票
的男神信息
使用
EXISTS
语句- 查询
男神信息
- 筛选条件:他
没有女票
等价于beauty
表中没有boyfriend_id
为当前男生的记录
等价于beauty
表中boyfriend_id
为当前男生的id
的记录不存在
SELECT * FROM boys bo WHERE NOT EXISTS( SELECT * FROM beauty b WHERE bo.id=b.boyfriend_id );
使用
IN
完成相同的任务:- 查询
男神信息
- 筛选条件:他
没有女票
等价于当前男生的id
不在beauty
表中boyfriend_id
字段的集合中
SELECT * FROM boys b WHERE b.id NOT IN( SELECT boyfriend_id FROM beauty );
-
SQL编程之子查询及注意事项
2020-12-15 09:46:56子查询是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT…INTO 语句、INSERT…INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。 语法:select ….from 表1 where 列1 > (子查询) 外面的查询成为父... -
SQL语句基础-子查询
2019-06-26 17:24:26在SQL语句中,一个select-from-where语句称为一个查询块。如果一个select语句嵌套在一个select,insert,update或delete语句中,则称之为子查询或者内存查询。包含子查询的语句则称为主查询或者外层查询 子查询语句...子查询
在SQL语句中,一个select-from-where语句称为一个查询块。如果一个select语句嵌套在一个select,insert,update或delete语句中,则称之为子查询或者内存查询。包含子查询的语句则称为主查询或者外层查询
子查询语句一般出现在where和having子句中
写在where中的子句中的子查询一般有下面的形式- WHERE <列名> [NOT] IN (子查询) // (集合
- WHERE <列名> 比较运算符 (子查询) //(单值
- WHERE EXISTS (子查询) //(是否空值
例如:
使用子查询进行基于集合的查询
//查询与钟文辉同学在同一个系的同学 //第一步先查询钟文辉同学所在的系 //然后把系作为已知条件查找同学信息 SELECT * FROM Student WHERE Sdept IN( SELECT Sdept FROM Student Where Sname ='钟文辉') ;
使用子查询进行比较查询
//查询选修了C04课程且课程成绩高于此课程平均成绩的的学生学号和该门课成绩 //先查出C04课程的平均成绩 //然后把平均成绩作为已知条件查找同学学号和成绩 SELECT Sno, Grade FROM SC WHERECno='C04' AND Grade>( SELECT AVG(Grade) FROM SC Where Cno ='C04') ;
带有ANY和ALL的子查询
//查询比C03课程成绩都高的选了C04课程的学生的学号和成绩 SELECT Sno, Grade FROM SC WHERECno='C04' AND Grade>ALL( SELECT Grade FROM SC Where Cno ='C03') ;
使用带EXSITS谓词的子查询
//查询选修了C04课程且课程的学生姓名 SELECT Sname FROM SC WHERE EXISTS( SELECT * FROM SC Where SC.Sno=Student.Sno AND Cno ='C04');
注意,带exists谓词的子查询是先执行外层,再执行内层查询,根据内存查询返回的true和false来判断外层数据是否满足条件。
查询的集合运算
SQL提供与关系代数中集合并,交,差对应的谓词,他们分别是UNION,INTERSECT,EXCEPT,当使用这些操作进行查询时,参与运算的两个查询分别用括号括起来。
例如://查询计算机系和机电系的所有学生信息 ( SELECT *FROM Student WHERE Sdept='计算机系') UNION ( SELECT *FROM Student WHERE Sdept='机电系') //查询同时选修了C03和C04课程的学生的学号 (SELECT Sno FROM SC WHERE Cno='C03') INTERSECT (SELECT Sno FROM SC WHERE Cno='C04') //查询选修了C01但是没有选修C02课程的学生的学号 (SELECT Sno FROM SC WHERE Cno='C01') EXCEPT (SELECT Sno FROM SC WHERE Cno='C02')
-
SQL语句详解(四)——SQL联表查询
2021-12-15 11:13:11今天我们继续给大家介绍MySQL相关知识,本文主要内容是SQL联表查询。 一、SQL联表查询简介 二、内链接 三、外链接 四、交叉链接 五、结果链接 -
sql在插入语句使用子查询_SQL插入查询
2020-07-13 08:24:52sql 查询插入SQL INSERT Query also referred as SQL INSERT INTO is the command used for inserting data into database. SQL INSERT statement allows insertion of data into one table at a time. SQL INSERT... -
SQL查询语句中,什么叫子查询?
2021-02-07 19:27:07展开全部嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询不但能够出现在e69da5e6ba903231313335323631343130323136353331333365643662Where子句中,也能够出现在from子句... -
SQL语句多表关联查询语法
2021-03-03 10:11:37**sql语句多表关联查询语法** 一、外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on student.Num=score.Stu_id; 2.右连接 right join 或 right outer join SQL... -
SQL语句中的嵌套子查询
2019-06-20 21:29:52SQL语句;相关子查询;求选修了所有课程的学生的学号 -
sql语句优化-左连接和子查询
2019-04-29 11:04:35现有a,b,c表需要连表查询,a表是主表接近百万数据,b,c表只有几百条, select a.x, b.x, c.x from a left join b on a.key = b.key left join c on a.key = c.key where ... 修改之后 select a.x, (select b.x... -
Linux运维-运维课程d2-MySQL基本SQL语句(下)-08-SQL查询语句之SQL五子句.mp4
2022-05-31 13:00:31Linux运维-运维课程d2-MySQL基本SQL语句(下)-08-SQL查询语句之SQL五子句.mp4 -
SQL server 查询语句
2021-07-01 21:44:52select * from test.dbo.users -- 普通条件查询 where id=1; 模糊查询 select * from test.dbo.users where username like '%li%'; 范围查询 select * from test.dbo.users -- id在1~3之间的数据 where id... -
sql语句中的子查询
2018-10-29 23:23:511.独立子查询:子查询语句可以独立查询 2.相关子查询: 独立子查询:子查询可以独立运行。 相关子查询: 子查询中引用了父查询的结果,不可以独立运行。 所有查询都可以用相关子查询实现。exists(...)返回... -
【数据库】SQL语句(超全查询语句)
2020-05-29 01:25:33SQL (structured query language)结构...SQL语句 注释快捷键: ctrl + / 取消注释快捷键: ctrl + shift + / 1.对表的操作 创建表: create table 表名( 字段名 类型 约束(不是必填选项), 字段名 类型 约. -
sql 子查询及基本语句 挺全的收录
2018-06-06 00:30:35引自https://blog.csdn.net/jia_gugang/article/details/80282873一、SQL子查询语句 1、单行子查询 select ename,deptno,sal from emp where deptno=(select deptno from dept where loc='NEW YORK');... -
子查询sql怎么写
2020-12-17 14:42:45一、子查询简介: 子查询就是嵌套在主查询中的查询。...二、子查询sql示例: 个人认为这个sql很实用,都可以套着用。 select * from user where id in (select s.userid from score s where english = 90) -
sqlserver子查询及基本语句
2018-05-11 16:01:37一、SQL子查询语句 1、单行子查询 select ename,deptno,sal from emp where deptno=(select deptno from dept where loc='NEW YORK'); 2、多行子查询 SELECT ename,job,sal FROM EMP ... -
SQL语句——查询
2021-01-05 18:05:30SQL 语句 单表查询 查询语句(SELECT)是数据库中最基本的和最重要的语句之一,其功能是从数据库中检索满足条件的数据。查询的数据源可以来自一张表,也可以来自多张表甚至来自视图,查询的结果是由0行(没有满足... -
SQL语句in中使用子查询
2017-05-16 16:42:13SELECT ID, NAME FROM A WHERE ID IN ( ( SELECT RIGHT (ids, CHARINDEX('.', ids) - 1) FROM b WHERE ID = 1 ), ( SELECT LEFT (ids, CHARINDEX('.', ids) - 1) FROM -
sql语句where in子查询优化
2018-06-01 14:22:26好好理解好好理解 转载请注明出处。 作者:wuxiwei 出处:http://www.cnblogs.com/wxw16/p/6105624.html -
MySQL,SQL语句执行顺序
2021-01-19 16:30:591.SQL执行顺序:select 考生姓名, max(总成绩) asmax总成绩fromtb_Gradewhere 考生姓名 is not nullgroup by考生姓名having max(总成绩) > 600order by max总成绩(1). 首先执行 FROM 子句, 从 tb_Grade 表组装... -
SQL查询语句之查询数据
2021-11-11 22:08:11在MySQL 中是使用SELECT语句来查询数据的。 1、基本查询语句 查询数据是数据库操作中最常用的操作。通过对数据库的查询,用户可以从数据库中获取需要的数据。数据库中可能包含着无数的表,表中可能包含着无数的... -
SQL语句多表连接查询语法
2019-07-28 09:32:13总结:内连接就是两个表的交集 ,左外连接就是左边表加两表交集 ,右外连接就是右边表加两表交集 ...SQL语句:select * from student left join score on student.Num=score.Stu_id; 2.右连接 right join 或 r... -
sql 子查询 嵌套查询_SQL子查询– SQL中的嵌套查询
2020-07-10 17:34:52sql 子查询 嵌套查询In the real world, there are times when we need a particular set of data but we don’t have the exact details for getting the data set. In such cases, we try to get the information ... -
mysql语句统计总数_一条sql语句实现统计查询_MySQL
2021-01-28 04:43:16bitsCN.com一条sql语句实现统计查询如图:程序员在进行如下的统计时,现在提供两种实现方案:方案一:运用 SEKECT CASE WHENEXPLAIN SELECT count(*) AS '总数', count( CASE oup.status WHEN '1' THEN oup.id END )... -
sql语句中from后面是子查询,需要给子查询加别名吗?
2020-05-21 13:13:17同样的一条sql语句select * from (select ename from emp);,在mysql中执行会报错,错误如下: [SQL] select * from (select ename from emp); [Err] 1248 - Every derived table must have its own alias 如果在... -
SQL语言中的子查询
2022-04-28 10:49:05子查询是嵌套在另一个语句,如:select,insert,update、delete中的查询 子查询的例子: (2)嵌套子查询 子查询可以嵌套在另外一个子查询中,SQL Server最多支持32个嵌套级别 嵌套子查询的例子: ... -
MySQL数据库高级SQL查询语句(单表查询,多表联合查询)
2021-08-16 21:41:50目录SQL查询语句基础查询条件查询模糊查询字段控制查询排序聚合函数分组查询having子句limit分页查询多表连接查询 SQL查询语句 数据查询语言。 数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给... -
tp5.1 子查询SQL 查询语句中再包涵查询语句闭包查询 带分页
2018-11-06 10:02:53一、使用闭包构造子查询 1-1、带变量查询 带变量,要加use ($teachers_id) ->where('id', 'IN', function ($query) use ($teachers_id) { //老师课程 $list=Db::name('product') //查询点播的课程 ...