数据查询语言(Oracle VS MySQL)

系统 1260 0

简单查询

假设有这样一张表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


SQL SELECT   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的值。


SQL SELECT   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(10101 10102)

NOT  IN

不在指定的集合中

Student_id not in(10101 10102)

范围测试

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中,值使用一个比较符构成的条件查询条件。如:


SQL select  *  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将多个条件连接起来作为查询条件。如:

SQL select  *  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指定的

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


SQL select  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表中的学生人数

SQL select   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表进行排序

SQL select  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表进行分组

SQL select  specialty,monitor_id  from  students  group   by  specialty, monitor_id;

SPECIALTY  MONITOR_ID

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

计算机

机电工程

自动化

自动化          10205

机电工程        10301

计算机          10101

 

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

SQL select  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的系部,显示系部号、平均工资。

SQL select  department_id,  avg (wage)  from  teachers  group   by  department_id  having

  avg (wage)>2000;

DEPARTMENT_ID   AVG (WAGE)

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

          102       2240

          103       2220

 

 

 

数据查询语言(Oracle VS MySQL)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论