`
TRAMP_ZZY
  • 浏览: 139956 次
社区版块
存档分类
最新评论

SQL 笔记(二)

    博客分类:
  • SQL
sql 
阅读更多
1. 联结表
	联结由DBMS根据需要建立,它存在于查询执行当中。

2. select vend_name, prod_name, prod_price from vendors, products where vendors.vend_id = products.vend_id;
	
3. 笛卡尔积 由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是
	第一个表中的行数乘以第二个表中的行数。
	
4. 内部联结(等值联结)(跟 WHERE 联结是等价的)
	select vend_name, prod_name, prod_price from vendors inner join products on 
    -> vendors.vend_id = products.vend_id;

5. select prod_name, vend_name, prod_price, quantity from orderitems, products, vendors
    -> where products.vend_id = vendors.vend_id
    -> and orderitems.prod_id = products.prod_id
    -> and order_num = 20007;
	+---------------------+-----------------+------------+----------+
	| prod_name           | vend_name       | prod_price | quantity |
	+---------------------+-----------------+------------+----------+
	| 18 inch teddy bear  | Bears R Us      | 11.99      |       50 |
	| Fish bean bag toy   | Doll House Inc. | 3.49       |      100 |
	| Bird bean bag toy   | Doll House Inc. | 3.49       |      100 |
	| Rabbit bean bag toy | Doll House Inc. | 3.49       |      100 |
	| Raggedy Ann         | Doll House Inc. | 4.99       |       50 |
	+---------------------+-----------------+------------+----------+

6. 创建高级联结
	自联结(基于子查询)
	select cust_id, cust_name, cust_contact from 
    -> customers where cust_name = (select cust_name from customers where cust_contact='Jim Jones');
	+------------+-----------+--------------------+
	| cust_id    | cust_name | cust_contact       |
	+------------+-----------+--------------------+
	| 1000000003 | Fun4All   | Jim Jones          |
	| 1000000004 | Fun4All   | Denise L. Stephens |
	+------------+-----------+--------------------+

	自联结 通常作为外部语句用来代替从相同表中检索数据的使用子查询语句。
	虽然结果是一样的,但是DBMS处理联结比子查询快得多。
	select c1.cust_id, c1.cust_name, c1.cust_contact from customers as c1, customers as c2
    -> where c1.cust_name = c2.cust_name and c2.cust_contact = 'Jim Jones';
	+------------+-----------+--------------------+
	| cust_id    | cust_name | cust_contact       |
	+------------+-----------+--------------------+
	| 1000000003 | Fun4All   | Jim Jones          |
	| 1000000004 | Fun4All   | Denise L. Stephens |
	+------------+-----------+--------------------+
	
	自然联结 排除多次出现,使每个列只返回一次。
	select C.*, O.order_num, O.order_date, OI.prod_id,
    -> OI.quantity, OI.item_price from customers as C, orders as O,
    -> orderitems as OI where C.cust_id = O.cust_id and OI.order_num = 
    -> O.order_num and prod_id = 'RGAN01';
	
	外部联结 许多联结将一个表中的行与另一个表中的行相关联。但有时候需要包含没有关联行
	的那些行。
	// 检索所有客户及其订单
	select customers.cust_id, orders.order_num from customers inner join orders on customers.cust_id = orders.cust_id;
	
	// 检索出没有订单的客户
	select customers.cust_id, orders.order_num from customers left outer join orders on customers.cust_id = orders.cust_id;
	+------------+-----------+
	| cust_id    | order_num |
	+------------+-----------+
	| 1000000001 |     20005 |
	| 1000000001 |     20009 |
	| 1000000002 | NULL      |
	| 1000000003 |     20006 |
	| 1000000004 |     20007 |
	| 1000000005 |     20008 |
	+------------+-----------+
	
	使用带聚集函数的联结
	select customers.cust_id, count(orders.order_num) as num_ord from customers inner join orders on 
    -> customers.cust_id = orders.cust_id group by customers.cust_id;

7. 组合查询 SQL语句允许执行多个查询,并将结果作为单个查询结果集返回。
	有两种基本情况,需要用到组合查询
	(1)在单个查询中从不同的表类似返回结构数据
	(2)对单个表执行多个查询,按单个查询返回数据(与用OR 联结的 WHERE相同)
	select cust_name, cust_contact, cust_email from customers
    -> where cust_state in ('IL', 'IN', 'MI') union
    -> select cust_name, cust_contact, cust_email from customers
    -> where cust_name = 'Fun4All';
	+---------------+--------------------+-----------------------+
	| cust_name     | cust_contact       | cust_email            |
	+---------------+--------------------+-----------------------+
	| Village Toys  | John Smith         | sales@villagetoys.com |
	| Fun4All       | Jim Jones          | jjones@fun4all.com    |
	| The Toy Store | Kim Howard         | NULL                  |
	| Fun4All       | Denise L. Stephens | dstephens@fun4all.com |
	+---------------+--------------------+-----------------------+

	UNION 的每个查询必须包含相同的列、表达式或聚集函数。
	UNION 自动去除重复的行。
	UNION ALL 去除所有重复的行。
	
8. 数据插入
	插入的集中方式
	(1)插入完整的行
	(2)插入行的一部分
	(3)插入某些查询的结果
	
	不指定列名的插入,需要为每个字段提供一个值。顺序按在数据库表中的顺序。
	insert into customers values('100000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '1111', 
	'USA', NULL, NULL);
	
	插入时,省略的列必须满足一下某个条件:
	(1)该列定允许NULL值(无值或空值)
	(2)在表定义中给出默认值。这表示如果不给出值,将使用默认值。

	插入检索出的数据(INSERT SELECT)
	insert into customers(cust_id, cust_contact, cust_email, cust_name, cust_address, 
	cust_city, cust_state, cust_zip, cust_country)
	select cust_id, cust_contact, cust_email, cust_name, cust_address, 
	cust_city, cust_state, cust_zip, cust_country from custnew;
	
	INSERT SELECT 中的列名 为简单起见,这个列子在insert 和select 语句中使用的相同的列名。
	但是,不一定要求列名匹配。事实上,DBMS按位置匹配。
	
	
	从一个表负值到另一个表(SELECT INTO)与(INSERT INTO)最大的区别是前者导入表,后者
	导入数据。
	select * into custcopy from customers;(ORACLE 的语法)
	create table custcopy as select * from customers;(MySQL 语法)
	
9. 更新和删除数据
	update customers set cust_email = 'kim@thetoystore.com' where cust_id = '100000005';
	
	为了删除某个列的值,可以设置为NULL
	update customers set cust_email = null where cust_id = '100000005';

	删除
	delete from customers where cust_id = '100000006';
	
	默认的时间时间戳
	MySQL 	current_date();
	Oralce sysdate
	
10. 更新表
	alter table vendors add vend_phone char(20)
	alter table vendors drop column vend_phone
	
	删除表
	drop table custcopy 
	
	重命名表
	rename

11. 使用视图
	视图的作用
	(1)重用SQL语句
	(2)简化复杂的SQL操作。
	(3)使用表的组成部分而不是整个表
	(4)保护数据
	(5)更改数据格式和表示
	
	视图的规则和研制
	视图不能索引,也不能有关联的触发器或默认值
	
	创建视图
	create view 
	 create view productcustomers as select cust_name, cust_contact, prod_id from
    -> customers, orders, orderitems where customers.cust_id = orders.cust_id and 
    -> orderitems.order_num = orders.order_num;\
	
	从视图中检索
	select * from productcustomers where prod_id = 'RGAN01';
	
	删除视图
	drop view viewname
	
	视图为虚拟的表。它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种封装
	SELECT 语句的层次,可以用来监护数据处理以及重新格式化基础数据或保护基础数据。
	
12. 存储过程
	为以后的使用而保存的一条或多条SQL语句的集合。可以将其视为批文件,虽然
	他们的作用不仅限于批处理。
	create procedure
	
	执行
	execute 接受存储过程名和要传递给他的任何参数。
	
13. 事物处理
	用来维护数据库的完整性,它保证成批的SQL操作要么完全执行,要么完全不执行。
	
	事物处理用来管理 insert,update, delete 语句。
	
14. 游标
	需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。
	
15. 高级的SQL特性
	约束
	主键
	alter table vendors add constraint primary key (vend_id)
	
	外键 是表中的一个列,其值必须在另一表的主键中列出。
	create table orders_temp(
    -> order_num integer not null primary key,
    -> order_date datetime not null,
    -> cust_id char(10) not null references customers(cust_id)
    -> );
	
	alter table customers add constraint foreign key (cust_id) 
	references customers (cust_id)
	
	有的DBMS支持称为级联删除的特性。
	
	唯一约束
	不同于其他,但是可以为NULL。
	
	检查约束
	(1)检查最大值最小值
	(2)制定范围
	(3)只允许特定的值
	
	create table orderitems(
		order_num integer not null,
		order_item integer not null,
		prod_id char(10) not null,
		quantity integer not null check(quantity > 0),
		item_price money not null);
		
	索引
	索引用来排序数据以加快搜索和排序操作的速度。主键总是排序的,因此按主键检索特定行
	总是一种快速有效的操作。
	
	注意事项:
	(1)索引改善操作的性能,但降低数据插入、修改和删除的性能。
	(2)索引可能占据大量的存储空间。
	(3)索引用于数据过滤盒排序。
	(4)可以再索引中定义多个列。
	
	create index pro_name_ind on products (prod_name);
	
	触发器
	触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的INSERT、
	update、delete操作相关联。
	
	触发器与单个表相关联。
	
16. 数据库安全
	grant revoke
分享到:
评论

相关推荐

    sql笔记.md

    sql笔记.md

    oracle_sql笔记

    Oracle SQL是数据库管理员和开发人员在Oracle数据库系统中进行数据查询和管理的重要工具。这篇笔记主要涵盖了Oracle SQL的...这两份“Oracle SQL笔记”文档应包含了上述各个方面的详细解释和实例,值得仔细阅读和学习。

    20170909学习sql笔记

    标题“20170909学习sql笔记”表明这是一个关于SQL学习的资料,可能包含了一天的学习记录或者一个教程的集合。SQL,全称Structured Query Language,是用于管理和处理关系数据库的标准语言。这个标题暗示我们将探讨...

    JAVA 与 Sql学习笔记

    【JAVA与Sql学习笔记】 在Java编程中,与SQL数据库的交互是不可或缺的一部分。这篇学习笔记主要关注如何在Oracle数据库中使用PL/SQL的FORALL语句进行批量操作,以及如何利用批绑定(Bulk Binding)来提升性能。此外...

    SQL Server 笔记.docx

    SQL Server 数据库管理笔记 SQL Server 是一种关系型数据库管理系统,由 Microsoft 公司开发,广泛应用于各种行业和领域。作为一名 ITIndustry 大师,我将根据提供的文件信息,总结出相关的知识点,帮助您快速了解 ...

    最全的ORACLE-SQL笔记

    【Oracle SQL笔记详解】 Oracle SQL是用于访问和操作Oracle数据库的强大工具,涵盖了各种查询、更新和管理数据的方法。以下是对笔记中提及的一些关键知识点的详细解释: 1. **登录Oracle数据库**:通常以超级管理...

    郝斌Sql2005的笔记

    郝斌老师的笔记主要涵盖了数据库的基础概念、操作以及约束等方面的知识,旨在帮助学习者更好地理解和记忆SQL Server 2005的关键点。 首先,数据库是通过字段、记录、表和约束来存储数据的。字段是数据的基本单位,...

    OracleSQL笔记

    ### Oracle SQL 笔记知识点详解 #### 一、SQLPlus 命令及环境变量 Oracle_sid - **SQLPlus 命令位置**:在 Oracle 安装目录下的 `bin` 文件夹中,可以通过 SQLPlus 来执行 SQL 命令。 - **Oracle_sid 环境变量**:...

    pl/sql个人笔记.

    ### PL/SQL 个人笔记详解 #### 一、PL/SQL 块中可嵌入的 SQL 语句类型 PL/SQL(程序化SQL)是Oracle数据库的标准编程语言,它扩展了SQL的功能,允许在数据库环境中编写过程化的业务逻辑。在PL/SQL中,可以嵌入多种...

    hivesql笔记.sql

    hivesql笔记.sql

    PL/SQL笔记pl/sql笔记

    本篇笔记主要涵盖了PL/SQL的基础语法和常用操作,包括检索数据、操纵数据以及SQL游标的应用。 在PL/SQL块中,可以直接嵌入的数据操作语句包括SELECT、DML(INSERT、UPDATE、DELETE)以及事务控制语句(COMMIT、...

    SQL笔记下载

    除了这些基础操作,SQL笔记可能还会涉及更复杂的查询技术,比如联接(JOIN)、子查询、视图(VIEW)的创建和使用,以及事务处理(TRANSACTION)等。联接允许你从多个表中合并数据,子查询可以在主查询内部执行查询,...

    SQL2005学习笔记

    《SQL2005学习笔记》是一份深入探讨SQL Server 2005核心概念、功能及优化策略的宝贵资料。SQL Server 2005是微软推出的一款强大的关系型数据库管理系统,它在数据存储、处理和分析方面具有广泛的应用。这份笔记旨在...

    SQL server2005笔记

    SQLserver 数据库学习笔记 欢迎大家下载学习,共同进步啊

    SQL笔记!很详细的!

    根据提供的文件信息,我们可以整理出以下关于SQL Server 2005的相关知识点: ### SQL Server 2005概述 SQL Server 2005是一款由微软公司开发的关系型数据库管理系统,是SQL Server系列中的一个重要版本。它在SQL ...

    SQL学习笔记(pdf)

    这份"SQL学习笔记"涵盖了SQL的基础概念、语法以及高级特性,是学习数据库管理和数据分析的宝贵资料。 1. **SQL基础** - 数据库概念:了解什么是数据库,它的作用以及数据库管理系统(DBMS)如何工作。 - SQL简介...

    sql笔记sql笔记sql笔记sql笔记sql笔记sql笔记

    sql笔记sql笔记sql笔记sql笔记sql笔记sql笔记

    oracle sql 读书笔记

    sql fundament 读书笔记 oracle 原厂 培训 金领DBA

    SQLServer2005数据库学习笔记

    笔记是本人学习SQLServer一段时间后重新整理出来的,适合有一些入门基础的人学习。 ├─01 安装及使用 │ SQLServer2005安装及使用.txt │ ├─02 常用函数 │ function.sql │ ├─03 建表、建库 │ create.sql ...

    SQL笔记-副本.sql

    SQL笔记-副本.sql

Global site tag (gtag.js) - Google Analytics