关系型数据库:以表格型方式存储数据(行列关系:行代表某个对象,列代表对象对应的属性)语句:结构化查询语句(增删改查)
非关系型数据库:以key-value形式存储(redis,mongoDB)
---表的约束
---创建表的语法
create table 表名(
字段名 数据类型 约束,
...
字段名2 数据类型 约束
);
字段名:创建1个用户表,存储用户信息【姓名,年龄,性别...】(类似于属性)
数据类型:
数字类型常用的有:整型: int integer
浮点型:float double
日期类型常用的有: Date日期:YYYY-MM-DD
Time时间:hh:mm:ss
DateTime日期时间:YYYY-MM-DD hh:mm:ss
Timestamp时间戳:YYYYMMDD HHMMSS
字符串类型常用的有: char--定长字符串,只能存储定义的长度,不管里面内容长度多少,char长度都为定义的长度
varchar--不定长字符串 最多只能存储定义的长度,但是具体的长度根据内容而定
blob:以..进制形式存储长文本数据
text:长文本数据
--约束:是为了保证数据的完整性
--约束有:not null(非空)表示这个字段必须有值
--unique(唯一约束)可以为null,但保证有值的是唯一性
--primary key(主键约束)不能为null,并且唯一保证一条数据的唯一性
--表必须要有主键,主键可以是对象的本身属性,也可以我们自定义的属性
--foreign key(外键约束)
--check(检查约束)
--auto_increment 自动增加只用于int类型的主键
--第二种主键写法 constraint 约束名 primary key(id)
一、数据库语法
DDL:数据库定义语言 create drop alter
drop:删除数据库、删除表 'drop database 数据库' 'drop table 表'
alter:修改表 'alert table 表名 add constranint 约束名 check(约束);'
DML:数据库操作语言 insert delete update
insert:插入数据,增加操作 'insert into 表名(字段名,...)value (值,...);' !字符串使用单引号
delete:删除操作 'delete from 表名 where 条件'
在主表中删除和外键字段关联数据时,必须先把表中数据删除
truncate:删除表中所有数据,效率高与delede,不考虑where条件约束
update:更新数据 'update 表名 set 字段=值 where 条件'
DQL:数据库查询语言 select 'select*from(全局查询)'
单表查询:'select 字段,...from 表 where 条件'
多表查询:
DCL:数据库控制语句 grant revoke
TCL:数据库事务 commit rallback
1、比较语句:>、>=、<、<=、=、!=、<>、is、null…is、not…null、and、or(效率低)、not、between…and(仅作用与数字)、in(在什么什么里面,相比or效率 高)、as(给字段取别名)
in: select*from emp where sal in(3000,4000,5000);符合3000,4000,5000的字段值
as:select sal as ’工资‘,comm ‘奖金’ from emp(as可以省略)
2、like模糊查询:
_:一个字符 %:任意个字符(0-n)
select*from emp where name like '_三%';
3、limit(mysql独有的,极限限制 [ 查询结果最多为n条 ]、分页,语句末端最后执行):
select*from emp where id=1 limit 1;--只查询一次(限制查询结果的条数)
select*from limit 1;--只查询一次(限制查询结果的条数)
select*from limit 0,2;--从0开始查询两条--分页
select*from emp where gz>3000 limit 0,2;
4、order by(排序)、asc(从小到大,可以省略)、desc(降序,不能省略):
--语句最后【limit前面】
select...from...order by 分数desc,编号asc---分数相同根据编号升序排
二、数据库函数
1、分组函数:avg(平均)、sum、max 、min、count-------------------goup by:只能和分组函数一起使用
having:过滤分组后的条件
select count(*) form emp;--表中条数
select count(字段) form emp;--查询有字段的值的人员个数
--字段平均值
select avg(字段),sum(字段),min(字段),max(字段)from emp;
--注意:分组的函数不可以和非分组的字段一起查询
!!select name,sum(工资字段)from emp;!!错误语句
--group by--分组查询
--查询每个部门的平均工资
select avg(工资字段),部门字段 from emp goup by部门字段
select 字段 from 表 【where】 goup by 字段 limit...
--查询部门人数小于2的部门
select 部门,count(*) from 表 goup by 部门 having count(*)<2
--单表查询总结:
select 字段 from 表 【where 条件】【group by 字段】【having 过滤之后条件】 【order by 字段 asc/desc】【limit...】
2、字符函数:类似于java、js中的String
3、数字函数:类似java的Math类:常用:ABS(n)取绝对值、CEIL(向上取整)、FLOOR(向下取整)、PEWER(m,n)m的n次幂、ROUND(m,n)四 舍五入…
4、日期函数:重点掌握 sysdate()、now() 获取系统当前时间(年月日时分秒)
insert into emp(no,name,birthday) values(9527,'张三',sysdate());
insert into emp(no,name,birthday) values(9527,'张三',now());
5、转换函数:to_char:转换成字符串
to_date:转换成日期 (显式、隐式)
select to_date('2020-02-01','yyyy-MM-dd') from dual;--显式
select*from emp where birthday>'2020-02-01';--2020-02-01之后--隐式
select*from emp where birthday<'2020-02-01';--2020-02-01之前
to_number:转换为数字
6、其他函数
三、多表联查
1、语法一:
--查询员工信息(employee)以及员工部门信息(dept)
--以前多表查询语法:
select 表1字段,表2字段... from 表1,表2... where n张表的关联条件...(不一定等于,也有可能是大于、小于、之间);
select ename,sal,loc,dname from employee e,dept d where e.deptno = d.detno;
--部门、员工全部查询
select e.*,d.*;
--查询学生student 以及专业 major的信息 (!sid在两个表中都存在,查询时必须声明在哪个表:表.字段)
select student所有字段,major名字字段,najor.sid from 学生表 s,专业表 m where s.sid=m.sid;
--学生表:学生id name score
--学生等级表:等级id 等级最低分,等级最高分,等级名字
select 学生表.*,等级表.* form 学生表 s,等级表 s where s.score between s.等级最低分 and 等级最高分;
select employee.*,dept.*,salgrade.* from
employee e,dept d,salgrade s where
(e.deptno=d.deptno)
and
(e.sal between s.最低工资 an s.最高工资)
2、语法二(现在):inner join…on 内连接
select 所有表字段 from 表1 inner join 表2 on 1和2关联条件 join 表3 on 1和3关联条件... where [过滤条件];
select e.*,d.* from employee e inner join dept d on e.deptno=d.deptno;
--语法一:
select employee.*,dept.* ,salgrade.* from employee e,dept d ,salgrade s where (e.sal between s.最高工资 and s.最低工资 )and
e.deptno=d.deptno;
select employee.*,dept.* ,salgrade.* from employee e,dept d ,salgrade s where (e.sal between s.最高工资 and s.最低工资 )and
e.deptno=d.deptno and e.sal>3000;
--语法二:
select e.*,d.*,s.* from employee e inner join salgrade s on e.sal between s.最高工资 and s.最低工资 inner join dept d on d.deptno=e.deptno;
select e.*,d.*,s.* from employee e inner join salgrade s on e.sal between s.最高工资 and s.最低工资 inner join dept d on d.deptno=e.deptno
where e.sal>300;
3、内连接存在的问题:如果emp表的员工部门号为空,则不会查询出该员工,如果部门下没有员工,部门也不会被查询出来。
外连接:
左外连接 left outer join…on:左边表全部查询出来,不管右边表有没有约值对应数据。没有对应数据为null
右外连接 right outer join…on:右边表全部查询出来,不管左边表有没有约值对应数据。没有对应数据为null
select 所有表字段 from 表1 left outer join 表2 on 1和2关联条件 join 表3 on 1和3关联条件... where [过滤条件];
select 所有表字段 from 表1 rigth outer join 表2 on 1和2关联条件 join 表3 on 1和3关联条件... where [过滤条件];--outer可以省略
select e.*,d.*,s.* from employee e rigth join salgrade s on e.sal between s.最高工资 and s.最低工资 inner join dept d on d.deptno=e.deptno;
4、自连接:
--9 对于emp中有管理者的员工,列出姓名,管理者姓名(管理者外键为mgr)
select e.*,m.* from employee e,employee m where e.mgr=m.empno;
四、子查询:
1、嵌套子查询:子查询可以独立运行的
--查询工资比杰克高的员工信息
select * from employee where sal>(select sal from employee where enamne='jack');
--把查出来结果当作条件,或者把查询出的表作为条件(子查询可以独立运行:select sal from employee where enamne='jack')
select employee.* from employee e where sal<(select avg(cal) from emplyee);
select employee.* from employee e where deptno=(select deptno from employee where ename='jack');
2、相关子查询:子查询不能独立运行,使用了父查询的字段
--查询工资高与本部门平均工资的员工
select * from emplyee e where sal>(select avg(sal) from employee e2 group by deptno where e.deptno=e2.deptno);
相关子查询可以分解为嵌套子查询
select * from employee e,(select avg(sal) asal,deptno from employee group by deptno) a where e.deptno=a.deptno and e.sal>a.asal;
五、索引:
1、索引的作用?用于快速查找,最好是定义在量大,查询次数多的表。由数据库自动维护,select执行时会自动产生作用
2、索引的利弊:快速查找基于数量多的表(上万条)、查找次数多的表
3、索引的创建和删除:主键默认就是索引
--创建:
create index 索引名字 on 表名(字段);
select 字段 from 表;--具有索引之后查询速度会加快(前提:条数多)
--给多个字段创建索引
create index 索引名字 on 表名(字段1,字段2);
--唯一索引
create unique index;
--案例:
create index in1 on employee(ename,sal,deptno);
create index in2 on dept(loc);
--删除
drop index 索引名 on 表;
练习一:
--数据表:
--dept:
--deptno(primary key), dname, loc
--emp:
--empno(primary key), ename, job, mgr(references emp(empno)), sal,
--deptno(references dept(deptno))
--1 列出emp表中各部门的部门号,最高工资,最低工资
select max(sal) as '最高工资',min(sal) as '最低工资' deptno as '部门号' from emp group by deptno;
--2 列出emp表中各部门job为'CLERK'的员工的最低工资,最高工资
select min(sal) as '最低工资',max(sal) as '最高工资',deptno as '部门号' from emp where job = 'CLERK' group by deptno;
--3 对于emp中最低工资小于1000的部门,列出job为'CLERK'的员工的部门号,最低工资,最高工资
select max(sal) as '最高工资',min(sal) as '最低工资' deptno as '部门号' from emp where job='CLERK' and 1000>min(sal) group by deptno;
--4 根据部门号由高而低,工资由低而高列出每个员工的姓名,部门号,工资
select deptno as '部门号',ename as '姓名',sal as '工资' from emp order by deptno desc,sal asc;
--6 列出'张三'所在部门中每个员工的姓名与部门号
select ename,deptno from emp where deptno = (select deptno from emp where ename='张三' limit 1);
--7 列出每个员工的姓名,工作,部门号,部门名
select ename as '名字',job as '工作' ,deptno as '部门号',dname as '部门名字' from emp;
--8 列出emp中工作为'CLERK'的员工的姓名,工作,部门号
select ename as '名字',job as '工作' ,deptno as '部门号' from emp where job='CLERK';
--9 对于emp中有管理者的员工,列出姓名,管理者姓名(管理者外键为mgr)
select e.*,m.* from employee e,employee m where e.mgr=mm.empno;
--10 对于dept表中,列出所有部门名,部门号,同时列出各部门工作为'CLERK'的员工名与工作
--11 对于工资高于本部门平均水平的员工,列出部门号,姓名,工资,按部门号排序
select deptno,ename,sal employee e,(select avg(sal) asal,deptno from employee group by deptno) a where e.deptno=a.deptno and e.sal>a.asal order by deptno;
--12 对于emp,列出各个部门中工资高于本部门平均水平的员工数和部门号,按部门号排序
select count(*),deptno from (
select e.* from employee e
where sal>(select avg(sal) from employee e2 group by deptno where e.deptno=e2.deptno group by deptno) )a
group by a.deptno order by deptno desc;
--13 对于emp中工资高于本部门平均水平,人数多于1人的,列出部门号,人数,按部门号排序
select count(*),deptno from (
select e.* from employee e
where sal>(select avg(sal) from employee e2 group by deptno where e.deptno=e2.deptno group by deptno) )a
group by a.deptno
having count(*)>1 order by deptno desc;
--14 对于emp中低于自己工资至少5人的员工,列出其部门号,姓名,工资,以及工资少于自己的人数
--15 查询出emp 表中 sal 按升序排列后10 - 20 的员工信息
select sal from emp order by sal limit 9,10;
练习二:
---SQL语句强化练习题及答案
---一、简单查询(专业表major,学生表stu,分数表score)
---1、列出全部学生的信息。
select stu.* from stu;
---2、列出软件专业全部学生的学号及姓名。
select sid,sname from stu where stumajor='软件专业';
---4、求1号课成绩大于80分的学生的学号及成绩
select sid,score from stu,课表 where stu.sid=课表.学号 and 课表号='1';
---5、列出非软件专业学生的名单。
---6、查询成绩在70~80分之间的学生选课得分情况
---7、列出选修1号课或3号课的全体学生的学号和成绩。
---8、列出所有98级学生的学生成绩情况。
---9、列出成绩为空值(或不为空值)的学生的学号和课号。
---10、求出所有学生的总成绩。
---11、列出每个学生的平均成绩。
---12、列出各科的平均成绩、最高成绩、最低成绩和选课人数。
---二、连接查询
---(一)简单连接
1、列出选修1号课的学生姓名及成绩。
SELECT 姓名,成绩 FROM 学生,选课 WHERE 学生.学号=选课.学号 AND 课号="1"
2、列出选修1号课的学生的学号、姓名及成绩。
SELECT 学生.学号,姓名,成绩 FROM 学生 S,选课 X WHERE S.学号=X.学号 AND 课号="1"
3、求出总分大于150的学生的学号、姓名及总成绩。
SELECT 学生.学号,姓名,SUM(成绩) AS 总成绩 FROM 学生,选课
WHERE 学生.学号=选课.学号 GROUP BY 选课.学号 HAVING SUM(成绩)>150
(二)自连接查询
1、列出那些专业相同的学生相应的姓名及专业信息。
SELECT a.姓名,b.姓名,专业 FROM 学生 a,学生 b WHERE a.学号<>b.学号 AND a.专业=b.专业
2、求至少选修1号课和2号课的学生的学号。
SELECT X.学号 FROM 选课 X,选课 Y WHERE X.学号=Y.学号 AND X.课号="1" AND Y.课号="2"
3、有以下表rate.dbf
币种1代码 C(2)、币种2代码 C(2)、买入价 N(8,4)、卖出价 N(8,4)
外汇汇率.dbf
币种1 C(4)、币种2 C(4)、买入价 N(8,4)、卖出价 N(8,4)
外汇代码.dbf
外汇名称 C(10)、外汇代码 C(10)
要求:将所有“外汇汇率”表中的数据插入rate表中并且顺序不变,由于“外汇汇率”中的币种1和币种2存放的是外币名称,而rate表中的币种1代码和币种2代码应该存放外币代码,所以插入时要做相应的改动,外币名称与外向代码的对应关系存储在“外汇代码”表中。
SELECT A.外币代码 AS 币种1代码,B.外币代码 AS 币种2代码,;
买入价,卖出价 FROM 外汇代码 A,外汇汇率,外汇代码 B;
WHERE A.外币名称=外汇汇率.币种1 AND B.外币名称=外汇汇率.币种2 INTO TABLE rate
4、假定有“雇员”表(雇员号 C(2),雇员姓名 C(6),经理号 C(2)),根据雇员关系列出上一级经理及其所领导的职员清单。(教案中的例题)
SELECT "领导",S.雇员姓名,"雇员",E.雇员姓名 FROM 雇员 S,雇员 E WHERE S.雇员号=E.经理
(三)超连接
1、列出选修1号课的学生姓名及成绩。
方法一:(使用简单连接查询格式)
SELECT 姓名,成绩 FROM 学生,选课 WHERE 学生.学号=选课.学号 AND 课号="1"
方法二:(使用内部连接格式)
SELECT 姓名,成绩 FROM 学生 INNER JOIN 选课 ON 学生.学号=选课.学号 WHERE 课号="1"
方法三:内部连接的INNER短语可以省略。(与方法二等价)
SELECT 姓名,成绩 FROM 学生 JOIN 选课 ON 学生.学号=选课.学号 WHERE 课号="1"
2、查询订货管理数据库中数据的仓库号、城市、供应商名和地址信息。
方法一:使用简单连接格式。
SELECT 仓库.仓库号,城市,供应商名,地址 FROM 供应商,订购单,职工,仓库;
WHERE 供应商.供应商号=订购单.供应商号 AND订购单.职工号=职工.职工号 ;
AND 职工.仓库号=仓库.仓库号
方法二:使用超连接的内部连接格式。(注意连接条件的顺序)
SELECT 仓库.仓库号,城市,供应商名,地址 FROM 供应商 JOIN 订购单 JOIN 职工 JOIN 仓库 ;
ON 职工.仓库号=仓库.仓库号 ON 订购单.职工号=职工.职工号 ON 供应商.供应商号=订购单.供应商号
3、查询没有选修任何课程的学生姓名。
方法一:使用嵌套查询
SELECT 姓名 FROM 学生 WHERE 学号 NOT IN (SELECT 学号 FROM 选课)
方法二:使用超连接的右连接。
SELECT 姓名 FROM 选课 RIGHT JOIN 学生 ON 选课.学号=学生.学号 WHERE 选课.学号<>学生.学号
方法三:使用超连接的左连接。(注意表名顺序和方法二的不同)
SELECT 姓名 FROM 学生 LEFT JOIN 选课 ON 选课.学号=学生.学号 WHERE 选课.学号<>学生.学号
三、嵌套查询
(一)普通嵌套与谓词EXISTS
1、列出选修汇编语言课的学生的学号。
方法一:
SELECT 学号 FROM 选课 WHERE 课号=(SELECT 课号 FROM 课程 WHERE 课名="汇编语言")
方法二:使用谓词EXISTS。注意和方法一格式上的不同。
SELECT 学号 FROM 选课 WHERE EXIST (SELECT * FROM 课程 ;
WHERE 课名="汇编语言" AND 选课.课号=课程.课号)
2、求软件专业所有必修课的课程信息。
方法一:
SELECT * FROM 课程 WHERE 课号 IN; (SELECT 课号 FROM 必修课 WHERE 必修专业="软件")
方法二:
SELECT * FROM 课程 WHERE EXIST (SELECT * FROM 必修课 WHERE 必修专业="软件" ;
AND 课程.课号=必修课.课号)
(二)量词ANY、SOME、ALL
1、求选修2号课的学生中,成绩比选修1号课的最低成绩要高的学生的学号和成绩。
方法一:
SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>;
(SELECT MIN(成绩) FROM 选课 WHERE 课号="1")
方法二:ANY等价于SOME,所以可将ANY换成SOME。
SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>ANY ;
(SELECT 成绩 FROM 选课 WHERE 课号="1")
2、求选修2号课的学生中,成绩比选修1号课的任何学生的成绩都要高的那些学生的学号和成绩。
方法一:
SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>;
(SELECT MAX(成绩) FROM 选课 WHERE 课号="1")
方法二:
SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>ALL ;
(SELECT 成绩 FROM 选课 WHERE 课号="1")
(三)内外层互相关嵌套(外层依赖于内层的查询结果,内层依赖于外层来进一步查询)
1、列出每门课程中成绩最高的选课信息。
SELECT * FROM 选课 A WHERE 成绩=(SELECT MAX(成绩) FROM 选课 B WHERE A.课号=B.课号)
2、列出每个学生中成绩低于本人平均成绩的选课信息。
SELECT * FROM 选课 A WHERE 成绩<(SELECT AVG(成绩) FROM 选课 B WHERE A.学号=B.学号)
3、列出表“订购单2.dbf”(其内容就是在订购单表的基础上增加一个总金额字段)中每个职工经手的具有最高总金额的订购单信息。(教案中例题)
SELECT out.职工号,out.供应商号,out.订货单号,out.订货日期,out.总金额;
FROM 订购单 out WHERE 总金额=(SELECT MAX(总金额) FROM 订购单 inner1;
Where out.职工号=inner1.职工号)
四、操作功能
1、在课程表中插入新的元组(5,大学英语)。
INSERT INTO 课程(课号,课名) VALUES("5","大学英语")
2、给学生表中男生的记录加上删除标记。
DELETE FROM 学生 WHERE 性别="男"
3、将选课表中所有课程的成绩分别提高5分。将课号为“4”的课程的成绩置为空值。
UPDATE 选课 SET 成绩=成绩+5
UPDATE 选课 SET 成绩=NULL WHERE 课号="4"
五、定义表结构
1、建立研究生表,该表不属于任何数据库,其结构如表所示:
字段名
字段类型
字段长度
小数位数
特殊要求
学号
C
6
姓名
C
8
性别
C
2
年龄
N
3
0
入学年月
D
允许空值
CREATE TABLE 研究生 FREE (学号 C(6),姓名 C(8),性别 C(2),年龄 N(3,0),入学年月 D NULL)
2、假设已经建立了XSK数据库,在XSK中建立“学生1”表,其结构如表所示
字段名
字段类型
字段长度
小数位数
特殊要求
学号
C
6
主索引
姓名
C
8
不能为空
性别
C
2
年龄
N
3
0
年龄大于10小于45
是否党员
L
入学年月
D
默认值为1999年9月1日
OPEN DATABASE XSK
CREATE TABLE 学生1 (学号 C(6) PRIMARY KEY,姓名 C(8) NOT NULL,性别 C(2),;
年龄 N(3,0) CHECK 年龄>10 AND 年龄<45 ERROR "年龄必须大于10小于45",是否党员 L,;
入学年月 D DEFAULT {^1999-9-1})
3、在XSK数据库建立“课程1”表,其结构如表所示:
字段名
字段类型
字段长度
小数位数
特殊要求
课号
C
4
主索引
课程名
C
10
不能为空
学分
N
2
CREATE TABLE 课程1 (课号 C(4) PRIMARY KEY,课程名 C(10) NOT NULL,学分 N(2))
4、在XSK数据库建立“选课1”表,其结构如表所示:
字段名
字段类型
字段长度
小数位数
特殊要求
学号
C
6
外索引与学生表建立关系
课号
C
4
外索引与课程表建立关系
成绩
N
5
2
CREATE TABLE 选课1 (学号 C(6) REFERENCE 学生,课号 C(4) REFERENCE 课程,成绩 N(5,2))
六、修改表结构
1、为“课程1”表添加一个开课学期字段,字段类型为数值型,长度为1。
ALTER TABLE 课程1 ADD COLUMN 开课学期 N(1)
2、修改开课学期字段为字符型,合法值为1或2。
ALTER TABLE 课程1 ALTER COLUMN 开课学期 C(1) CHECK 开课学期="1" OR 开课学期="2"
3、删除“课程1”表中对开课学期字段的合法值约束,设置默认值为1。
ALTER TABLE 课程1 ALTER 开课学期 DROP CHECK
ALTER TABLE 课程1 ALTER 开课学期 SET DEFAULT "1"
4、删除“课程1”表中的开课学期字段。修改课程名字段为“课名”字段。
ALTER TABLE 课程1 DROP 开课学期 RENAME 课程名 TO 课名
5、在“学生1”表的“年龄”字段上建立候选索引。
ALTER TABLE 学生1 ADD UNIQUE 年龄 TAG 年龄
6、在“学生1”表中添加一个出生日期字段,删除年龄字段。
ALTER TABLE 学生1 ADD 出生日期 D
ALTER TABLE 学生1 DROP UNIQUE TAG 年龄 DROP 年龄
七、补充练习
利用订货管理数据库中表数据,用SQL完成查询。
1、检索在北京的供应商的名称。
SELECT 供应商名 FROM 供应商 WHERE 地址="北京"
2、检索出向供应商S3发过订购单的职工的职工号和仓库号。
方法一(嵌套查询):
SELECT 职工号,仓库号 FROM 职工 WHERE 职工号 IN;
(SELECT 职工号 FROM 订购单 WHERE 供应商号="S3")
方法二(连接查询):
SELECT 职工.职工号,仓库号 FROM 职工,订购单 ;
WHERE 职工.职工号=订购单.职工号 AND 供应商号="S3"
3、检索出和职工E1、E3都有联系的北京的供应商信息。
SELECT * FROM 供应商 WHERE 地址="北京" AND 供应商号 IN;
(SELECT 供应商号 FROM 订购单 WHERE 职工号="E1") AND 供应商号 IN;
(SELECT 供应商号 FROM 订购单 WHERE 职工号="E3")
4、检索出向S4供应商发出订购单的仓库所在的城市。
SELECT 城市 FROM 仓库,职工,订购单 WHERE 仓库.仓库号=职工.仓库号 ;
AND 职工.职工号=订购单.职工号 AND 供应商号="S4"
5、检索出由工资多于1230元的职工向北京的供应商发出的订购单号。
SELECT 订货单号 FROM 职工,订购单,供应商 WHERE 职工.职工号=订购单.职工号;
AND 订购单.供应商号=供应商.供应商号 AND 工资>1230 AND 地址="北京"
6、检索出所有仓库的平均面积。
SELECT AVG(面积) AS 面积 FROM 仓库
7、检索出每个仓库中工资多于1220元的职工个数。
SELECT 仓库号,COUNT(*) 职工个数 FROM 职工WHERE工资>1220 GROUP BY 仓库号
8、检索工资低于本仓库平均工资的职工信息。
SELECT * FROM 职工 AA WHERE 工资<(SELECT AVG(工资) FROM 职工 BB WHERE AA.仓库号=BB.仓库号)