zoukankan      html  css  js  c++  java
  • 基本SQL查询

    当在数据库的表中存入数据后,就可以查询这些已经存入的数据。下面学习基本SQL查询

    本节要点:

    • l  如何使用select语句
      •   Select语句的语法
      •   SELECT语句中的运算
      •   使用DISTINCT和UNIQUE删除重复列
      •   Oracle伪列
    • l  聚合函数、分组和排序
      •   聚合函数
      •   分组函数
      •   HAVING子句
      •   ORDER BY字句

    1          如何使用select语句

    Select关键字表示数据的检索,它是由一系列的字句组成。

    1.1          Select语句的语法

    查询语句中SELECT、FROM、WHERE等是关键字,关键字开始的每一部份都称为一个子句。

    语法:

    SELECT [DISTINCT|UNIQUE](*,columnname[AS alias],…)

    FROM tablename

    [WHERE condition]

    [GROUP BY group_by_expression]

    [HAVING group_condition]

    [ORDER BY columnname];

    SELECT语句的要点以下几点:

    • l  SELECT语句必需的子句只有SELECT和FROM
    • l  方括号表示可选部分
    • l  可以在几行或一行上输入SQL语句。大多数SQL语句的输入方式都是一个子句占据单独的一行,以便提高可读性,并且使编辑变得更容易。

    1)         选择表中的所有数据

    SELECT * FROM customers;

    2)         从表中选择一列

    在Oracle中,可以只在结果中返回特定的列。SELECT语句中选择特定列被称为“投影(projection)”。可以选择表中的一列,也可以选择多个列或者是所有的列。比如要查看数据库中所有图书的名称,我们查询BOOKS表中的TITLE字段:

    SELECT title FROM books;

    3)         从表中选择多个列

    SELECT子句中指定多个列时,应该使用逗号将列出的列分开,输出结果中的顺序,按SELECT子句中列出列的顺序。可以加入空格来提高可读性。

    SELECT title, pubdate FROM books;

    1.2          SELECT语句中的运算

    • l  使用别名

    使用“列别名”来代替在查询结果中显示的列名称。如果显示数据库中存储的所有图书的列表,那么你可能想要将列标题显示为“Title of Books”,可以在SELCECT子句中列名称的后面列出列别名。

    SELECT title AS “Title of Books”,category FROM books;

    注意:可选关键字AS,以便区分列名称和列别名。在使用别名时,须要记住:如果列名称包含空格、特殊符号、或者你不希望全部以大写字母显示它,那么必须将它包括在“”中。如果只包括一个单词,则不需要“” 。

    • l  使用算数运算

    SELECT子句中可以使用+,-,*,/这样的算术运算,Oracle中遵循以下算术运算:

      • 在算术等式中从左向右计算,首先计算任何乘法和除法。
      • 在进行乘法和除法之后才计算任何加法和减法,也是在等式中从左向右进行计算。
      • 可以使用括号覆盖计算顺序

    实例:希望获取每本书所产生的利润。Books表包含两个可以用来计算利润的字段:Cost和Retail。一本书的利润是书店为该书支付的金额(成本)与书的销售价格(零售价)之间的差值。我们为计算出的字段指定一个别名。

    SELECT title,retail-cost profit FROM books;

    1.3          使用DISTINCTUNIQUE删除重复列

    希望查看一下客户分布在那些地区:

    SELECT DISTINCT state FROM customers;

    SELECT UNIQUE state FROM customers;

    1.4          Oracle伪列

    Oracle 中伪列就像一个表列,但是它并没有存储在表中;伪列可以从表中查询,但不能插入、更新和删除它们的值;常用的伪列有ROWID和ROWNUM:

    • ROWID 是表中行的存储地址,该地址可以唯一地标识数据库中的一行,可以使用 ROWID 伪列快速地定位表中的一行
    • ROWNUM 是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数

    2          聚合函数、分组和排序

    2.1          聚合函数

    组函数也称为“聚合函数”,他们处理每一组行并返回一个结果 。如Oracle中常用的聚合函数:SUM 、AVG 、COUNT 、MIN 、MAX 。

    1)         SUM函数

    用来计算存储在一组记录的某个数字字段中的总数量

    SELECT SUM(retail-cost) 总利润FROM books  WHERE category=‘Computer’;

    2)         AVG函数

    计算指定列中的数值的平均值

    SELECT AVG(retail-cost) "Average Profit" FROM books WHERE category ='COMPUTER';

    3)         COUNT函数

    返回指定字段中包含一个值的行数。字段中包含NULL值的行不会包括在结果中。

    要想计算包含NULL值的行,使用*而不是字段名称。

    SELECT COUNT(*) FROM books;

     或者

    SELECT COUNT(shipdate) FROM orders;

    查询图书不同种类的数量:

    SELECT COUNT(DISTINCT category) FROM books;

    注意:查询未发货的订单——打印发货日期是NULL值的所有订单列表:

    SELECT COUNT(*) FROM orders WHERE shipdate IS NULL;

    容易犯错的写法 :

    SELECT COUNT(shipdate) FROM orders WHERE shipdate IS NULL;

    4)         MAX函数

    返回在指定列中存储的最大值 。

    返回一本书所产生的最大利润:

    SELECT MAX(retail-cost) "Highest Profit" FROM books;

    5)         MIN函数

    返回在指定列的最小值 。

    查找BOOKS表中存储的所有图书中的出版日期最早的图书:

    SELECT MIN(pubdate) FROM books;

    2.2          分组函数

    上面聚合函数是对于所有记录进行聚合的,有时候我们需要先对记录分组再进行聚合。对记录的分组是通过关键字GROUP BY实现的,如GROUP BY F1,F2,F3,则当且仅当两条记录在所有属性F1,F2,F3上达成一致,它们才是同一组的。

    求每一类图书的平均利润

    SELECT category,TO_CHAR(AVG(retail-cost), '999.99') profit

    FROM books

    GROUP BY category;

    使用GROUP BY子句时要注意:

    • l  如果在SELECT 子句中使用一个组函数,那么在SELECT子句中列出的任何单独的列必须在GROUP BY子句中列出。
    • l  用来在GROUP BY子句中分组数据的列不必在SELECT子句中列出,在SELECT子句中包括它们只是为了在输出中指定组。
    • l  不能在GROUP BY子句中使用列别名
    • l  从包括GROUP BY子句的SELECT语句返回的结果将以在GROUP BY子句中列出的列的升序显示结果,要想以不同的顺序显示结果,可以使用ORDER BY子句

    2.3          HAVING子句

    用来限制一个查询返回的组。HAVING子句指定了那些组将显示在结果中。换句话说HAVING子句充当了组的WHERE子句。

    显示平均利润超过15美元的图书的种类:

    SELECT category,TO_CHAR(AVG(retail-cost), '999.99') Profit

    FROM books

    GROUP BY category

    HAVING AVG(retail-cost)>15;

    2.4          ORDER BY子句

    用来按某个顺序显示查询结果

    语法:

    SELECT [DISTINCT|UNIQUE](*,column[AS alias],…)

    FROM table

    [WHERE condition]

    [GROUP BY group_by_expression]

    [HAVING group_condition]

    [ORDER BY column [asc|desc]];

    查看按Name升序排序的所有的出版社的列表:

    SELECT * FROM publisher ORDER BY name;

    注:升序使用asc ,降序使用desc,默认是asc。

    ORDER BY子句只指定一列时,我们称为“主排序”,如果主排序中的两行或更多行完全相同,那么次排序提供了另一个进行排序的字段。 查询按州降序排列的客户,有多个居住在某个特定州的客户时,将按城市的升序对客户排序:

    SELECT lastname,firstname,city,state

    FROM customers

    ORDER BY state desc,city;

  • 相关阅读:
    树链剖分 关于点权与边权的转换
    2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)
    统计学习方法(一)概念
    python学习心得(三)
    python学习心得
    Python学习:基本概念
    Python学习(一)
    SparkMLlib聚类学习之KMeans聚类
    SparkMLlib回归算法之决策树
    SparkMLlib学习之线性回归
  • 原文地址:https://www.cnblogs.com/zhouyeqin/p/7299431.html
Copyright © 2011-2022 走看看