精华内容
下载资源
问答
  • sql子查询语句举例
    千次阅读
    2021-01-28 10:19:03

    子查询又叫嵌套查询,总结一下子查询的各种操作和处理,以便于记忆和熟练的运用。

    概念:什么是子查询?

    子查询就是将一个查询语句嵌套在另一个查询语句中,内层语句的查询结果,可以作为外层查询语句的条件,本文重点讲解的是放在where或者having关键词之后的情况,当然不仅限这种情形。

    子查询分为一下三种情况(这里只总结运用较多的三种)

    一、列子查询(多行子查询,即子查询的结果集是多行单列),位置放在where和having之后。

    包含一下几种常见的情形:

    1、使用【not】in 的子查询

    2、使用比较运算符的子查询(=、> 、 >=、 <=、 <>、 !=、 <=>)

    3、使用[not] exists 的子查询

    4、使用any  some  或者 all 的子查询,具体如右图:

    操作浮含义
    IN/NOT IN等于列表中的任意一个
    ANY|SOME和子查询返回的某一个值比较
    ALL和子查询返回的所有值比较
    运算符 |关键字anysomeall
    >     >=最小值最小值最大值
    <     <=最大值最大值最小值
    =任意值任意值  
    <>   !=  任意值
    (仅示例)
    
    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子查询语句1、单行子查询select ename,deptno,salfrom empwhere deptno=(select deptno from dept where loc='NEW YORK');2、多行子查询SELECT ename,job,salFROM EMPWHERE deptno in ( SELECT deptno FROM ...

    一、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

    WHERE deptno in ( SELECT deptno FROM dept WHERE dname LIKE

    'A%');

    3、多列子查询

    SELECT deptno,ename,job,sal

    FROM EMP

    WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP GROUP BY

    deptno);

    4、内联视图子查询 (1)SELECT ename,job,sal,rownum

    FROM (SELECT ename,job,sal FROM EMP ORDER BY sal);

    (2)SELECT ename,job,sal,rownum

    FROM ( SELECT ename,job,sal FROM EMP ORDER BY sal)

    WHERE rownum<=5;

    5、在HAVING子句中使用子查询

    SELECT deptno,job,AVG(sal) FROM EMP GROUP BY deptno,job HAVING

    AVG(sal)>(SELECT sal FROM EMP WHERE

    ename='MARTIN');

    6、内连接 左连接 右连接举例;

    select sys_user.user_id

    ,sys_user.user_code from sys_user

    inner join XZFW_BANJIE

    on sys_user.user_id=XZFW_BANJIE.userid

    小例子:

    select top 10 * from

    sys_user where user_code not in

    (select user_code from sys_user where user_code like '%yzj%')

    二、SQL基本语句

    下列语句部分是Mssql语句,不可以在access中使用。

    SQL分类:

    DDL—数据定义语言(Create,Alter,Drop,DECLARE)

    DML—数据操纵语言(Select,Delete,Update,Insert)

    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:

    1、说明:创建数据库

    Create DATABASE database-name

    2、说明:删除数据库

    drop database dbname

    3、说明:备份sql server

    --- 创建 备份数据的 device

    USE master

    EXEC sp_addumpdevice 'disk', 'testBack',

    'c:\mssql7backup\MyNwind_1.dat'

    --- 开始 备份

    BACKUP DATABASE pubs TO testBack

    4、说明:创建新表

    create table tabname(col1 type1 [not null] [primary key],col2 type2

    [not null],..)

    根据已有的表创建新表:

    A:create table tab_new like tab_old (使用旧表创建新表)

    B:create table tab_new as select col1,col2… from tab_old definition

    only

    5、说明:删除新表drop table tabname

    6、说明:增加一个列

    Alter table tabname add column col type

    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    7、说明:添加主键: Alter table tabname add primary key(col)

    说明:删除主键: Alter table tabname drop primary key(col)

    8、说明:创建索引:create [unique] index idxname on tabname(col….)

    删除索引:drop index idxname

    注:索引是不可更改的,想更改必须删除重新建。

    9、说明:创建视图:create view viewname as select statement

    删除视图:drop view viewname

    10、说明:几个简单的基本的sql语句

    选择:select * from table1 where 范围

    插入:insert into table1(field1,field2) values(value1,value2)

    删除:delete from table1 where 范围

    更新:update table1 set field1=value1 where 范围

    查找:select * from table1 where field1 like ’%value1%’

    ---like的语法很精妙,查资料!

    排序:select * from table1 order by field1,field2 [desc]

    总数:select count * as totalcount from table1

    求和:select sum(field1) as sumvalue from table1

    平均:select avg(field1) as avgvalue from table1

    最大:select max(field1) as maxvalue from table1

    最小:select min(field1) as minvalue from table1

    11、说明:几个高级查询运算词

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随

    UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自

    TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随

    EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随

    INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

    注:使用运算词的几个查询结果行必须是一致的。

    12、说明:使用外连接

    A、left outer join:

    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON

    a.a = b.c

    B:right outer join:

    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join:

    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

    法一:select * into b from a where

    1<>1

    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where

    条件

    例子:..from b in

    '"&Server.MapPath(".")&"\data.mdb"

    &"' where..

    4、说明:子查询(表名1:a 表名2:b)

    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c

    from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间

    select a.title,a.username,b.adddate from table a,(select

    max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)

    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a =

    b.c

    7、说明:在线视图查询(表名1:a )

    select * from (Select a,b,c FROM a) T where t.a >

    1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

    select * from table1 where time between time1 and time2

    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法

    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息

    delete from table1 where not exists ( select * from table2 where

    table1.field1=table2.field1 )

    11、说明:四表联查问题:

    select * from a left inner join b on a.a=b.b right inner join c on

    a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒

    SQL: select * from 日程安排 where

    datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by

    排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录

    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

    select a,b,c from tablename ta where a=(select max(a) from

    tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

    (select a from tableA ) except (select a from tableB) except

    (select a from tableC)

    17、说明:随机取出10条数据

    select top 10 * from tablename order by newid()

    18、说明:随机选择记录

    select newid()

    19、说明:删除重复记录

    Delete from tablename where id not in (select max(id) from

    tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名

    select name from sysobjects where type='U'

    21、说明:列出表里的所有的

    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select

    中的case。

    select type,sum(case vender when 'A' then pcs else 0 end),sum(case

    vender when 'C' then pcs else 0 end),sum(case vender when 'B' then

    pcs else 0 end) FROM tablename group by type

    显示结果:

    type vender pcs

    电脑 A 1

    电脑 A 1

    光盘 B 2

    光盘 A 2

    手机 B 3

    手机 C 3

    23、说明:初始化表table1

    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录

    select top 5 * from (select top 15 * from table order by id asc)

    table_别名 order by id desc

    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)

    对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:

    Randomize

    RNumber = Int(Rnd*499) +1

    While Not objRec.EOF

    If objRec("ID") = RNumber THEN

    ... 这里是执行脚本 ...

    end if

    objRec.MoveNext

    Wend

    这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID

    的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber

    等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?

    采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:

    Randomize

    RNumber = Int(Rnd*499) + 1

    SQL = "Select * FROM Customers Where ID = " &

    RNumber

    set objRec = ObjConn.Execute(SQL)

    Response.WriteRNumber & " = " &

    objRec("ID") & " " &

    objRec("c_email")

    不必写出RNumber

    和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。

    再谈随机数

    现在你下定决心要榨干Random

    函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random

    示例扩展一下就可以用SQL应对上面两种情况了。

    为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:

    SQL = "Select * FROM Customers Where ID = " &

    RNumber & " or ID = " & RNumber2

    & " or ID = " & RNumber3

    假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN

    或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 Select 语句只显示一种可能(这里的ID

    是自动生成的号码):

    SQL = "Select * FROM Customers Where ID BETWEEN " &

    RNumber & " AND " & RNumber

    & "+ 9"

    注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

    随机读取若干条记录,测试过

    Access语法:Select top 10 * From 表名 orDER BY Rnd(id)

    Sql server:select top n * from 表名 order by newid()

    mysqlelect * From 表名 order By rand() Limit n

    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试,

    现在记下以备后查)

    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join

    table2 on table1.fd1,table2.fd1 where ...

    使用SQL语句 用...代替过长的字符串显示

    语法:

    SQL数据库:select case when len(field)>10 then

    left(field,10)+'...' else field end as news_name,news_id from

    tablename

    Access数据库:Select

    iif(len(field)>2,left(field,2)+'...',field) FROM

    tablename;

    Conn.Execute说明

    Execute方法

    该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:

    1.执行SQL查询语句时,将返回查询得到的记录集。用法为:

    Set 对象变量名=连接对象.Execute("SQL 查询语言")

    Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

    2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:

    连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]

    ·RecordAffected

    为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。

    ·Option

    可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法

    这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。

    事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

    BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。

    展开全文
  • SQL查询系列】子查询经典案例

    千次阅读 2021-06-01 09:52:24
    近期在补SQL的基础,特别整理了一下SQL的一些查询练习语句,边学边笔记,持续更新~ 数据库 查询案例 1. 查询工资最低的员工信息: last_name, salary #①查询最低的工资 SELECT MIN(salary) FROM employees #②查询...

    前言

    近期在补SQL的基础,特别整理了一下SQL的一些查询练习语句,边学边笔记,持续更新~

    数据库

    img

    查询案例

    1. 查询工资最低的员工信息: last_name, salary

    #①查询最低的工资
    SELECT MIN(salary)
    FROM employees
    
    #②查询last_name,salary,要求salary=①
    SELECT last_name,salary
    FROM employees
    WHERE salary=(
    	SELECT MIN(salary)
    	FROM employees
    );
    

    2. 查询平均工资最低的部门信息

    #方式一:
    #①各部门的平均工资
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id
    #②查询①结果上的最低平均工资
    SELECT MIN(ag)
    FROM (
    	SELECT AVG(salary) ag,department_id
    	FROM employees
    	GROUP BY department_id
    ) ag_dep
    
    #③查询哪个部门的平均工资=②
    
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id
    HAVING AVG(salary)=(
    	SELECT MIN(ag)
    	FROM (
    		SELECT AVG(salary) ag,department_id
    		FROM employees
    		GROUP BY department_id
    	) ag_dep
    
    );
    
    #④查询部门信息
    
    SELECT d.*
    FROM departments d
    WHERE d.`department_id`=(
    	SELECT department_id
    	FROM employees
    	GROUP BY department_id
    	HAVING AVG(salary)=(
    		SELECT MIN(ag)
    		FROM (
    			SELECT AVG(salary) ag,department_id
    			FROM employees
    			GROUP BY department_id
    		) ag_dep
    
    	)
    
    );
    
    #方式二:
    #①各部门的平均工资
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id
    
    #②求出最低平均工资的部门编号
    SELECT department_id
    FROM employees
    GROUP BY department_id
    ORDER BY AVG(salary) 
    LIMIT 1;
    
    #③查询部门信息
    SELECT *
    FROM departments
    WHERE department_id=(
    	SELECT department_id
    	FROM employees
    	GROUP BY department_id
    	ORDER BY AVG(salary) 
    	LIMIT 1
    );
    

    3. 查询平均工资最低的部门信息和该部门的平均工资

    #①各部门的平均工资
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id
    #②求出最低平均工资的部门编号
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id
    ORDER BY AVG(salary) 
    LIMIT 1;
    #③查询部门信息
    SELECT d.*,ag
    FROM departments d
    JOIN (
    	SELECT AVG(salary) ag,department_id
    	FROM employees
    	GROUP BY department_id
    	ORDER BY AVG(salary) 
    	LIMIT 1
    ) ag_dep
    ON d.`department_id`=ag_dep.department_id;
    

    4. 查询平均工资最高的 job 信息

    #①查询最高的job的平均工资
    SELECT AVG(salary),job_id
    FROM employees
    GROUP BY job_id
    ORDER BY AVG(salary) DESC
    LIMIT 1
    #②查询job信息
    SELECT * 
    FROM jobs
    WHERE job_id=(
    	SELECT job_id
    	FROM employees
    	GROUP BY job_id
    	ORDER BY AVG(salary) DESC
    	LIMIT 1
    );
    

    5. 查询平均工资高于公司平均工资的部门有哪些?

    #①查询平均工资
    SELECT AVG(salary)
    FROM employees
    
    #②查询每个部门的平均工资
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id
    
    #③筛选②结果集,满足平均工资>①
    SELECT AVG(salary),department_id
    FROM employees
    GROUP BY department_id
    HAVING AVG(salary)>(
    	SELECT AVG(salary)
    	FROM employees
    );
    

    6. 查询出公司中所有 manager 的详细信息.

    #①查询所有manager的员工编号
    SELECT DISTINCT manager_id
    FROM employees
    
    #②查询详细信息,满足employee_id=①
    SELECT *
    FROM employees
    WHERE employee_id =ANY(
    	SELECT DISTINCT manager_id
    	FROM employees
    );
    

    7. 各个部门中 最高工资中最低的那个部门的 最低工资是多少

    #①查询各部门的最高工资中最低的部门编号
    SELECT department_id
    FROM employees
    GROUP BY department_id
    ORDER BY MAX(salary)
    LIMIT 1
    
    #②查询①结果的那个部门的最低工资
    SELECT MIN(salary) ,department_id
    FROM employees
    WHERE department_id=(
    	SELECT department_id
    	FROM employees
    	GROUP BY department_id
    	ORDER BY MAX(salary)
    	LIMIT 1
    );
    

    8. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary

    #①查询平均工资最高的部门编号
    SELECT 
        department_id 
    FROM
        employees 
    GROUP BY department_id 
    ORDER BY AVG(salary) DESC 
    LIMIT 1 
    
    #②将employees和departments连接查询,筛选条件是①
        SELECT 
            last_name, d.department_id, email, salary 
        FROM
            employees e 
            INNER JOIN departments d 
                ON d.manager_id = e.employee_id 
        WHERE d.department_id = 
            (SELECT 
                department_id 
            FROM
                employees 
            GROUP BY department_id 
            ORDER BY AVG(salary) DESC 
            LIMIT 1) ;
    

    student数据库

    img

    查询练习

    一、查询每个专业的学生人数 SELECT majorid,COUNT(*)

    FROM student
    GROUP BY majorid;
    

    二、查询参加考试的学生中,每个学生的平均分、最高分

    SELECT AVG(score),MAX(score),studentno
    FROM result
    GROUP BY studentno;
    

    三、查询姓张的每个学生的最低分大于60的学号、姓名

    SELECT s.studentno,s.`studentname`,MIN(score)
    FROM student s
    JOIN result r
    ON s.`studentno`=r.`studentno`
    WHERE s.`studentname` LIKE '张%'
    GROUP BY s.`studentno`
    HAVING MIN(score)>60;
    

    四、查询每个专业生日在“1988-1-1”后的学生姓名、专业名称

    SELECT m.`majorname`,s.`studentname`
    FROM student s
    JOIN major m
    ON m.`majorid`=s.`majorid`
    WHERE DATEDIFF(borndate,'1988-1-1')>0
    GROUP BY m.`majorid`;
    

    五、查询每个专业的男生人数和女生人数分别是多少

    SELECT COUNT(*),sex,majorid
    FROM student
    GROUP BY sex,majorid;
    

    六、查询专业和张翠山一样的学生的最低分

    #①查询张翠山的专业编号
    SELECT majorid
    FROM student
    WHERE studentname = '张翠山'
    
    #②查询编号=①的所有学生编号
    SELECT studentno
    FROM student
    WHERE majorid=(
    	SELECT majorid
    	FROM student
    	WHERE studentname = '张翠山'
    
    )
    #②查询最低分
    SELECT MIN(score)
    FROM result
    WHERE studentno IN(
    
    	SELECT studentno
    	FROM student
    	WHERE majorid=(
    		SELECT majorid
    		FROM student
    		WHERE studentname = '张翠山'
    
    	)
    )
    

    七、查询大于60分的学生的姓名、密码、专业名

    SELECT studentname,loginpwd,majorname
    FROM student s
    JOIN major m ON s.majorid=  m.majorid
    JOIN result r ON s.studentno=r.studentno
    WHERE r.score>60;
    

    八、按邮箱位数分组,查询每组的学生个数

    SELECT COUNT(*),LENGTH(email)
    FROM student
    GROUP BY LENGTH(email);
    

    九、查询学生名、专业名、分数

    SELECT studentname,score,majorname
    FROM student s
    JOIN major m ON s.majorid=  m.majorid
    LEFT JOIN result r ON s.studentno=r.studentno
    

    十、查询哪个专业没有学生,分别用左连接和右连接实现

    #左
    SELECT m.`majorid`,m.`majorname`,s.`studentno`
    FROM major m
    LEFT JOIN student s ON m.`majorid` = s.`majorid`
    WHERE s.`studentno` IS NULL;
    
    #右
    SELECT m.`majorid`,m.`majorname`,s.`studentno`
    FROM student s
    RIGHT JOIN  major m ON m.`majorid` = s.`majorid`
    WHERE s.`studentno` IS NULL;
    

    十一、查询没有成绩的学生人数

    SELECT COUNT(*)
    FROM student s
    LEFT JOIN result r ON s.`studentno` = r.`studentno`
    WHERE r.`id` IS NULL
    

    【学习资料】

    【01学习笔记】

    【02课程资料】

    展开全文
  • SQL语言中的子查询

    千次阅读 2022-04-28 10:49:05
    子查询是嵌套在另一个语句,如:select,insert,update、delete中的查询 子查询的例子: (2)嵌套子查询 子查询可以嵌套在另外一个子查询中,SQL Server最多支持32个嵌套级别 嵌套子查询的例子: ...

    (1)子查询

    子查询是嵌套在另一个语句,如:selectinsertupdatedelete中的查询

    子查询的例子:

                 

    (2)嵌套子查询

    子查询可以嵌套在另外一个子查询中,SQL Server最多支持32个嵌套级别

    嵌套子查询的例子:

    查找价格高于'上海永久''凤凰'品牌的所有产品的平均定价的产品。

    第一步: 子查询以获取品牌名称为 '上海永久' '凤凰' 的品牌标识号列表:

          

    第二步: 计算属于这些品牌的所有产品的平均价格。

          

    第三步: 查找价格高于 '上海永久' '凤凰' 品牌的所有产品的平均定价的产品

           

    (3)相关子查询

    ①相关子查询是使用外部查询的值的子查询。即,它取决于外部查询的值

    ②相关子查询不能作为简单子查询独立执行

    ③对外部查询评估的每一行重复执行一次相关子查询。相关子查询也称为重复子查询

    相关子查询的例子:查找价格等于其类别的最高价格的产品

            

    (4)Exists运算符

            exists 运算符是一个逻辑运算符,用于检查子查询是否返回任何行

            如果子查询返回一行或多行,则exists运算符返回true

    ①带子查询的exists返回null示例

    例子:

    例子说明:查询返回包含null的结果集,这也导致exists运算符计算为true

    ②Exists带相关子查询示例

         例子:

              

    例子说明:如果客户下达的订单数小于或等于2,则子查询返回一个空结果集

              该结果集导致exists运算符计算为false

    ③Exists与in示例

            例子:

                

         SQLexistsin的使用及效率:

        a:通常采用exists要比in效率高,因为in不走索引

        b:看实际情况:in适合于外表大而内表小的情况;而exists相反

        c:当a表数据与b表数据一样大时,inexists效率差不多,可选其一

    ④any运算符

    any运算符是一个逻辑运算符,它将标量值与子查询返回单列值集进行比较

            例子:

                  

              注意:some运算符等效于any运算符

    ⑤all运算符

               all运算符是一个逻辑运算符,它将标量值与子查询返回的单列值列表进行比较

            例子:

                

    展开全文
  • 常用SQL查询语句

    千次阅读 2021-04-30 17:31:05
    常用SQL查询语句 一、简单查询语句 查看表结构 SQL>DESC emp; 查询所有列 SQL>SELECT * FROM emp; 查询指定列 SQL>SELECT empmo, ename, mgr FROM emp; SQL>SELECT DISTINCT mgr FROM emp; 只显示...
  • 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 ServerSQL的简单查询语句。图文并茂,方便大家理解与学习。有兴趣的朋友可以看下
  • 八种常规常用的SQL查询语句

    千次阅读 2020-12-17 09:49:25
    1.查询所有记录 select * from table 2.关联表 查询格式,主要用到 left join table on 条件 微软不推荐from后面写多个表名的做法。主要还是可读性、规范性方面的考虑。 3.排序 1:字段名为你要排序...
  • mysql查询语句,子查询的几种方式

    千次阅读 2021-12-14 15:50:58
    子查询的语法与正常的sql查询语句一致,只是嵌套在sql语句中,通常用来简化多表联查,也可以与多表联查混合使用,子查询语句可以嵌套在select,form,where等关键字后. 例如: select(子查询) form 表 where 条件 ...
  • 以下列举一些涉及单表和多表的基本查询语句例子,简单实用。由于本人是初学者,不足之处恳请大家斧正!附:韩顺平sql语句复杂查询地址http://v.youku.com/v_show/id_XODMxMDI2MTA0.html?spm=a2h0k.8191407.0.0&...
  • 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语句多表查询:【多表连查】和【子查询】 说明:insert、update、delete只针对【一张表】执行操作。 说明:select可以查询一张表、也可以查询多张表。 说明:多表查询分为:【多表连查】和【子查询】。 (一)多表...
  • GROUP BY语句和HAVING语句,经过研究和练习,终于明白如何使用了,在此记录一下同时添加了一个自己举的小例子,通过写这篇文章来加深下自己学习的效果,还能和大家分享下,同时也方便以后查阅,一举多得,下面由小编...
  • SQL基础条件查询语句

    千次阅读 2019-05-24 20:25:48
    1.1、 SQL基础条件查询语句 首先往表中插入一些数据 mysql> insert into students values(2,‘lis’,25),(3,‘wange’,26),(4,‘libin’,28),(5,‘tom’,30),(6,‘sorry’,24); Query OK, 5 rows affected ...
  • 为了获得稳定的执行性能,SQL语句越简单越好。对复杂的SQL语句,要设法对之进行简化,本文给大家介绍优化SQL语句提高数据库性能,对sql语句优化性能优化相关知识感兴趣的朋友一起学习吧
  • 二、有关题型:题目给出文字叙述,要求我们写出sql语句。 解题方法:仔细读题,弄清所给条件和题目中涉及到了几张表 解题的一般模式: (1)你要的结果的属性列来自的表(最外层表) (2)满足题目条件
  • sql语句———多表联查

    千次阅读 2022-04-22 13:06:15
    连接查询 内连接: 相当于查询集合A与集合B的交集部分 外连接 左外连接:查询左表所有数据,以及两张表交集部分数据 右外连接:查询右表所有数据,以及两张表交集部分数据 自连接:当前表与自身的连接查询,自连接...
  • sql 执行顺序-子查询

    千次阅读 2021-05-13 16:54:57
    如何正确理解SQL关联子查询 一、基本逻辑 对于外部查询返回的每一行数据,内部查询都要执行一次。在关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回...
  • 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 oracle递归查询

    2020-12-16 10:10:13
    ☆ 获取数据库所有表名,表的...SqlServer2005和Oracle 两个版本以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:SqlServer2005版本的Sql如下:比如一个表,有i
  • 子查询不仅可以嵌套在SELECT语句中用以构造父查询的条件,也可以嵌套在INSERT语句中用以生成要插入的批量数据 插入子查询结果的INSERT语句格式为: # 插入子查询结果 INSERT INTO <表名> [(<属性列1>[,&...
  • MySQL子查询

    千次阅读 2022-05-10 08:52:35
    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出...
  •  SQL分类:  DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)  首先,简要介绍基础语句:  1、...
  • Sno on Studnet(Sno) 删除索引语法格式:drop index 5、视图操作 创建视图语法格式: create view 视图名 (列表名) as select 查询字句 [with check option] 视图创建规定: 1、子查询可以是任意复杂的查询语句,...
  • SQL——相关子查询和不相关子查询

    千次阅读 多人点赞 2019-11-03 18:24:41
    SQL中经常使用在“FROM/WHERE”字句中包含一个形如“SELECT-FROM-WHERE”的查询块,这样的查询块称为子查询或嵌套查询,包含子查询语句称为父查询或外部查询。 子查询分为相关子查询和不相关子查询 接下来将举例...
  • 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句
  • SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...
  • SQL查询语句的执行流程(以Oracle举例) 首先, 准备两张表 用户表user 角色表role 先来一个基本的查询语句 SELECT * FROM &amp;amp;quot;user&amp;amp;quot; u, &amp;amp;quot;role&amp;amp;quot; r ...
  • SQL语句多表查询例子

    万次阅读 2018-03-19 17:43:38
    这里我们建几个SQL表,我们用个图来说明关系这里tid的值和教师表中的id相匹配,pid和院系表中的id相匹配,也就是说这样建表就把三张表的关系给建立起来了。学生表在最低层,院系表在最高层。 而这里我们就要讲一个...
  • MySQL中特别实用的几种SQL语句送给大家

    万次阅读 多人点赞 2020-06-11 17:23:49
    在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。 目录 实用的SQL 1.插入或替换 2....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,568
精华内容 15,427
关键字:

sql子查询语句举例

友情链接: S665_SVPWM_14a.zip