达梦数据库部分查询语句(单表查询、连接查询、子查询)实例练习
-
单表查询
select语句仅从一个表/视图中检索数据,称单表查询。即<FROM 子句>中<普通表> 使用的是[<模式名>.]<基表名|视图名>。
1、简单查询
SELECT DISTINCT <表的列名>或<*>(*表示所查表的所有列) FROM PRODUCTION .PRODUCT;
例如:
1)、查询表中所有列内容
2)、查询表中某几列(图中文所查询的是goods_id,price ,discount ,specification这四列)
注:DISTINCT 保证重复的行将从结果中去除。若允许有重复的元组,改用 all 来替换distion,或直接去掉DISTINCT即可
当用户需要查出所有列的数据,且各列的显示顺序与基表中列的顺序也完全相同时,为了方便用户提高工作效率,SQL语言允许用户将SELECT后的<值表达式>省略为*(及为表的所有列)。SELECT * FROM <表名>;
2、带条件查询
带条件查询是指在指定表中查询出满足条件的元组(列)。该功能是在查询语句中使用 where 子句实现的。where子句常用的查询条件由谓词和逻辑运算符组成。谓词指明了一个条件,该条件求解后,结果为一个布尔值:真、假或未知。
逻辑算符有:and,or,not。
比较查询有(=、>、<、>=、<=、<>)
between、in、like、null、exists
例如:
查询表i_goods中商品价格在20~50之间的商品id、商品标题、商品折扣、类别id和当前价格
1)、使用比较查询
select goods_id,goods_title, discount ,category_id,price from vspace_1.i_goods
where price>=20 and price<=50;
2)、between查询
select goods_id,goods_title, discount ,category_id,price from vspace_1.i_goods
where price between 20 and 50;
3)、in查询
查询表i_goods中折扣为0.6和0.8的商品id、商品标题、商品折扣、类别id、价格
select goods_id,goods_title, discount,category_id,price from vspace_1.i_goods
where discount in ('0.6','0.8');
4)、like查询
- 查询以“蛋”结尾的商品id、商品标题、商品折扣、价格
select goods_id,goods_title, discount ,price from vspace_1.i_goods
where goods_title like '__蛋';
- 查询有“蛋”字的商品id、商品标题、商品折扣、价格
select goods_id,goods_title, discount ,price from vspace_1.i_goods
where goods_title like '%蛋%';
注:百分号“%”和下划线“_”,“%”和“_”称通配符。“%”代表任意字符串(也可以是空串);“_”代表任何一个字符。
5)、组合逻辑
可以用逻辑算符(AND,OR,NOT)与各种谓词相组合生成较复杂的条件查询。
例如:
查询表i_goods里的商品标题中以肉结尾或者折扣小于等于0.8和价格小于等于25的商品标题、商品折扣、价格
select goods_title, discount ,price from vspace_1.i_goods
where goods_title='%肉' or discount<=0.8 and price<=25;
-
连接查询
一个查询包含多个表(>=2),则称这种方式的查询为连接查询。即<FROM子句>中使用的是<连接表>。
DM的连接查询方式包括:
1交叉连接(cross join)
2自然连接(natural join)
3内连接(inner)
4外连接(outer)
-
交叉连接
1)、无过滤条件
题:I_basic和i_user通过交叉连接查询name和password
select n.name, p.password
from i_basic n cross join i_user p;
2)有过滤条件
通过两表中的phone连接表i_basic和i_user查询姓名、电话、密码
select n.name, n.phone,a.password
from vspace_1.i_basic n , vspace_1.i_user a
where n.phone= a.phone;
说明:
1. 连接谓词中的列类型必须是可比较的,但不一定要相同,只要可以隐式转换即可;
2. 不要求连接谓词中的列同名;
3. 连接谓词中的比较操作符可以是>、>=、<、<=、=、< >;
4. WHERE子句中可同时包含连接条件和其它非连接条件。
2、自然连接(natural join)
把两张连接表中的同名列作为连接条件,进行等值连接
具有以下特点:
1. 连接表中存在同名列;
2. 如果有多个同名列,则会产生多个等值连接条件;
3. 如果连接表中的同名列类型不匹配,则报错处理。
题:(Phone为两表同名列)
select n.name, a.password
from vspace_1.i_basic n natural join vspace_1.i_user a;
3、Join using
这是自然连接的另一种写法,JOIN关键字指定连接的两张表,USING指明连接列。要 求USING中的列存在于两张连接表中。
select name, password
from vspace_1.i_basic join vspace_1.i_user using(phone) ;
4、join…on
这是一种连接查询的常用写法,说明是一个连接查询。JOIN关键字指定连接的两张表, ON 子句指定连接条件表达式
select n.name, n.in_card,a.password
from vspace_1.i_basic n join vspace_1.i_user a
on n.phone= a.phone;
5、内连接(inner join)
根据连接条件,结果集仅包含满足全部连接条件的记录,我们称这样的连接为内连接
6、外连接(outer join)
外连接对结果集进行了扩展,会返回一张表的所有记录,对于另一张表无法匹配的字段 用NULL填充返回。DM数据库支持三种方式的外连接:左外连接、右外连接、全外连接。
外连接中常用到的术语:左表、右表。
根据表所在外连接中的位置来确定,位于左侧的 表,称为左表;位于右侧的表,称为右表。
1. 左外连接:返回左表所有记录;
2. 右外连接:返回右表所有记录;
3. 全外连接:返回两张表所有记录。
处理过程为分别对两张表进行左外连接和右外连 接,然后合并结果集。 在左外连接和右外连接中,如果需要对未能匹配的缺失数据进行填充,可以使用分区外 连接(PARTITION OUTER JOIN),分区外连接通常用于处理稀疏数据以得到分析报表。
-
子查询
在DM_SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块,如果在一个查 询块中嵌套一个或多个查询块,我们称这种查询为子查询。
它通常采用(SELECT…)的形式嵌套在表达式中
子查询语法如下:
<子查询> ::= (<查询表达式>),即子查询是嵌入括弧的<查询表达式>,而这个<查询表达式>通常是一个SELECT语句。
它有下列限制:
1. 在子查询中不得有ORDER BY子句;
2. 子查询允许TEXT类型与CHAR类型值比较。比较时,取出TEXT类型字段的最多 8188 字节与 CHAR 类型字段进行比较;如果比较的两字段都是 TEXT 类型,则最多取 300*1024字节进行比较;
3. 子查询不能包含在集函数中;
4. 在子查询中允许嵌套子查询。
- 按子查询返回结果的形式,DM子查询可分为两大类:
1. 标量子查询:只返回一行一列;
2. 表子查询:可返回多行多列。