SQL语句

1.检索数据

语句:SELECT … FROM …;

ex.:
SELECT prod_name FROM Products;
检索单列

SELECT prod_name, prod_id FROM Products;
检索多列

SELECT * FROM Products;
返回所有列

SELECT DISTINCT vend_id FROM Products;
加DISTINCT关键字,只返回不同的值,当后面接多列时,作用于组合列,而不是仅仅作用于跟在其后的那一列。

SELECT TOP 5 vend_id FROM Products;
TOP关键字限制返回多少行(SQL Server & Access)

SELECT vend_id FROM Products LIMIT 5 ;
LIMIT关键字返回多少行(MySQL)
SELECT vend_id FROM Products LIMIT 5 OFFSET 6;
返回从第6行起的5行数据。
SELECT vend_id FROM Products LIMIT 6,5;简化版

#注释整行,// 注释多行, --注释之后的文本

2. 排序检索数据

语句:SELECT … FROM … ODER BY…;
当有ODER BY时,这条子句必须是最后一条

ex.:
SELECT prod_name, prod_id FROM Products ODER BY prod_price, prod_name;
先按price排序,再按name排序。

SELECT prod_name, prod_id,prod_price FROM Products ODER BY 2,3;
2和3表示被选择的列的位置,先按第二列排序,再按第三列排序。如果根据不出现在SELECT清单中的列排序时不能用这种方法。

SELECT prod_name, prod_id
FROM Products
ODER BY prod_price DESC, prod_name;
加DESC降序关键词,将按降序排列,标准默认为升序,要多列降序排序时,必须对每一列指定DESC关键字。

3. 过滤数据

语句:SELECT … FROM … WHERE…;
WHERE语句进行 行过滤
ODER BY 在WHERE语句之后
ex.:
SELECT prod_name, prod_id FROM Products WHERE prod_price=3;

SELECT prod_name, prod_id FROM Products WHERE vend_id <> ‘DLL01’;
字符串限定需加引号

SELECT prod_name, prod_id FROM Products WHERE prod_price BETWEEN 5 AND 10;

SELECT prod_name, prod_id FROM Products WHERE prod_price IS NULL;

除了等于外,还支持以下WHERE子句操作符:
<> 或 != : 不等于
< : 小于
<= :小于等于
!< :不小于
BETWEEN : 在两个指定值之间
IS NULL: 为NULL值

4.高级数据过滤

组合WHERE语句,操作符:AND, OR, IN, NOT

ex.:
SELECT prod_name, prod_id FROM Products WHERE prod_price=3 AND vend_id <> ‘DLL01’;

SELECT prod_name, prod_id
FROM Products
WHERE (prod_price=3 OR prod_price>5)
AND vend_id <> ‘DLL01’;

SELECT prod_name, prod_id
FROM Products
WHERE vend_id IN (‘DLL01’ , ‘BRS01’)
ORDER BY prod_name;
IN实现了和OR相同的功能,但IN计算更快,更清楚直观,可以包含其他SELECT语句。

SELECT prod_name, prod_id
FROM Products
WHERE NOT vend_id= ‘DLL01’;
NOT在此处的功能和<>一样,但在复杂句子中更有用。

5.用通配符进行过滤

和LIKE操作符搭配使用
通配符:%,_, [ ],
通配符搜索更耗时,尽量不要用在一开始

ex.:
SELECT prod_name, prod_id
FROM Products
WHERE prod_name LIKE ‘FISH%’;
%表示任何字符出现任意次数(有的DBMS区分大小写,有的不区分)

SELECT prod_name, prod_id
FROM Products
WHERE prod_name LIKE ‘__ inch teddy bear’;
_此处有2个, 因此搜索模式要求匹配2个通配符。

SELECT prod_name, prod_id
FROM Products
WHERE prod_name LIKE ‘[TD]%’;
搜索以T或者D开头的名字,[ ]匹配方括号中的任意一个字符,只能匹配单个字符

否定为 [ ^TD]%

6.创建计算字段

有些字段靠查询出的列中的数据计算得到,而不用检索出数据再在客户端中计算

ex.:

  1. 拼接 使用:“ +”(SQL server)," || "(DB2, Oracle), 函数“CONCAT”(MySQL),输出的数据没有列名

SELECT vend_name + ‘(’ + vend_country + ‘)’ FROM Vendors;
SELECT CONCAT(vend_name , ‘(’ , vend_country , ‘)’ ) FROM Vendors;
可以得到两列拼接起来的数据,其中前面是名字,后面是放在括号里的国家。
当有些数据库保存为列宽的文本值时,需要将空格去掉,用RTRIM()函数去掉右边的空格,LTRIM() 去掉左边的空格,TRIM() 去掉左右两边的空格 完成:
SELECT RTRIM(vend_name) + ‘(’ + RTRIM(vend_country) + ‘)’ FROM Vendors;

  1. 使用别名 AS,和上面输出相同的数据,列名变味vend_title
    SELECT RTRIM(vend_name) + ‘(’ + RTRIM(vend_country) + ‘)’ AS vend_title
    FROM Vendors;

  2. 执行算数计算
    常见运算: +,-,,/
    SELECT prod_id,
    quantity,
    item_price,
    quantity
    item_price AS expanded_price
    FROM OrderItems;

7. 使用函数处理数据

不同DBMS拥有不同的特定函数,所以有些代码可能不好移植,写时要做好注释或减少使用。

  1. 文本处理函数

LEFT( ) 返回字符串左边的字符
LENGTH( ) 返回字符串长度
LOWER( ) 将字符串转为小写
UPPER( ) 大写
LTRIM() 去掉字符串左边的空格
RIGHT( ) 去掉字符串左边的字符
SOUNDEX( ) 返回字符串的soundex值, 描述其语音的一种算法的值

SELECT vend_name , UPPER(vend_name) AS vend_name_upcase
FROM Vendors;

SELECT vend_name FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX(‘Michael Green’)

  1. 日期时间处理函数
    不同DBMS的指令相差很大,移植性差,使用时参照不同的用户手册来操作。
    SELECT order_num FROM Orders WHERE YEAR(order_date)=2012;
    YEAR()提取出年份。

  2. 数值处理函数
    ABS() 返回一个数的绝对值
    COS() 余弦
    EXP() 指数值
    PI() 圆周率
    SIN() 正弦
    SQRT() 平方根
    TAN () 正切

8.汇总数据

AVG() 某列的平均值
COUNT() 某列的行数
MAX()最大值
MIN ()最小值
SUM()和

ex.:
SELECT AVG(prod_price) AS avg_price FROM Products;

SELECT COUNT(*) AS num_cust FROM Customers;

只包含不同的值,指定DISTINCT参数
SELECT AVG( DISTINCT(prod_price)) AS avg_price FROM Products;

9.分组数据

使用GROUP BY 和 HAVING 子句进行分组
GROUP BY 必须在WHERE字后,ORDER BY 之前。
WHERE 过滤行,在分组前过滤,而HAVING 过滤分组,在分组后过滤。
如果与聚集函数一起使用列(或表达式), 必须使用GROUP BY。

ex.:
SELECT vend_id, COUNT(*) AS num_probs
FROM Products
GROUP BY vend_id;

SELECT vend_id, COUNT() AS num_probs
FROM Products
WHERE prob_price>=4
GROUP BY vend_id
HAVING COUNT(
) >=2;

10. 子查询

作为子查询的SELECT语句只能查询单个列
嵌套的成熟没有限制,但过多的嵌套会很汗调试和阅读

ex.:
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id =‘RGAN01’))

11. 联结表

联结表的好处:节省时间空间,改动小,处理数据和生成报表更简单,可伸缩性好(能够适应不断增加的工作量而不失败)
不要联结不必要的表,联结的越多,性能下降的越厉害。

等值联结, 内联结, 以下两个句子的作用一样
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Produncts.vend_id;

SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Produncts.vend_id;

联结多个表
SELECT vend_name, prod_name, prod_price,quantity
FROM Vendors, Products, OrderItems
WHERE Vendors.vend_id = Produncts.vend_id
AND OrderItems.prod_id=Produncts.prod
AND order_num=20007;

12. 高级联结

自联结self-join, 自然联结 natural join, 外联结 outer join
常和别名一起使用
https://www.cnblogs.com/zxlovenet/p/4005256.html

  1. 自联结,同一个表引用两次
    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’;

  2. 自然联结
    自然联结排除多次出现,使每列只返回一次。
    对一个表使用通配符*,对其他表的列使用明确的子集。
    SELECT C.* , O.order_num
    FROM Customers AS C, Orders AS O
    WHERE C.cust_id = O.cust_id;

  3. 外联结
    需要包含没有关联行的行时,需要使用外联结。
    例如 列出所有产品及订购数量,包括那些没有人下单的产品。
    SELECT Customers.cust_id , Orders.order_num
    FROM Customers LEFT OUTER JOIN Orders
    ON Customers.cust_id = Orders.cust_id;
    LEFT指从FROM子句左边的表选择所有行。
    调整WHERE和FROM子句中的表的顺序,左外联结就能变为右外联结。

还有FULL OUTER JOIN 包含两个表的不关联的行

  1. 带聚集函数的联结
    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;

13.组合查询

UNION 将给出的多条SELECT语句的结果 组合成一个结果集。
UNION中的每个查询必须包含相同的列,表达式或聚集函数(顺序可以不一致)
UNION会自动消除重复的行,若想返回所有匹配行,使用UNION ALL,这一点是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 = ‘Fun4A11’;

上条等价于
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN (‘IL’, ‘IN’, ‘MI’)
OR cust_name = ‘Fun4A11’;

UNION对于复杂的过滤条件,或者从多个表检索数据时,处理可能会更简单。

14. 插入数据

INSERT,使用前要确保自己有权限

  1. 插入完整的行,给出的VALUE的值的数量一定要正确。
    INSERT INTO Customers
    VALUES ( ’ 1006’, ’ 123’, …,NULL) ;
    每一列的数据都要给出,减少使用,这种高度依赖顺序的语法不安全。
    繁琐但安全的方法是给出每一列的名称:
    INSERT INTO Customers (cust_id,cust_name,…, cust_email)
    VALUES ( ’ 1006’, ’ 123’, …,NULL) ;

  2. 插入部分行
    INSERT 语句中不包含的列名将默认为NULL

  3. 插入检索出的数据
    将SELECT 和 INSERT 合并起来, 可以同时插入多行

INSERT INTO Customers (cust_id, cust_contact)
SELECT cust_id, cust_contact
FROM CustNew;

4.从一个表复制到另一个表
和INSERT SELECT 相同的功能的还有:SELECT INTO ,区别是前者是插入数据,后者是导出数据

SELECT *
INTO CustCopy
FROM Customers;

15.更新和删除数据

UPDATE 使用前确保有权限, 使用是注意WHERE条件,没有WHERE限定将对所有行进行操作!
删除所有行使用TRUNCATE TABLE比DELETE更快。

UPDATE Customers
SET cust_email=NULL
WHERE cust_id=‘106’;

DELETE FROM Customers
WHERE cust_id=‘106’;

16. 创建表和操纵表

创建表:
CREAT TABLE Products
( prod_id CHAR(10) NOT NULL,
vend_id CHAR(10) NOT NULL DEFAUL ‘1’);

NOT NULL 限制该列必须插入值。
DEFAUL 设定默认值

更新表:
ALTER TABLE Vendors
ADD vend_phone CHAR(20);

ALTER TABLE Vendors
DROP COLUMN vend_phone CHAR(20);

删除表:
DROP TABLE CustCopy;
注意,删除不可恢复,且删除前没有确认提醒。

重命名表:
各DBMS不一样

17.使用视图

创建视图:CREAT VIEW 后接标准的SELECT语句,该语句通常为复杂的联结语句,用视图可以简化。
CREAT VIEW ProductCustomers AS
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’;
之后可以像使用其他表一样使用视图:
SELECT * FROM ProductCustomers;

DROP VIEW

18. 存储过程

执行存储过程EXECUTE:

 EXECUTE AddNewProduct(
        'JTS01',
        'Stuffed Eiffel Tower',
        6.49,
        'Plush stuffed toy with the text La Tour Eiffel in red white and blue');

这里执行一个名为AddNewProduct的存储过程,将一个新产品添加到Products表中。AddNewProduct由四个参数,分别是:供应商ID(Vendors表的主键)、产品名、价格和描述。这4个参数匹配存储过程中4个预期变量(定义存储过程自身的组成部分)

创建存储过程

下面例子,是对邮件发送清单中具有邮件地址的顾客进行计数。

CREATE PRODUCT MailingListCount(
ListCount OUT INTEGER
)
IS
v_rows INTEGER;
BEGIN
SELECT COUNT(*) INTO v_rows
FROM Customers
WHERE NOT cust_email IS NULL;
ListCount := v_rows;
END;

这个存储过程有一个名为ListCount的参数。此参数从存储过程返回一个值而不是传递一个值给存储过程。关键字OUT用来指示这种行为。Oracle支持IN(传递值给存储过程)、OUT(从存储过程·返回值,如这里)、INOUT(既传递值给存储过程也从存储过程传回值)类型的参数。存储过程的代码括在BEGIN和END语句中,这里执行一条简单的SELECT语句,它检索具有邮件地址的顾客。然后用检索处的行数设置ListCount(要传递的输出参数)。

调用过程可以像下面这样:
var ReturnValue NUMBER
EXEC MailingListCount(:ReturnValue);
SELECT ReturnValue;

下面是另一个例子,这次在Orders表中插入一个新订单。此程序仅适用于SQL Server,但它说明了存储过程的某些用途和技术, SQL Server中所有局部变量名都以@起头:

CREATE PROCEDURE NewOrder @cust_id CHAR(10)
AS
– Declare variable for older number
DECLARE @order_num INTRGER
– Get current highest order number
SELECT @order_num = MAX(order_num)
– Determine next order number
SELECT @order_num = @order_num + 1
– Insert new order
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(@order_num,GETDATE(),@cust_id)
– Return order number
RETURN @order_num;

调用:
DECLARE @ReturnValue INT
EXECUTE @ReturnValue = MailingListCount;
SELECT @ReturnValue

19. 事务处理

http://www.runoob.com/mysql/mysql-transaction.html
事务处理下的子句完全执行或完全不执行

BEGIN TRANSACTION

COMMIT TRANSACTION

不同DBMS有不同的语法。

ROLLBACK 回撤
DELETE FROM Orders;
ROLLBACK;

COMMIT 提交

保留点占位符-回退到指定的这个点,之后的任何一个操作失败,可以回退到这个点。
SAVEPOINT delete1;

20.使用游标

游标为只读。使的检索出来的行根据需要滚动或浏览其中的数据

创建游标:
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL;

使用游标:
OPEN CURSOR CustCursor

关闭游标:
CLOSE CustCursor

21. 高级SQL特性

约束,主键,外键, 唯一约束,检查约束,
索引
CREATE INDEX prod_name_ind
ON Products (prod_name);

触发器
数据库安全

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值