mysql查询语句的理解分析

来源:转载

有如下三张表,

需求1:返回工资为二等级的职员名字、部门所在地、和二等级的最低工资和最高工资
emp表:


dept表:


salgrade表:


分析:

问题1:要查哪些字段,这些字段怎么表示?       二等级的职员名字   部门所在地    二等级的最低工资   最高工资要查的字段:   ename           loc                      losal                    hisal 问题2:查哪些表?所在的表:      emp              dept                    salgrade           salgrade  要查的字段在三个表中都是唯一的字段,没有字段名称重复的.所以就不需要指出要查询哪张表的字段. 即此时不需要写成emp.ename,假如有两个表的字段名称一样,比如emp表和dept表都有deptno字段,那么它们的字段值也应该一样,所以写查哪一个都一样,但是要手动指出查询的是哪一个表的字段,不然sql报错"歧义",错误示例1如下 错误示例1:select deptno,ename,loc from emp,dept where emp.deptno=dept.deptno; 报错:ERROR 1052 (23000): Column 'deptno' in field list is ambiguous 正确示例:select emp.deptno,ename,loc from emp,dept where emp.deptno=dept.deptno; 问题3:关系怎么表示?题意要查询三张表,根据问题1/问题2,可得出部分sal语句select ename,loc,losal,hisal from emp,dept,salgrade where ... ... emp表和dept表用deptno联系,emp.deptno=dept.deptnoemp表和salgrade表用sal联系,emp表sal字段决定emp的所属的gradeemp.sal>=losal and emp.sal<=hisal and grade = 2  所以where后面的条件就是:where emp.deptno=dept.deptno and emp.sal>=losal and emp.sal<=hisal and grade = 2  综述:查询语句如下select ename,loc,losal,hisal from emp,dept,salgradewhere emp.deptno=dept.deptno and emp.sal>=losal and emp.sal<=hisal and grade = 2; 



需求2:返回工资处于第四级别的员工的姓名。

 工资处于第四级别的员工的姓名。                                     ename         salgrade               empemp表与salgrade的关系是sal. 条件就是emp的sal符合salgrade的第四等级即该员工的工资大于等于4级最低,小于等于4级最高.那么就查出4级最高和最低 select losal from salgrade where grade=4;select hisal from salgrade where grade=4;emp的sal应该介于上述两者间所以查询语句: select ename from emp where sal between (select losal from salgrade 
where grade=4) and  (select hisal from salgrade where grade=4)  上述语句有重复部分,那么可以换个方式:select ename from emp e,(select losal,hisal from salgrade 
where grade=4) sg where e.sal between sg.losal and sg.hisal;



附:表的创建语句

部门表
CREATE TABLE DEPT( DEPTNO INT PRIMARY KEY,  -- 部门编号    DNAME VARCHAR(14) ,  -- 部门名称    LOC VARCHAR(13) ) ; -- 部门地址
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');
员工表
CREATE TABLE EMP( EMPNO INT  PRIMARY KEY,  -- 员工编号    ENAME VARCHAR(10),  -- 员工名称    JOB VARCHAR(9), -- 工作    MGR DOUBLE, -- 直属领导编号    HIREDATE DATE,  -- 入职时间    SAL DOUBLE, -- 工资    COMM DOUBLE, -- 奖金    DEPTNO INT, -- 部门号    FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO));
SELECT * FROM emp;
INSERT INTO EMP VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);INSERT INTO EMP VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);INSERT INTO EMP VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);INSERT INTO EMP VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);INSERT INTO EMP VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);INSERT INTO EMP VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);INSERT INTO EMP VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);INSERT INTO EMP VALUES(7788,'SCOTT','ANALYST',7566,'1987-07-13',3000,NULL,20);INSERT INTO EMP VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);INSERT INTO EMP VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);INSERT INTO EMP VALUES(7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20);INSERT INTO EMP VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);INSERT INTO EMP VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);INSERT INTO EMP VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);  

工资等级表
CREATE TABLE SALGRADE(    GRADE INT,  -- 工资等级    LOSAL DOUBLE, -- 最低工资    HISAL DOUBLE ); -- 最高工资INSERT INTO SALGRADE VALUES (1,700,1200);INSERT INTO SALGRADE VALUES (2,1201,1400);INSERT INTO SALGRADE VALUES (3,1401,2000);INSERT INTO SALGRADE VALUES (4,2001,3000);INSERT INTO SALGRADE VALUES (5,3001,9999);


分享给朋友:
您可能感兴趣的文章:
随机阅读: