zoukankan      html  css  js  c++  java
  • SQL语句之-简单查询

       

    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、自联结

     

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/bell1991/p/6953107.html
Copyright © 2011-2022 走看看