查询表达式

查询表达式query_expression是PLOSCAR的核心表达式,PLOSCAR支持所有类型的神通数据库查询表达式。查询表达式生成一个查询结果集,也就是一个所谓的基本表。查询表达式的类型是集合类型,可以将查询表达式中的一条记录赋给一个记录变量或者行变量。

查询表达式可以是两个查询表达式的交、并、差,可以是一个表的连接,也可以是SELECT加上字段名列表和一个表表达式,还可以是一个集合类型的函数调用或过程调用。

查询表达式可以包含一个FROM子句、一个WHERE子句、一个GROUP BY子句和HAVING子句。

详细用法请参考《神通数据库SQL语言参考手册》“函数和操作符”章节

示例环境准备:

--  清理环境
drop table student CASCADE;

--创建查询环境
create table student 
(
    id int,
    name varchar(50),
    subject varchar(50),
    score int
);
insert into student values(1001,'xiaoming','Physics',90);
insert into student values(1001,'xiaoming','Maths',97);
insert into student values(1001,'xiaoming','Chemistry',94);
insert into student values(1002,'ganggang','Physics',80);
insert into student values(1002,'ganggang','Maths',70);
insert into student values(1002,'ganggang','Chemistry',90);
insert into student values(1003,'honghong','Physics',93);
insert into student values(1003,'honghong','Maths',95);
insert into student values(1003,'honghong','Chemistry',91);
insert into student values(1004,'zhangsan','Physics',95);
insert into student values(1004,'zhangsan','Maths',96);
insert into student values(1004,'zhangsan','Chemistry',95);

  • SELECT ... WHERE 列或运算式比较运算运算[any|all](子查询)

只要主查询中列或运算式与子查询所得结果中任一(any)或全部(all)数据符合比较条件的话则主查询的结果为我们要的数据

示例:选出成绩最高的学生信息

SELECT * FROM student
    WHERE score = all(SELECT MAX(score) FROM student);
ID(int)      |NAME(varchar)      |SUBJECT(varchar)      |SCORE(int)      |
----------------------------------------------------------------------
1001         |xiaoming           |Maths                 |97              |
总数目:1

    

示例:选出所有成绩大于xiaoming的学生信息

SELECT * FROM student WHERE score > ANY(
    SELECT score FROM student WHERE name = 'xiaoming') order by ID,SCORE;
ID(int)      |NAME(varchar)      |SUBJECT(varchar)      |SCORE(int)      |
----------------------------------------------------------------------
1001         |xiaoming           |Chemistry             |94              |
----------------------------------------------------------------------
1001         |xiaoming           |Maths                 |97              |
----------------------------------------------------------------------
1003         |honghong           |Chemistry             |91              |
----------------------------------------------------------------------
1003         |honghong           |Physics               |93              |
----------------------------------------------------------------------
1003         |honghong           |Maths                 |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Chemistry             |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Physics               |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Maths                 |96              |
总数目:8

    
  • SELECT ...WHERE 列或运算式[NOT] IN (子查询)

只要主查询中列或运算式是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据

示例:选出所有成绩等于90的学生信息

SELECT * FROM student WHERE score IN (
    SELECT score FROM student WHERE score = 90);
ID(int)      |NAME(varchar)      |SUBJECT(varchar)      |SCORE(int)      |
----------------------------------------------------------------------
1001         |xiaoming           |Physics               |90              |
----------------------------------------------------------------------
1002         |ganggang           |Chemistry             |90              |
总数目:2

    
  • SELECT ...WHERE [NOT] EXISTS ( 子查询)

子查询的结果至少存在一条数据时,则主查询的结果为我们要的数据。(EXISTS)或自查询的结果找不到数据时,则主查询的结果为我们要的数据(NOT EXISTS)

示例:选出分数为九十分的学生信息

SELECT * FROM student WHERE EXISTS (
    SELECT score FROM student WHERE score = 90) order by ID,SCORE;
ID(int)      |NAME(varchar)      |SUBJECT(varchar)      |SCORE(int)      |
----------------------------------------------------------------------
1001         |xiaoming           |Physics               |90              |
----------------------------------------------------------------------
1001         |xiaoming           |Chemistry             |94              |
----------------------------------------------------------------------
1001         |xiaoming           |Maths                 |97              |
----------------------------------------------------------------------
1002         |ganggang           |Maths                 |70              |
----------------------------------------------------------------------
1002         |ganggang           |Physics               |80              |
----------------------------------------------------------------------
1002         |ganggang           |Chemistry             |90              |
----------------------------------------------------------------------
1003         |honghong           |Chemistry             |91              |
----------------------------------------------------------------------
1003         |honghong           |Physics               |93              |
----------------------------------------------------------------------
1003         |honghong           |Maths                 |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Physics               |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Chemistry             |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Maths                 |96              |
总数目:12

    
  • SELECT ...WHERE ...GROUP BY

对所选的记录进行分组

示例:查询每个学生的最高成绩

SELECT MAX(score) FROM student GROUP BY id;
MAX(int)      |
--------------
90            |
--------------
96            |
--------------
95            |
--------------
97            |
总数目:4

  • SELECT ...WHERE ...ORDER BY

对所选的记录进行排序

示例:查询所有学生成绩从低到高排列

SELECT * FROM student ORDER BY score,ID;
ID(int)      |NAME(varchar)      |SUBJECT(varchar)      |SCORE(int)      |
----------------------------------------------------------------------
1002         |ganggang           |Maths                 |70              |
----------------------------------------------------------------------
1002         |ganggang           |Physics               |80              |
----------------------------------------------------------------------
1001         |xiaoming           |Physics               |90              |
----------------------------------------------------------------------
1002         |ganggang           |Chemistry             |90              |
----------------------------------------------------------------------
1003         |honghong           |Chemistry             |91              |
----------------------------------------------------------------------
1003         |honghong           |Physics               |93              |
----------------------------------------------------------------------
1001         |xiaoming           |Chemistry             |94              |
----------------------------------------------------------------------
1003         |honghong           |Maths                 |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Chemistry             |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Physics               |95              |
----------------------------------------------------------------------
1004         |zhangsan           |Maths                 |96              |
----------------------------------------------------------------------
1001         |xiaoming           |Maths                 |97              |
总数目:12

  • SELECT ...WHERE ...GROUP BY ...HAVING...

对所选的分组记录添加额外的约束条件

示例:查询平均分

查询平均分数大于id为1001,科目为Physics 学生的其他学生的平均分

SELECT id, name, AVG(score) FROM student 
    GROUP BY id, name HAVING AVG(score) > (
        SELECT score FROM student WHERE id=1001 AND subject = 'Physics');
ID(int)      |NAME(varchar)      |AVG(numeric)      |
--------------------------------------------------
1001         |xiaoming           |93.666666666      |
--------------------------------------------------
1004         |zhangsan           |95.333333333      |
--------------------------------------------------
1003         |honghong           |93                |
总数目:3

        
--  删除表
DROP TABLE student CASCADE;