本文作为SQL语句快速复习之用
SQL基础
- 表具有一些特性,这些特性定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何重命名等信息,描述表的这组信息的就是所谓的
模式
- SQL中,即使不一定需要,加上分号也没有坏处
- SQL不区分大小写,但是表名,列名和值可能有所不同
SELECT
samples:
-
SELECT TOP 5 prop_name FROM product;
(SQL Server)SELECT prop_name FROM product LIMIT 5;
(MySQL)SELECT prop_name FROM product limit 5 OFFSET 5;
-
-
SELECT prop_name FROM products; --这是一条注释
-
-
注释*/
SELECT * FROM products;```
-
SELECT cust_name,cust_contract FROM customers WHERE cust_id IN( SELECT cust_id FROM orders WHERE order_num IN( SELECT order_num FROM order_items WHERE prop_id=`RGAN01` ) );
-
-
SELECT prod_name,prod_price FROM products WHERE prop_price BETWEEN 5 AND 10;
-
SELECT custumers.cust_id,orders.order_num FROM customers INNER JOIN orders ON customers.cust_id=orders.cust_id;
SQL查询连接有:
INNER JOIN
内连接:只保留两表中完全匹配的结果集LEFT JOIN
左连接:返回左表中所有的行,即使右表中无匹配记录(左表中匹配到和没有匹配到的都返回)RIGHT JOIN
右连接:返回右表中所有的行,即使左表中无匹配记录FULL JOIN
全连接:返回左右表中匹配和未匹配的行
-
INSERT UPDATE DELETE
samples:
-
INSERT INTO table VALUES(...);
-
INSERT INTO table(c1,c2) VALUES(...);
-
UPDATE customers SET cust_email='wintercolor@tech.com' WHERE cust_id='1';
-
DELETE FROM customers WHERE cust_id='1';
CREATE TABLE
```DROP TABLE IF EXISTS order_items
;
CREATE TABLE order_items
(
id
int(10) NOT NULL AUTO_INCREMENT,
cust_name
varchar(50) NOT NULL,
user_info
varchar(200) DEFAULT NULL,
order_time
DATETIME DEFAULT NOW(),
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
### ALTER TABLE
`ALTER TABLE vendors ADD vend_phone VARCHAR(20);`
### DROP TABLE
`DROP TABLE cust_copy;`
### 视图
使用视图的目标:
- 重用SQL
- 简化复杂的SQL操作
- 保护数据,给予用户特殊权限
``` CREATE VIEW product_customers AS
SELECT cust_name,cust_contact,prop_id
FROM customers,orders,order_items
WHERE customers.cust_id=order.cust_id
AND order_items.order_name=order.order_name;
- 覆盖(或更新)视图,必须先删除之,然后再创建它。删除视图可以使用
drop
语句,其语法为:DROP VIEW viewname
- 视图为虚拟的表,它们包含的不是数据而是根据需要检索数据的查询
存储过程
创建:
CREATE proc | procedure procedure_name
[{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
SQL_statements
go
-
sample
创建:
--查询存储过程
IF OBJECT_ID (N'PROC_SELECT_STUDENTS_COUNT', N'P') IS NOT NULL
DROP procedure PROC_SELECT_STUDENTS_COUNT;
GO
CREATE procedure PROC_SELECT_STUDENTS_COUNT
AS
SELECT COUNT(ID) FROM Students
GO
执行:EXEC PROC_SELECT_STUDENTS_COUNT
事务处理
使用事务处理
(transaction processing)确保成批SQL操作要么完全执行,要么完全不执行
事务
transaction:指一组SQL回退
rollback:撤销指定SQL提交
commit:将未存储的SQL结果写入表中保留点
checkpoint:事务处理中设计的临时占位符,可以对其发布回退
注意:事务管理只对INSERT
,UPDATE
,DELETE
-
创建事务,提交事务
BEGIN TRANSACTION tran INSERT INTO cust_prod values(100,'陈浩','男',19) COMMIT TRANSACTION tran
-
回滚事务
```/*启动一个事务向student表中删除一个记录,然后回滚该事务*/ BEGIN TRANSACTION tran DELETE cust_prod WHERE cust_id=100 ROLLBACK TRANSACTION tran```
-
设置保存点
BEGIN TRANSACTION mytran --启动事务 SELECT * FROM cust_prod SAVE TRANSACTION s1 --设置保存点。 INSERT INTO cust_prod VALUE(200,'王洪','男',22) --插入另一个学生的记录 ROLLBACK TRANSACTION s1 --事务回滚到保存点s1 COMMIT TRANSACTION GO SELECT * FROM cust_prod --陈浩插入到表中而王洪没有插入到表中
高级特性
-
结果集
result set: SQL查询所检索出来的结果 -
游标
cursor:是一个存储在DBMS
上的数据库查询检索出的数据集 -
约束
vend_id CHAR(10) NOT NULL PRIMARY KEY-- <-主键
cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id)-- <-外键
-
索引:排序数据,加快搜索和排序操作的速度
CREATE INDEX prod_name_id ON products(prod_name)
-
触发器
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name ON { table } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } AS { sql_statement [ ; ] [ ,...n ] } <dml_trigger_option> ::= [ NATIVE_COMPILATION ] [ SCHEMABINDING ] [ EXECUTE AS Clause ]
SQL必知必会