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

     

  • 相关阅读:
    C# 和 java 基本数据类型
    ESB
    sql server和mysql到底有什么区别
    MySQL服务器线程池插件
    Index Merge 算法
    任职22年,PowerShell之父将从微软离职:曾因开发PowerShell被微软降级过
    Umi 4 发布啦 🎈
    VB/VBA,可能超乎你的想象
    消息推送的场景
    DPI
  • 原文地址:https://www.cnblogs.com/bell1991/p/6953107.html
Copyright © 2020-2023  润新知