SQL语句之-简单查询

   

SQL 语句的语法顺序是:数据库

 

  • SELECT[DISTINCT]
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • UNION
  • ORDER BY

 

1、查询SELECToracle

一、查询所有列:SELECT * FROM products性能

二、查询选中的列:SELECT prod_name,prod_id FROM products; 列之间要用逗号隔开,通常而言除非须要全部的列才用通配符检索,不然最好不要用,这样会下降检索和应用程序的性能。spa

三、去掉重复出现的值:SELECT DISTINCT vend_id FROM products; DISTINCT关键字做用于全部的列,若是后面紧跟二个列,则结果会是显示全部数据。3d

   

四、限制显示结果:code

SQLservice数据库:SELECT TOP 4 prod_name FROM products;blog

MySQL数据库:SELECT prod_name FROM products LIMIT 5排序

检索其中的几行:SELECT prod_name FROM products LIMIT 4 OFFSET 2  第一个数字是检索的行数显示四行,第二个数字从哪里开始,不包括启始的,至关于从第三行开始。it

等价于==SELECT prod_name FROM products LIMIT 2,4   注意数字是和上面相反的class

oracle数据库:SELECT prod_name FROM products LIMIT WHERE ROWNUM <=5

五、注释:#号

多行注释:/*             */

2、排序数据 ORDER BY

一、单列排序:SELECT prod_name FROM products ORDER BY prod_name; ORDER BY保证是最后一条字句,否则会报错

二、多列排序:

SELECT prod_id,prod_price, prod_name FROM products
ORDER BY prod_price, prod_name;

四、按照列位置排序:--结果与上面同样 

SELECT prod_id,prod_price, prod_name FROM products  ORDER BY 2,3;

五、指定排序方向:

DESC--降序,默认是升序,若是想多列都排序,必须对没列指定DESC

SELECT prod_id,prod_price, prod_name FROM products ORDER BY prod_price DESC,prod_name;

3、过滤数据

一、使用where字句--行数

SELECT prod_id,prod_price, prod_name FROM products
WHERE prod_price=3.49

二、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

三、高级过滤AND-且的关系

SELECT prod_id,prod_price,prod_name,vend_id FROM products
WHERE vend_id='DLL01' AND prod_price<=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

五、高级过滤求值顺序

想要的是>10的数据,为何获得小于10的呢?这是由于and的优先级高于OR,因此计算的顺序变成了

(vend_id='BRS01' AND prod_price>=10),应该修改成如下语句,括号的优先级高于其余二个

 

六、高级过滤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语句

七、高级过滤NOT——否认其后的条件

SELECT prod_id,prod_price,prod_name,vend_id FROM products
WHERE NOT vend_id ='DLL01'
ORDER BY prod_name

通常配合IN 、BETWEEN、EXISTS使用

 4、更新

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';//删除数据

 5、子查询

假如须要列出订购物品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'));

 

 

 6、联结表

表结构

 

一、内联结查询

根据表中的共同列来查询的,是指主外键关系,二个表没有主次之分。

  • 使用WHERE条件链接字句
  • 在FROM字句中使用JOIN.......ON

-- 查看订单编号,购买数量,购买商品编号(订单表),用户姓名(用户表)

【WHERE】

2个表

3个表

【JOIN .........IN】

 

 

二、外连接查询

 至少返回一个表中的全部记录,根据匹配条件有选择的返回另外一个表中的记录,有主次之分

【左外链接】

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;//和上面等价

 

 

二、联结多个表

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)

 

三、自联结

相关文章
相关标签/搜索