zoukankan      html  css  js  c++  java
  • 数据查询语言(Oracle VS MySQL)

    简单查询

    假设有这样一张表students:

    STUDENT_ID MONITOR_ID NAME       SEX    DOB            SPECIALTY

    ---------- ---------- ---------- ------ -------------- ----------

         10101            王晓芳     女     07-5月 -88     计算机

         10205            李秋枫     男     25-11月-90     自动化

         10102      10101 刘春苹     女     12-8月 -91     计算机

         10301            高山       男     08-10月-90     机电工程

         10207      10205 王刚       男     03-4月 -87     自动化

         10112      10101 张纯玉     男     21-7月 -89     计算机

         10318      10301 张冬云     女     26-12月-89     机电工程

         10103      10101 王天仪     男     26-12月-89     计算机

         10201      10205 赵风雨     男     25-10月-90     自动化

         10105      10101 韩刘       男     03-8月 -91     计算机

         10311      10301 张杨       男     08-5月 -90     机电工程

         10213      10205 高淼       男     11-3月 -87     自动化

         10212      10205 欧阳春岚   女     12-3月 -89     自动化

         10314      10301 赵迪帆     男     22-9月 -89     机电工程

         10312      10301 白菲菲     女     07-5月 -88     机电工程

         10328      10301 曾程程     男                    机电工程

         10128      10101 白昕       男                    计算机

         10228      10205 林紫寒     女                    自动化

    查询表中所有信息

    select * from [tableName];

    eg: select * from students;

    显示指定列的信息:

    select [columnName1 <as otherName1>,columnName2 <as otherName2>, ...] from [tableName];

    columnName列名, columnName <as otherName>表示将columnName这个列名改成别名otherName,如果别名otherName有大小之分,或者 包含特殊字符或空格,则别名必须用""引上;如果不改名则可以省略 <as otherName>;

    eg:select student_id, monitor_id as 班长ID, name as 姓名 from students;

    空值处理

    空值(NULL)用来在数据库中表示未知或未确定的值。任何类型的列,只要没有使用非空(NOT NULL)或主键(PRIMARY KEY)完整性限制,都可能出现空值(NULL).

    空值没有数据类型,在数据库中表示未知或未确定的值,无论是数字类型、文本类型或日期类型,都可以用统一的空值(NULL)表示。

    1.如果表中某列没有使用非空(NOT NULL)或主键(PRIMARY KEY)完整性限制,其默认值为空值。使用insert语句插入数据时未指定该列的值,则其值为空值;指定的列,如果其值确实为空,则可以用NULL表示;使用UPDATE语句将表中某列数据改成空值,可以用NULL表示。

    2.空值参与运算时,如果在算术表达式中,其结果为宿空值,Oracle中不显示任何值,MySQL上显示NULL。如果在字符串连接表达式中,Oracle将其作为空串处理;

    MySQL中好像没有字符串连接的操作,但在搜索的结果中表示成为NULL。为了正确解决上述因为NULL参加运算时出现的问题,Oracle提供了3个函数可以进行处理。3个函数的用法如下:

    (1).NVL(expr1, expr2);

        expr1, expr2为函数参数表达式,可以是任意的Oracle内部数据类型,但expr1与expr2的数据类型必须要匹配;

    函数的功能:如果expr1为NULL,则返回expr2的值,否则如果不为NULL则返回expr1的值。

    eg.有teachers表如下:

    TEACHER_ID NAME  TITLE  HIRE_DATE          BONUS      WAGE  DEPARTMENT_ID

    ------ -------- ------ -------------- ---------- ---------- -------------

         10210 杨文化   教授   03-10月-89           1000       3100           102

         10206 崔天     助教   05-9月 -00            500       1900           102

         10209 孙晴碧   讲师   11-5月 -98            600       2500           102

         10207 张珂     讲师   16-8月 -97            700       2700           102

         10308 齐沈阳   高工   03-10月-89           1000       3100           103

         10306 车东日   助教   05-9月 -01            500       1900           103

         10309 臧海涛   工程师 29-6月 -99            600       2400           103

         10307 赵昆     讲师   18-2月 -96            800       2700           103

         10128 王晓            05-9月 -07                      1000           101

         10328 张笑            29-9月 -07                      1000           103

         10228 赵天宇          18-9月 -07                      1000           102


    SQLSELECT name AS "姓名",  NVL(bonus,0)+wage  AS  "月总收入"  FROM  teachers;

    姓名       月总收入

    -------- ----------

    杨文化         4100

    崔天           2400

    孙晴碧         3100

    张珂           3400

    齐沈阳         4100

    车东日         2400

    臧海涛         3000

    赵昆           3500

    王晓           1000

    张笑           1000

    赵天宇         1000

    (2).NVL2(expr1, expr2, expr3);

        expr1, expr2为函数参数表达式,取Oracle内部数据类型,但expr2、expr3的数据类型必须要与expr1的数据类型相匹配;

    函数的功能:如果expr1的值为空,则返回expr3的值;如果expr1的值不为空,则返回expr2的值。


    SQLSELECT name AS "姓名", NVL2(bonus,bonus+wage,wage) AS "月总收入" FROM teachers;

    姓名       月总收入

    -------- ----------

    杨文化         4100

    崔天           2400

    孙晴碧         3100

    张珂           3400

    齐沈阳         4100

    车东日         2400

    臧海涛         3000

    赵昆           3500

    王晓           1000

    张笑           1000

    赵天宇         1000

    (3).COALESCE(expr, [, expr] ...);

        其中,expr1、expr2、...为函数参数表达式,取Oracle的内部数据类型;函数功能:返回参数列表中的第一个非空值。如果表达式都是空值,则返回一个空值。

    条件查询

    select * from [tableName] where [condition];

    select [columnName1 <as otherName1>,columnName2 <as otherName2>, ...] from [tableName] where [condition];

    where子句用于指定查询条件,condition是具体的条件表达式。当condition的值值为true时检索相应的数据。

    比较条件

    功能描述

    例子

    算术比较条件

    =

    等于

    Name=’张三’

    >

    大于

    Bonus>500

    >=

    大于等于

    Bonus>=500

    <

    小于

    Bonus<1000

    <=

    小于等于

    Hire_date < ‘06-7-2001

    <>

    不等于

    Bonus>=1000

    包含测试

    IN

    在指定的集合中

    Student_id in(1010110102)

    NOT  IN

    不在指定的集合中

    Student_id not in(1010110102)

    范围测试

    BETWEEN ... AND

    在指定的范围内

    Age between 10 and 40

    NOT BETWEEN ... AND

    不在指定的范围内

    Age between 0 and 15

    匹配测试

    LIKE

    与指定模式匹配

    Name like ‘罗%

    NOT  LIKE

    不与指定模式匹配

    Name not lik ‘李%

    NULL测试

    IS NULL

    是NULL

    Name is null

    IS  NOT  NULL

    不是NULL

    Name is not null

    逻辑运算符

    AND

    逻辑与运算

    Bouns >500 and bounus < =1000

    OR

    逻辑或运算

    Bouns>500 or name like ‘王%

    NOT

    逻辑非运算

    Not bonus=500

    单一条件查询

    在condition中,值使用一个比较符构成的条件查询条件。如:


    SQLselect * from students where student_id<=10128;

    STUDENT_ID MONITOR_ID NAME       SEX    DOB            SPECIALTY

    ---------- ---------- ---------- ------ -------------- ----------

         10101            王晓芳     女     07-5月 -88     计算机

         10102      10101 刘春苹     女     12-8月 -91     计算机

         10103      10101 王天仪     男     26-12月-89     计算机

         10105      10101 韩刘       男     03-8月 -91     计算机

         10112      10101 张纯玉     男     21-7月 -89     计算机

         10128      10101 白昕       男                    计算机

    复合条件查询

    复合条件查询用逻辑运算符and、or、not将多个条件连接起来作为查询条件。如:

    SQLselect * from students where student_id<=10128 and sex='女';

    STUDENT_ID MONITOR_ID NAME       SEX    DOB            SPECIALTY

    ---------- ---------- ---------- ------ -------------- ----------

         10101            王晓芳     女     07-5月 -88     计算机

         10102      10101 刘春苹     女     12-8月 -91     计算机

    记录排序

    执行select语句时如果没有指定显示查询结果的先后顺序,此时会按照表中数据的插入的顺序显示数据行。要对查找到的数据按某种顺序进行显示,可以使用order by子句的select语句来达到此目的。格式如下:

    select * from [tableName] from [tableName] <where [condition]> order by [columnName] <ASC|DESC>;

    select [columnName1 <as otherName1>,columnName2 <as otherName2>, ...] from [tableName] <where [condition]> order by [columnName] <ASC|DESC>;

    其中condition指排序所依据的列或表达式,ASC表示按升序排序(默认),DESC表示按降序排序; <ASC|DESC>值可以缺省,缺省是默认是ASC升序方式排序。

    按单一列排序

    按单一列排序,是指order by 子句的columnName只指一个列或一个表达式。如departments表


    DEPARTMENT_ID DEPARTME ADDRESS

    ------------- -------- ------------

              101 信息工程 1号教学楼

              102 电气工程 2号教学楼

              103 机电工程 3号教学楼

              104 工商管理 4号教学楼

    select * from departments order by department_name asc;

    DEPARTMENT_ID DEPARTME ADDRESS

    ------------- -------- -----------

              102 电气工程 2号教学楼

              104 工商管理 4号教学楼

              103 机电工程 3号教学楼

              101 信息工程 1号教学楼

    按多列排序

    按多列排序是指order by子句的columnName只指一个以上列或一个表达式。 查询结果中的数据首先按columnName指定的第一个列进行排序,然后根据columnName指定的

    第三个列进行排序,以此类推。


    SQLselect student_id, monitor_id, sex, name from 

    students order by sex, monitor_id;

    STUDENT_ID MONITOR_ID SEX    NAME

    ---------- ---------- ------ ----------

         10128      10101 男     白昕

         10105      10101 男     韩刘

         10103      10101 男     王天仪

         10112      10101 男     张纯玉

         10207      10205 男     王刚

         10201      10205 男     赵风雨

         10213      10205 男     高淼

         10314      10301 男     赵迪帆

         10311      10301 男     张杨

         10328      10301 男     曾程程

         10205            男     李秋枫

         10301            男     高山

         10102      10101 女     刘春苹

         10228      10205 女     林紫寒

         10212      10205 女     欧阳春岚

         10318      10301 女     张冬云

         10312      10301 女     白菲菲

         10101            女     王晓芳

    分组查询

    列函数及其应用

    分组查询主要是用于查询整个表中的统计信息,通过使用列(aggregate)函数、group by 子句及having 子句来共同完成此类的操作。

    分株查询的格式:

    select [columnName1 <as otherName1>,columnName2 <as otherName2>, ...] from [tableName] <where [condition]> group by [columnName1, columnName2, ...]

     <having condition>;

    列函数概述

    (Aggregate)函数

    功能描述

    用于字符、数值、日期型数据的列函数

    MAX(column)

    列中的最大值

    MIN(column)

    列中的最小值

    COUNT(*)

    表中行的总数

    COUNT(column)

    列不为NULL的行数

    COUNT(distinct column)

    Column指定列中相异值的数量

    只用于数值型数据的列函数

    SUM(column)

    列中所有值的总和

    AVG(column)

    列中所有值的平均数

    STDDEV(column)

    列的标准偏差

    VARIANCE(column)

    列的方差

    eg:求students表中的学生人数

    SQLselect count(*) from students;

      COUNT(*)

    ----------

            18

    mysql> select count(*) from students;

    +----------+

    count(*) |

    +----------+

    |        7 |

    +----------+

    row in set (0.00 sec)

    group by 子句

    通过group by 子句,可以在表中达到将数据分组的目的。将表的行分为若于组,这些组中的行并不重复。然后通过列函数分别组诗每个级,这样每个组都有一个统计值。

    group by 子句中,columnName用于指定分组的列或表达式,可以指定一个或多个表达式作为分组依据。当依据单列分组时,会基于列的每个不同值生成一个数据统计结果;

    当依据多列分组时会基于多个列的不同值生成统计结果,MySQL好像不支持依据多列进行统计。

    eg;按班长ID对students表进行排序

    SQLselect monitor_id from students group by monitor_id;

    MONITOR_ID

    ----------

         10101

         10301

         10205

    mysql> select monitor_id from students group by monitor_id;

    +------------+

    | monitor_id |

    +------------+

    |       NULL |

    |      10101 |

    |      10205 |

    |      10301 |

    +------------+

    rows in set (0.20 sec)

    eg:按专业及班长ID对students表进行分组

    SQLselect specialty,monitor_id from students group by specialty, monitor_id;

    SPECIALTY  MONITOR_ID

    ---------- ----------

    计算机

    机电工程

    自动化

    自动化          10205

    机电工程        10301

    计算机          10101

    eg:求students表中男生和女生的人数分别为多少

    SQLselect sex, count(sex) from students group by sex;

    SEX    COUNT(SEX)

    ------ ----------

    男             12

    女              6

    having 子句

    group by 子句用于指定分组的依据,而having子句则指定条件,用于限制分组显示的结果。having 子句中的condition用于指定限制分组的条件。

    having子句必须与group by子句一起使用,而group by子句通常是单独使用的。

    eg:检索教师平均工资高于2000的系部,显示系部号、平均工资。

    SQLselect department_id, avg(wage) from teachers group by department_id having

     avg(wage)>2000;

    DEPARTMENT_ID  AVG(WAGE)

    ------------- ----------

              102       2240

              103       2220

  • 相关阅读:
    以太坊智能合约 Solidity 的常用数据类型介绍
    使用 Browser-solidity 在 Go-Ethereum1.7.2 上进行简单的智能合约部署
    Linux学习笔记之vim中的替换功能
    深度学习笔记之为什么是SoftMax
    机器学习笔记之Jupyter Notebook各种使用方法
    机器学习笔记之TF-IDF原理及使用
    机器学习笔记之LATEX数学公式基本语法
    机器学习笔记之Anaconda中命令形式安装XGBoost(pip install)
    机器学习笔记之XGBoost实现对鸢尾花数据集分类预测
    ELK学习笔记之Elasticsearch和Kibana数据导出实战
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3038723.html
Copyright © 2011-2022 走看看