SQL 语句的语法顺序是:
- SELECT[DISTINCT]
- FROM
- WHERE
- GROUP BY
- HAVING
- UNION
- ORDER BY
一、查询SELECT
1、查询全部列:SELECT * FROM products
2、查询选中的列:SELECT prod_name,prod_id FROM products; 列之间要用逗号隔开,一般而言除非需要所有的列才用通配符检索,否则最好不要用,这样会降低检索和应用程序的性能。
3、去掉重复出现的值:SELECT DISTINCT vend_id FROM products; DISTINCT关键字作用于所有的列,如果后面紧跟二个列,则结果会是显示所有数据。
4、限制显示结果:
SQLservice数据库:SELECT TOP 4 prod_name FROM products;
MySQL数据库:SELECT prod_name FROM products LIMIT 5
检索其中的几行:SELECT prod_name FROM products LIMIT 4 OFFSET 2 第一个数字是检索的行数显示四行,第二个数字从哪里开始,不包括启始的,相当于从第三行开始。
等价于==SELECT prod_name FROM products LIMIT 2,4 注意数字是和上面相反的
oracle数据库:SELECT prod_name FROM products LIMIT WHERE ROWNUM <=5
5、注释:#号
多行注释:/* */
二、排序数据 ORDER BY
1、单列排序:SELECT prod_name FROM products ORDER BY prod_name; ORDER BY保证是最后一条字句,不然会报错
2、多列排序:
SELECT prod_id,prod_price, prod_name FROM products
ORDER BY prod_price, prod_name;
4、按照列位置排序:--结果与上面一样
SELECT prod_id,prod_price, prod_name FROM products ORDER BY 2,3;
5、指定排序方向:
DESC--降序,默认是升序,如果想多列都排序,必须对没列指定DESC
SELECT prod_id,prod_price, prod_name FROM products ORDER BY prod_price DESC,prod_name;
三、过滤数据
1、使用where字句--行数
SELECT prod_id,prod_price, prod_name FROM products
WHERE prod_price=3.49
2、where字句操作符:大于>、小于<、不等于<> !=、>=、<=、
(1)检查单个值
SELECT prod_id,prod_price, prod_name FROM products WHERE prod_price >10;
(2)不匹配检查
SELECT prod_id,prod_price, prod_name FROM products WHERE prod_id !='DLL01';
(3)范围值检查
SELECT prod_id,prod_price, prod_name FROM products WHERE prod_price BETWEEN 5.99 AND 10 包括开始和结束的值
(4)空值检查
SELECT cust_name,cust_email FROM customers WHERE cust_email IS NULL
3、高级过滤AND-且的关系
SELECT prod_id,prod_price,prod_name,vend_id FROM products
WHERE vend_id='DLL01' AND prod_price<=4
4、高级过滤OR-或的关系
SELECT prod_id,prod_price,prod_name,vend_id FROM products
WHERE vend_id='DLL01' OR prod_price>4
ORDER BY prod_price DESC
5、高级过滤求值顺序
想要的是>10的数据,为什么得到小于10的呢?这是因为and的优先级高于OR,所以计算的顺序变成了
(vend_id='BRS01' AND prod_price>=10),应该修改为以下语句,括号的优先级高于其他二个
6、高级过滤IN--符合选择条件的
SELECT prod_id,prod_price,prod_name,vend_id FROM products
WHERE vend_id IN('DLL01','BRS01')
ORDER BY prod_price DESC
其实和OR是相同的功能,为什么用IN 呢?
- 语法更加清楚
- 求值顺序比OR AND容易管理
- 比OR执行速度更快,性能好
- 最大优点,可以包含其他的SELECT语句
7、高级过滤NOT——否定其后的条件
SELECT prod_id,prod_price,prod_name,vend_id FROM products
WHERE NOT vend_id ='DLL01'
ORDER BY prod_name
一般配合IN 、BETWEEN、EXISTS使用
四、更新
1 UPDATE Customers SET cust_email = 'kim@thetoystore.com'
2 WHERE cust_id = '1000000005';//没有WHERE子句,DBMS将会用这个电子邮件地址更新Customers表中的所有行
3
4 UPDATE Customers SET cust_contact = 'Sam Roberts',cust_email = 'sam@toyland.com' WHERE cust_id = '1000000006';//更新多个列
5
6 DELETE FROM Customers WHERE cust_id = '1000000006';//删除数据
五、子查询
假如需要列出订购物品RGAN01的所有顾客,应该怎样检索?下面列出具体的步骤。
1.检索包含物品RGAN01的所有订单的编号。
2.检索具有前一步骤列出的订单编号的所有顾客的ID。
3.检索前一步骤返回的所有顾客ID的顾客信息。
1 -- SELECT order_num,prod_id FROM orderitems WHERE prod_id='RGAN01'
2 -- SELECT cust_id FROM orders WHERE order_num IN(20007,20008)
3 SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE
prod_id = 'RGAN01');//结合二个语句
SELECT cust_name, cust_contact
FROM Customers
WHERE cust_id IN (SELECT cust_id
FROM Order
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'));
六、联结表
表结构
1、内联结查询
根据表中的共同列来查询的,是指主外键关系,二个表没有主次之分。
- 使用WHERE条件连接字句
- 在FROM字句中使用JOIN.......ON
-- 查看订单编号,购买数量,购买商品编号(订单表),用户姓名(用户表)
【WHERE】
2个表
3个表
【JOIN .........IN】
2、外链接查询
至少返回一个表中的所有记录,根据匹配条件有选择的返回另一个表中的记录,有主次之分
【左外连接】
LEFT JOIN 以左表为主,返回主表的所有记录,如果左表的一些行在右表没有匹配,用NULL
【右外连接】
右边的为主表
下面二个语法是等价的
-- SELECT vend_name,prod_name,prod_price FROM vendors,products
WHERE vendors.vend_id = products.vend_id;
-- SELECT vend_name,prod_name,prod_price
FROM vendors JOIN products ON vendors.vend_id=products.vend_id;//和上面等价
2、联结多个表
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;
不要联结不必要的表。联结的表越多,性能下降越厉害。
使用别名
SELECT cust_name, cust_contact
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';
//Oracle不支持AS关键字。要在Oracle中使用别名,可以不用AS,简单地指定列名即可(因此,应该是Customers C,而不是Customers AS C)
3、自联结