简单查询
假设有这样一张表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 |
+ ----------+
1 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 |
+ ------------+
4 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