📅  最后修改于: 2020-12-02 06:08:39             🧑  作者: Mango
本章说明以下重要查询。
让我们继续执行查询。
谓词是用于评估真/假值和未知的表达式。在WHERE子句和HAVING子句以及其他需要布尔值的构造的搜索条件中使用谓词。
确定要测试的表达式的值是否与子查询或列表中的任何值匹配。子查询是一种普通的SELECT语句,其结果集为一列和一个或多个行。此列或列表中的所有表达式必须与要测试的表达式具有相同的数据类型。
句法
IN::=
[NOT] IN ()
| (,...)
询问
select id,name,address from mytable where id in(2,3,4);
结果
上面的查询将产生以下结果。
id, name, address
-------------------------------
2, Amit, 12 old street
3, Bob, 10 cross street
4, David, 15 express avenue
该查询从mytable返回学生ID 2,3和4的记录。
询问
select id,name,address from mytable where id not in(2,3,4);
结果
上面的查询将产生以下结果。
id, name, address
-------------------------------
1, Adam, 23 new street
5, Esha, 20 garden street
6, Ganga, 25 north street
7, Jack, 2 park street
8, Leena, 24 south street
9, Mary, 5 west street
10, Peter, 16 park avenue
上面的查询从mytable返回记录,其中学生不在2,3和4中。
LIKE谓词在第一表达式用于计算字符串值,其被refered到作为值测试,与在第二个表达式定义用于计算字符串值的图案指定的字符串进行比较。
该模式可以包含通配符的任意组合,例如-
带下划线的符号(_),可代替值中的任何单个字符进行测试。
百分号(%),它将替换要测试的值中任何零个或多个字符的字符串。
句法
LIKE::=
[NOT] LIKE
[ESCAPE ]
询问
select * from mytable where name like ‘A%';
结果
上面的查询将产生以下结果。
id, name, address, age, mark
-------------------------------
1, Adam, 23 new street, 12, 90
2, Amit, 12 old street, 13, 95
该查询从mytable返回名称以“ A”开头的那些学生的记录。
询问
select * from mytable where name like ‘_a%';
结果
上面的查询将产生以下结果。
id, name, address, age, mark
——————————————————————————————————————-
4, David, 15 express avenue, 12, 85
6, Ganga, 25 north street, 12, 55
7, Jack, 2 park street, 12, 60
9, Mary, 5 west street, 12, 75
该查询从mytable返回其名称以“ a”作为第二个字符的那些学生的记录。
现在让我们了解如何在搜索条件中使用NULL值。
句法
Predicate
IS [NOT] NULL
询问
select name from mytable where name is not null;
结果
上面的查询将产生以下结果。
name
-------------------------------
Adam
Amit
Bob
David
Esha
Ganga
Jack
Leena
Mary
Peter
(10 rows, 0.076 sec, 163 B selected)
在这里,结果为true,因此它返回表中的所有名称。
询问
现在让我们检查条件为NULL的查询。
default> select name from mytable where name is null;
结果
上面的查询将产生以下结果。
name
-------------------------------
(0 rows, 0.068 sec, 0 B selected)
说明用于获取查询执行计划。它显示了语句的逻辑和全局计划执行。
explain select * from mytable;
explain
-------------------------------
=> target list: default.mytable.id (INT4), default.mytable.name (TEXT),
default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)
=> out schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=> in schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
结果
上面的查询将产生以下结果。
查询结果显示给定表的逻辑计划格式。逻辑计划返回以下三个结果-
explain global select * from mytable;
explain
-------------------------------
-------------------------------------------------------------------------------
Execution Block Graph (TERMINAL - eb_0000000000000_0000_000002)
-------------------------------------------------------------------------------
|-eb_0000000000000_0000_000002
|-eb_0000000000000_0000_000001
-------------------------------------------------------------------------------
Order of Execution
-------------------------------------------------------------------------------
1: eb_0000000000000_0000_000001
2: eb_0000000000000_0000_000002
-------------------------------------------------------------------------------
=======================================================
Block Id: eb_0000000000000_0000_000001 [ROOT]
=======================================================
SCAN(0) on default.mytable
=> target list: default.mytable.id (INT4), default.mytable.name (TEXT),
default.mytable.address (TEXT), default.mytable.age (INT4), default.mytable.mark (INT4)
=> out schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT),default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=> in schema: {
(5) default.mytable.id (INT4), default.mytable.name (TEXT), default.mytable.address (TEXT),
default.mytable.age (INT4), default.mytable.mark (INT4)
}
=======================================================
Block Id: eb_0000000000000_0000_000002 [TERMINAL]
=======================================================
(24 rows, 0.065 sec, 0 B selected)
结果
上面的查询将产生以下结果。
在这里,全局计划显示执行块ID,执行顺序及其信息。
SQL连接用于合并两个或多个表中的行。以下是不同类型的SQL连接-
请考虑以下两个表来执行联接操作。
Id | Name | Address | Age |
---|---|---|---|
1 | Customer 1 | 23 Old Street | 21 |
2 | Customer 2 | 12 New Street | 23 |
3 | Customer 3 | 10 Express Avenue | 22 |
4 | Customer 4 | 15 Express Avenue | 22 |
5 | Customer 5 | 20 Garden Street | 33 |
6 | Customer 6 | 21 North Street | 25 |
Id | Order Id | Emp Id |
---|---|---|
1 | 1 | 101 |
2 | 2 | 102 |
3 | 3 | 103 |
4 | 4 | 104 |
5 | 5 | 105 |
现在,让我们继续对上述两个表执行SQL连接操作。
当两个表中的列匹配时,内部联接将从两个表中选择所有行。
句法
SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
询问
default> select c.age,c1.empid from customers c inner join customer_order c1 on c.id = c1.id;
结果
上面的查询将产生以下结果。
age, empid
-------------------------------
21, 101
23, 102
22, 103
22, 104
33, 105
该查询匹配两个表中的五行。因此,它从第一个表返回匹配的行年龄。
左外部联接保留“左”表的所有行,而不管“右”表上是否有匹配的行。
询问
select c.name,c1.empid from customers c left outer join customer_order c1 on c.id = c1.id;
结果
上面的查询将产生以下结果。
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
customer6,
在这里,左外部联接返回customers(left)表中的名称列行,并返回customer_order(right)表中的empid列匹配行。
右外部联接将保留“右”表的所有行,而不管“左”表上是否有匹配的行。
询问
select c.name,c1.empid from customers c right outer join customer_order c1 on c.id = c1.id;
结果
上面的查询将产生以下结果。
name, empid
-------------------------------
customer1, 101
customer2, 102
customer3, 103
customer4, 104
customer5, 105
在这里,“右外部联接”返回customer_order(right)表中的空行,而name列匹配客户表中的行。
完全外部联接保留了左右表中的所有行。
询问
select * from customers c full outer join customer_order c1 on c.id = c1.id;
结果
上面的查询将产生以下结果。
该查询返回来自customers和customer_order表的所有匹配和不匹配的行。
这将从两个或多个联接表中返回记录集的笛卡尔积。
句法
SELECT * FROM table1 CROSS JOIN table2;
询问
select orderid,name,address from customers,customer_order;
结果
上面的查询将产生以下结果。
上面的查询返回表的笛卡尔积。
自然连接不使用任何运算符。它没有连接笛卡尔积的方式。仅当两个关系之间至少存在一个公共属性时,我们才能执行自然联接。
句法
SELECT * FROM table1 NATURAL JOIN table2;
询问
select * from customers natural join customer_order;
结果
上面的查询将产生以下结果。
在这里,两个表之间存在一个公共列ID。使用该公共列,自然联接将两个表联接在一起。
SQL SELF JOIN用于将表联接到自身,就像该表是两个表一样,从而在SQL语句中临时重命名至少一个表。
句法
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_filed = b.common_field
询问
default> select c.id,c1.name from customers c, customers c1 where c.id = c1.id;
结果
上面的查询将产生以下结果。
id, name
-------------------------------
1, customer1
2, customer2
3, customer3
4, customer4
5, customer5
6, customer6
该查询将一个客户表与其自身相连。