每日一贴,今天的内容关键字为查询列
单表查询
算术运算
NULL值
较比运算符
逻辑运算符
ORDER BY子句
应用SQL运算符
多表查询
结联件条和结联类型
结联查询应用SQL/92法语
1. 行的标识符
a) 在Oracle数据库中的每一行都有一个一唯的行标识符,它用于Oracle数据库部内存储行的物理位置。
b) 例如,查看customer表的信息
SELECT ROWID, customer_id
FROM customers;
c) 查询效果如下图所示:
d) 须要注意的是ROWID不并涌现在表的义定中
e) 例如,可以应用DESCRIBE命令查看customer表的信息
DESCRIBE customers
f) 执行效果如下图所示:
2. ROWNUM
a) ROWNUM可以返回结果集的行号,查询返回的第一行编号为1,第二行编号为2,依此类推
b) 例如,查询customer表的相干信息
SELECT ROWNUM, customer_id, first_name, last_name
FROM customers;
c) 查询效果如下图所示:
d) 可以将ROWNUM应用在WHERE子句中
e) 例如
SELECT ROWNUM, customer_id, first_name, last_name
FROM customers
WHERE customer_id = 3;
f) 查询效果如下图所示:
3. 数据完整性-2
a) 实体完整性
b) 域完整性
c) 用引完整性
d) 自义定完整性
4. 实体完整性
a) 实体完整性
实体完整性求要个一每表中的主键字段都不能为空或者复重的值。
b) 实现法方
i. 一唯束约
ii. 主键束约
5. 域完整性
a) 域完整性
域完整性指列的值域的完整性。如数据类型、格式、值域范围、是不是许允空值等
b) 实现法方
i. 制限数据类型
ii. 键外束约
iii. 认默值
iv. 非空束约
6. 用引完整性
a) 用引完整性
i. 也称之为参照完整性,当更新、删除、插入一个表中的数据时,通过参照用引互相干联的另一个表中的数据,来检查对表的数据操纵是不是准确。
ii. 用引完整性求要关系中不许允用引不存在的实体。
iii. 用引完整性与实体完整性是关系模型必须满意的完整性束约件条。
b) 实现法方
键外束约
7. 自义定完整性
a) 自义定完整性
户用自义定完整性指针对某一详细关系数据库的束约件条,它反应某一详细应用所及涉的数据必须满意的义语求要。
b) 实现法方
i. 存储过程
ii. 触发器
8. 选择主键的准则
a) 少最性
尽量选择单个键作为主键
b) 稳定性
尽量选择值数更新少的列作为主键
9. 主键外关系
a) 注意事项
i. 当主表中没有对应的记载时,不能将记载添加到子表
ii. 不能改更主表中的值而致导子表中的记载立孤
iii. 子表存在与主表对应的记载,不能从主表中删除该记载
iv. 删除主表前,先删子表
10. 表束约
a) 表束约的目标:保确表中数据的完整性
b) 经常使用的束约类型:
i. 主键束约(PRIMARY KEY):求要主键列数据一唯,并且不许允为空
ii. 非空束约(NOT NULL):指定的列的值不许允为空
iii. 一唯键束约(UNIQUE):求要该列一唯,许允为空,但只能涌现一个空值
iv. 检查束约(CHECK):指定表中一列或多列可以接受的数据值格式
v. 认默束约(DEFAULT):指定某列的认默值
vi. 键外束约(FOREIGN KEY):用于建立和增强两个表数据之间接连的一列或多列。通过将表中的主键列添加到另一个表中。可以建创两个表之间的接连。这个主键的列就称为第二个表的键外。键外束约以可就保确添加到键外表中的任何行都在主表中都存在应相的行
1. 日期算计
a) 可以在日期上应用加法或减法运算符,加减操纵的字数示表天数
b) 例如,在日期上加3天
SELECT TO_DATE('16-5月-2012')+3
FROM dual;
c) 在某日期上减3天
SELECT TO_DATE('16-5月-2012')-3
FROM dual;
d) 执行效果如右图所示:
1. dual表
a) dual表经常使用在没有查询标目标SELECT语句块中,它只包括一行数据
b) 可以应用DESCRIBE查看dual表结构
DESCRIBE dual
c) 查询dual表的数据
SELECT *
FROM dual;
d) 执行效果如下图所示:
2. 列的别名
a) 平日情况,当数据行从表中查询出来时,Oracle会将列名转换为大写,并表现在数据上方
b) 如果查询语句中有表达式时,表达式的名称将会表现在各位值,可认为其供给别名;别名可以应用双引号,也可以在别名前加AS关键字
c) 例如
SELECT price * 2 AS "DOUBLE_PRICE"
FROM products;
d) 查询效果如下图所示:
1. 接连
a) 可以将一些列接连起来表现,接连应用||运算符
b) 例如,查询customer表的first_name列和last_name列
c) SELECT first_name || ' ' || last_name AS "Customer Name"
d) FROM customers;
e) 查询效果如下图所示:
2. NULL值
a) NULL值示表未知的值。它是一个殊特的值,但不并是空字符串,NULL值示表该列是未知的。
b) 当某些查询语句在出输结果列上看不到值的时候,可能就是NULL值
c) 例如
SELECT customer_id, first_name, last_name, dob
FROM customers
WHERE dob IS NULL;
d) 查询效果如下图所示:
3. 处置NULL值
a) NULL值被查询出来的时候没有表现信息,如何告诉户用这是空字符串还是NULL,这可以通过NVL()函数来行进处置
b) 例如
SELECT customer_id, first_name, last_name,
NVL(phone, 'Unknown phone number') AS PHONE_NUMBER
FROM customers;
c) 查询效果如下图所示:
4. DISTINCT关键字
a) 在SELECT语句中,可以应用DISTINCT关键字删除复重的行
b) 例如,查询purchases表中,删除复重的customer_id值
SELECT DISTINCT customer_id
FROM purchases;
c) 查询结果如下图所示:
5. 较比运算符
a) 较比运算符
i. =:即是
ii. <>或!=:不即是
iii. <:小于
iv. >:大于
v. <=:小于或即是
vi. >=:大于或即是
vii. ANY:较比值列表中的任何一个值
viii. ALL:较比列表值中的有所值
b) <>运算符
i. 例如,查询customer_id不即是2的户客信息
SELECT *
FROM customers
WHERE customer_id <> 2;
ii. 查询效果如下图所示:
c) >运算符
i. 例如,查询商品编号大于8的商品
SELECT product_id, name
FROM products
WHERE product_id > 8;
ii. 查询效果如下图所示:
d) <=运算符
i. 例如,查询ROWNUM伪列小于即是3,即查询前3件商品信息
SELECT ROWNUM, product_id, name
FROM products
WHERE ROWNUM <= 3;
ii. 查询效果如下图所示:
e) ANY运算符
i. 在WHERE子句中应用ANY运算符与列表中的意任值行进较比
ii. 必须在应用ANY运算符之前应用= , <> , < , > , <= ,或 >=运算符
iii. 例如,查询customer表,customer_id值只要大于列表(2,3,4)中的意任一个值即满意件条
SELECT *
FROM customers
WHERE customer_id > ANY (2, 3, 4);
iv. 查询效果如下图所示:
f) ALL运算符
i. 在WHERE子句中应用ALL运算符与值列表中的有所值行进较比
ii. 例如,查询customer表
SELECT *
FROM customers
WHERE customer_id > ALL (2, 3, 4);
iii. 查询效果如下图所示:
6. SQL运算符
a) SQL运算符可以行进模式匹配,像字符串、列表值、NULL值。
i. LIKE:匹配字符串
ii. IN:匹配列表值
iii. BETWEEN AND:匹配范围值
iv. IS NULL:匹配空值
v. IS NAN:匹配非字值数
b) 样同可以在上述运算符前加NOT取反
i. 如:NOT LIKE ,NOT BETWEEN,IS NOT NULL,IS NOT NAN
c) LIKE运算符
i. 可以在WHERE子句中应用LIKE运算符行进字符串的匹配
ii. 可以应用普通字符及通配符行进组合,通配符如下:
iii. 下划线(_):示表匹配某个位置的字符
iv. 百分号(%):示表在某个位置的意任个字符
v. 例如,匹配’_o%’,示表第一个字母意任,第二个是o,%示表最后可以是意任个字母
vi. SELECT *
vii. FROM customers
viii. WHERE first_name LIKE '_o%';
ix. 查询效果如下图所示:
d) 转义字符
i. 如果要查询实际的下划线或百分号就须要应用ESCAPE选项区分通配符
ii. ESCAPE选项告诉数据库如何区分通配符和要匹配的字符,可以应用反斜杠(\),例如,
SELECT name
FROM promotions
WHERE name LIKE '%\%%' ESCAPE '\';
iii. 查询效果如下图所示:
e) IN运算符
i. 在WHERE子句中可以应用IN筛选某列的值是不是在列表中
ii. 例如,查询customers表,检查customer_id是不是在2、3、5中
SELECT *
FROM customers
WHERE customer_id IN (2, 3, 5);
iii. 查询效果如下图所示:
f) BETWEEN运算符
i. 在WHERE子句中可以应用BETWEEN检查某列的值是不是在一个指定的范围内。包括区间两端的值。
ii. 例如,查询customers表customer_id在1到3之间的户客
SELECT *
FROM customers
WHERE customer_id BETWEEN 1 AND 3;
iii. 查询效果如下图所示:
7. 逻辑运算符
a) 逻辑运算符许允根据逻辑件条制限行
i. x AND y
ii. x和y都必须是真时,返回真
iii. x OR y
iv. x或y为真时,返回真
v. NOT x
vi. x为假时,返回真
b) AND运算符
i. 例如
ii. 查询customer表中dob列大于’01-1月-1970’年,并且customer_id大于3的户客信息
SELECT *
FROM customers
WHERE dob > '01-1月-1970'
AND customer_id > 3;
iii. 查询效果如下图所示:
c) OR运算符
i. 例如
ii. 查询customer表中dob列大于’01-1月-1970’年,或者customer_id大于3的户客信息
SELECT *
FROM customers
WHERE dob > '01-1月-1970'
OR customer_id > 3;
iii. 查询效果如下图所示:
8. ORDER BY
a) 可以应用ORDER BY对查询的结果行进排序,可以对一列或多列行进排序,ORDER BY必须在FROM子句后或WHERE子句后(如果有WHERE子句)
b) 例如,查询customer表,并对last_name列行进排序
SELECT *
FROM customers
ORDER BY last_name;
c) 查询结果如下所示:
d) 认默情况下,ORDER BY是按照升序(ASC)排序,也可以应用DESC指定为降序排序
e) 例如,查询customers表,先按first_name升序排列,再按last_name降序排列
SELECT *
FROM customers
ORDER BY first_name ASC, last_name DESC;
f) 查询结果如下所示:
g) 样同可以是列的位置编号,指定哪列须要行进排序
h) 例如,查询customer表,要对查询的第2列first_name列行进降序排列
SELECT customer_id, first_name, last_name
FROM customers
ORDER BY 2 DESC;
i) 查询结果如下所示:
1. 多表查询
a) 不同的数据存储在不同的表中,平日要查询多张表才能找到须要的数据
i. 例如,要查询product_id为3的商品类型,须要两步骤
ii. 从products表查询出product_id为3的商品的product_type_id类型
iii. 根据上一步骤查询出的product_type_id查询出product_types
iv. 查询顺序如图所示:
b) 结联两张表的查询可以在FROM后面加两张表,然后再指定两张表的关联关系
i. 首先指定查询的两张表,如下
ii. FROM products, product_types
iii. 再通过WHERE件条指定两表的关系
iv. WHERE products.product_type_id = product_types.product_type_id
v. AND products.product_id = 3;
vi. 说明
vii. 平日情况下,是一个表的主键与另外一个表的键外相匹配;再指定产品的编号为3,即products.product_id = 3
c) 两表查询语句如下
SELECT products.name, product_types.name
FROM products, product_types
WHERE products.product_type_id = product_types.product_type_id
AND products.product_id = 3;
查询结果如下图所示:
2. 表的别名
a) products表和product_types表相干字段会用在SELECT语句及WHERE子句上,可以给表起别名,提高代码可读性、降低书写难度
b) 例如,改写查询语句
SELECT p.name, pt.name
FROM products p, product_types pt
WHERE p.product_type_id = pt.product_type_id
AND p.product_id = 3
ORDER BY p.name;
c) 查询效果如下图所示:
3. 笛卡尔乘积
a) 如果查询两张表,并且没有义定结联件条,那么查询的结果集是两表相乘的结果,这样的情况称之为笛卡尔乘积
b) 笛卡尔乘积会产生很多行结果。比如,第一张表的行数为50行,第二张表为100行,那么笛卡尔乘积产生的结果为5000行。因为第一张表的每条记载会对应第二张表的100条记载,即50*100=5000
c) 例如
SELECT pt.product_type_id, p.product_id
FROM product_types pt, products p;
d) 查询效果如下图所示:
4. 多表查询
a) 多表查询,须要查询的信息包括
i. 购买商品信息(在purchases中)
ii. 顾客姓名信息(在customers表中)
iii. 购买的商品名称(在products表中)
iv. 购买的商品类型(在product_types表中)
b) 查询语句如下
SELECT c.first_name, c.last_name, p.name AS PRODUCT, pt.name AS TYPE
FROM customers c, purchases pr, products p, product_types pt
WHERE c.customer_id = pr.customer_id
AND p.product_id = pr.product_id
AND p.product_type_id = pt.product_type_id
ORDER BY p.name;
c) 总结
i. 多表查询WHERE时,结联次数=查询时结联表的数量-1
1. 结联件条和结联类型
a) 常见的有两类结联件条
i. 等值结联:一般应用即是号(=)操纵符
ii. 非等值结联:应用除了即是以外的运算符,例如,<、>、BETWEEN等
b) 常见的三种结联类型
i. 内结联
1. 内结联返回的行只有满意结联件条才会返回。如果结联件条的列中有NULL值,那么该行则不会返回
ii. 外结联
1. 外结联返回的行满意结联件条,也包括在结联件条的列包括空值的行
iii. 自结联
1. 结联的表为同一张表
c) 非等值结联
i. 非等值结联一般应用<>、>、<、<=、>=、LIKE、IN、BETWEEN等运算符
ii. 非等值结联一般应用较比少
iii. 例如,现有工资等级表(salary_grades)
1. 数据如下:
2. 现须要查询出员工的工资等级
iv. 要查询出员工工资等级须要应用非等值结联,应用BETWEEN运算符
1. SELECT e.first_name, e.last_name, e.title, e.salary, sg.salary_grade_id
2. FROM employees e, salary_grades sg
3. WHERE e.salary BETWEEN sg.low_salary AND sg.high_salary
4. ORDER BY salary_grade_id;
v. 查询结果如下图所示:
2. 外结联
a) 外结联可以查询出即使列中包括NULL值的数据也可以查询出来
b) 外部结联运算符 (+)。在应用(+)的字段,可能包括NULL值
c) 例如,
i. SELECT p.name, pt.name
ii. FROM products p, product_types pt
iii. WHERE p.product_type_id = pt.product_type_id (+)
iv. ORDER BY p.name;
d) 查询结果如右图所示:
3. 外结联分类
a) 外结联可以分为
i. 左外结联
ii. 右外结联
b) 左外结联右外结联
i. 现有有以下查询语句
1. SELECT ...
2. FROM table1, table2
3. ...
4. 其中table1.column1和table2.column2为结联件条
ii. 假设1,table1表包括了某行的column1列的值为NULL
1. 左外结联的WHERE件条写作
2. WHERE table1.column1 = table2.column2 (+);
iii. 假设2,table2表包括了某行的column2列的值为NULL
1. 右外结联的WHERE件条写作
2. WHERE table1.column1 (+) = table2.column2;
c) 左外结联
i. 例如,有查询语句如下
1. SELECT p.name, pt.name
2. FROM products p, product_types pt
3. WHERE p.product_type_id = pt.product_type_id (+)
4. ORDER BY p.name;
ii. 查询结果如下所示:
d) 右外结联
i. 例如,有查询语句如下
1. SELECT p.name, pt.name
2. FROM products p, product_types pt
3. WHERE p.product_type_id (+) = pt.product_type_id
4. ORDER BY p.name;
ii. 查询结果如下图所示:
e) 外结联的局限性
i. 只能一侧应用外结联运算符(+),否则将提示错误
ii. 不可以在应用外结联的情况下同时应用IN运算符
4. 自结联
a) 自结联是接连同一张表。在应用同一张表时可以给它们起不同的别名。
b) 例如,employees表有manager_id列,manager_id列的值是该员工的上司编号,manager_id列对应employees表的employee_id列。如果员工没有上司则manager_id的值为NULL
c) employees表的数据如下:
d) 查询如下
i. SELECT w.first_name || ' ' || w.last_name || ' works for '||
1. m.first_name || ' ' || m.last_name
ii. FROM employees w, employees m
iii. WHERE w.manager_id = m.employee_id
iv. ORDER BY w.first_name;
e) 查询结果如下图所示:
1. 结联查询应用SQL/92法语
a) SQL/92法语中是应用INNER JOIN和ON来完成内结联的
b) 例如
i. SELECT p.name, pt.name
ii. FROM products p INNER JOIN product_types pt
iii. ON p.product_type_id = pt.product_type_id
iv. ORDER BY p.name;
c) 查询结果如右图所示:
2. 应用USING
a) SQL/92可以进一步简化结联件条,但有以下制限
b) 查询必须是等值结联
c) 结联的两张表的关联字段必须同名
d) 例如,以下查询就应用USING替代了ON关键字
i. SELECT p.name, pt.name
ii. FROM products p INNER JOIN product_types pt
iii. USING (product_type_id);
e) 查询结果如右图所示:
f) USING子句的列部分不能有限定词
g) 例如
i. SELECT p.name, pt.name, product_type_id
ii. FROM products p INNER JOIN product_types pt
iii. USING (product_type_id);
h) 上述SELECT语句可以正常执行,如果给product_type_id列加了限定的表别名,则报错
i) USING子句中的列名也不能加限定词
3. 多表查询应用SQL/92法语
a) 应用SQL/86法语查询customers、purchases、products和product_types表
i. SELECT c.first_name, c.last_name, p.name AS PRODUCT, pt.name AS TYPE
ii. FROM customers c, purchases pr, products p, product_types pt
iii. WHERE c.customer_id = pr.customer_id
iv. AND p.product_id = pr.product_id
v. AND p.product_type_id = pt.product_type_id
vi. ORDER BY p.name;
b) 应用SQL/92法语查询
i. SELECT c.first_name, c.last_name, p.name AS PRODUCT, pt.name AS TYPE
ii. FROM customers c INNER JOIN purchases pr
iii. USING (customer_id)
iv. INNER JOIN products p
v. USING (product_id)
vi. INNER JOIN product_types pt
vii. USING (product_type_id)
viii. ORDER BY p.name;
4. 外结联应用SQL/92法语
a) 之前外结联查询应用(+)运算符,这是Oracle法语
b) SQL/92应用的法语如下
i. FROM table1 { LEFT | RIGHT | FULL } OUTER JOIN table2
c) 说明
i. table1和table2是要结联查询的表
ii. LEFT:表明是左外结联
iii. RIGHT:表明是右外结联
iv. FULL:表明是完全外结联。完全外结联会返回table和table2中有所的行,包括结联列是NULL值的情况。
5. 左外结联应用SQL/92法语
a) 应用Oracle特有的(+)运算符
i. SELECT p.name, pt.name
ii. FROM products p, product_types pt
iii. WHERE p.product_type_id = pt.product_type_id (+)
iv. ORDER BY p.name;
b) 应用SQL/92的LEFT OUTER JOIN关键字
i. SELECT p.name, pt.name
ii. FROM products p LEFT OUTER JOIN product_types pt
iii. USING (product_type_id)
iv. ORDER BY p.name;
6. 右外结联应用SQL/92法语
a) 应用Oracle特有的(+)运算符
i. SELECT p.name, pt.name
ii. FROM products p, product_types pt
iii. WHERE p.product_type_id (+) = pt.product_type_id
iv. ORDER BY p.name;
b) 应用SQL/92的RIGHT OUTER JOIN关键字
i. SELECT p.name, pt.name
ii. FROM products p RIGHT OUTER JOIN product_types pt
iii. USING (product_type_id)
iv. ORDER BY p.name;
7. 完全外结联应用SQL/92法语
a) 完全外结联返回结联的有所表的行,包括NULL值
i. SELECT p.name, pt.name
ii. FROM products p FULL OUTER JOIN product_types pt
iii. USING (product_type_id)
iv. ORDER BY p.name;
b) 查询效果如下图所示:
8. 自结联应用SQL/92法语
a) 应用SQL/86法语
i. SELECT w.last_name || ' works for ' || m.last_name
ii. FROM employees w, employees m
iii. WHERE w.manager_id = m.employee_id;
1. SQL/92法语应用INNER JOIN和ON关键字
iv. SELECT w.last_name || ' works for ' || m.last_name
v. FROM employees w INNER JOIN employees m
vi. ON w.manager_id = m.employee_id;
9. 交叉结联应用SQL/92法语
a) SQL/92法语产生笛卡尔乘积须要应用CROSS JOIN关键字
b) 如,查询product_types表和products表
i. SELECT *
ii. FROM product_types CROSS JOIN products;
单表查询
算术运算
NULL值
较比运算符
逻辑运算符
ORDER BY子句
应用SQL运算符
多表查询
结联件条和结联类型
结联查询应用SQL/92法语
@Wentasy 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。原创博文如需转载请注明出处,谢谢 :) [CSDN博客] |
文章结束给大家分享下程序员的一些笑话语录: 据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。
硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。”
项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。”
软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”