mysql基本查询语句review-2

review-2为同样参考借鉴他人的练习题

1,创建表

mysql> CREATE TABLE dept(
    -> deptno INT(3) PRIMARY KEY,
    -> dname VARCHAR(15),
    -> loc VARCHAR(15)
    -> );
Query OK, 0 rows affected (0.07 sec)
mysql> CREATE TABLE emp(
    -> empno int(3) PRIMARY KEY,
    -> ename VARCHAR(10),
    -> job VARCHAR(10),
    -> mgr INT(4),
    -> hiredate datetime,
    -> sal DOUBLE,
    -> comm DOUBLE,
    -> deptno INT(3),
    -> FOREIGN KEY(deptno) REFERENCES dept(deptno)
    -> );
Query OK, 0 rows affected (0.04 sec)
mysql> CREATE TABLE salgrade(
    -> grade INT(3) PRIMARY KEY,
    -> losal INT(3),
    -> hisal INT(3)
    -> );
Query OK, 0 rows affected (0.03 sec)

2,插入数据

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');
insert into dept values(50,'Admin','Washing');

insert into emp values(7369,'Smith','Clerk',7902,'1980-12-17',800,0,20);
insert into emp values(7499,'Allen','Salesman',7698,'1981-2-20',1600,300,30);
insert into emp values(7844,'Turner','Salesman',7499,'1981-9-8',1500,0,30);
insert into emp values(7698,'Tom','Manager',0,'1981-9-8',6100,600,40);
insert into emp values(7876,'Adams','Clerk',7900,'1987-5-23',1100,0,20);
insert into emp values(7900,'James','Clerk',7698,'1981-12-3',2400,0,30);
insert into emp values(7902,'Ford','Analyst',7698,'1981-12-3',3000,null,20);
insert into emp values(7901,'Kik','Clerk',7900,'1981-12-3',1900,0,30);

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,5000);
insert into salgrade values(6,5001,10000);

3,练习

3.1查询雇员表中工资最高的雇员的员工号、员工姓名、工资和部门号。

方法1 降序然后输出第一个emp

mysql> SELECT empno,ename,sal,deptno FROM emp ORDER BY sal DESC LIMIT 1;
+-------+-------+------+--------+
| empno | ename | sal  | deptno |
+-------+-------+------+--------+
|  7698 | Tom   | 6100 |     40 |
+-------+-------+------+--------+
1 row in set (0.01 sec)

方法2 单表嵌套查询

mysql> SELECT empno,ename,sal,deptno FROM emp WHERE sal=(SELECT MAX(sal) FROM emp);
+-------+-------+------+--------+
| empno | ename | sal  | deptno |
+-------+-------+------+--------+
|  7698 | Tom   | 6100 |     40 |
+-------+-------+------+--------+
1 row in set (0.02 sec)

3.2薪水大于1200的雇员,按照部门编号进行分组,分组后的平均薪水必须大于1500,查询各分组的平均工资,按照工资的倒序进行排列。

mysql> SELECT deptno, AVG(sal) AS avg FROM emp WHERE sal > 1200 GROUP BY deptno HAVING AVG(sal) > 1500 ORDER BY AVG(sal) DESC;
+--------+------+
| deptno | avg  |
+--------+------+
|     40 | 6100 |
|     20 | 3000 |
|     30 | 1850 |
+--------+------+
3 rows in set (0.00 sec)

3.3查询每个雇员和其所在的部门名
简单的两表连接查询

mysql> SELECT e.ename, e.deptno, d.dname FROM emp e JOIN dept d ON d.deptno=e.deptno;
+--------+--------+------------+
| ename  | deptno | dname      |
+--------+--------+------------+
| Smith  |     20 | Research   |
| Allen  |     30 | Sales      |
| Tom    |     40 | Operations |
| Turner |     30 | Sales      |
| Adams  |     20 | Research   |
| James  |     30 | Sales      |
| Kik    |     30 | Sales      |
| Ford   |     20 | Research   |
+--------+--------+------------+
8 rows in set (0.01 sec)

3.4查询每个雇员姓名及其工资所在的等级

mysql> SELECT e.ename, s.grade FROM emp e JOIN salgrade s ON (e.sal<s.hisal AND e.sal>s.losal);
+--------+-------+
| ename  | grade |
+--------+-------+
| Smith  |     1 |
| Allen  |     3 |
| Tom    |     6 |
| Turner |     3 |
| Adams  |     1 |
| James  |     4 |
| Kik    |     3 |
+--------+-------+
7 rows in set (0.00 sec)

3.5查询雇员名第2个字母不是a的雇员的姓名、所在的部门名、工资所在的等级。

mysql> SELECT e.ename, s.grade FROM emp e JOIN salgrade s ON (e.sal<s.hisal AND e.sal>s.losal) WHERE e.ename NOT LIKE '_a%';
+--------+-------+
| ename  | grade |
+--------+-------+
| Smith  |     1 |
| Allen  |     3 |
| Tom    |     6 |
| Turner |     3 |
| Adams  |     1 |
| Kik    |     3 |
+--------+-------+
6 rows in set (0.01 sec)

3.6查询每个雇员和其经理的姓名

mysql> SELECT e1.ename,e2.ename FROM emp e1 JOIN emp e2 ON e1.mgr=e2.empno;
+--------+-------+
| ename  | ename |
+--------+-------+
| Smith  | Ford  |
| Allen  | Tom   |
| Turner | Allen |
| Adams  | James |
| James  | Tom   |
| Kik    | James |
| Ford   | Tom   |
+--------+-------+
7 rows in set (0.00 sec)

3.7查询每个雇员和其经理的姓名(包括公司老板本身(他上面没有经理))

mysql> SELECT e1.ename,e2.ename FROM emp e1 LEFT JOIN emp e2 ON e1.mgr=e2.empno;
+--------+-------+
| ename  | ename |
+--------+-------+
| Smith  | Ford  |
| Allen  | Tom   |
| Tom    | NULL  |
| Turner | Allen |
| Adams  | James |
| James  | Tom   |
| Kik    | James |
| Ford   | Tom   |
+--------+-------+
8 rows in set (0.00 sec)

3.8查询每个雇员的姓名及其所在部门的部门名(包括没有雇员的部门)

mysql> SELECT e.ename,d.dname FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| Smith  | Research   |
| Allen  | Sales      |
| Tom    | Operations |
| Turner | Sales      |
| Adams  | Research   |
| James  | Sales      |
| Kik    | Sales      |
| Ford   | Research   |
| NULL   | Admin      |
+--------+------------+
9 rows in set (0.00 sec)

3.9子查询1:查询每个部门中工资最高的人的姓名、薪水和部门编号

mysql> SELECT ename, sal, m.deptno FROM emp e JOIN (SELECT MAX(sal) maxsal, deptno FROM emp GROUP BY deptno) m ON (e.sal=m.maxsal AND e.deptno=m.deptno);
+-------+------+--------+
| ename | sal  | deptno |
+-------+------+--------+
| Tom   | 6100 |     40 |
| James | 2400 |     30 |
| Ford  | 3000 |     20 |
+-------+------+--------+
3 rows in set (0.00 sec)

3.10子查询2:查询每个部门平均工资所在的等级

mysql> SELECT deptno, avgsal, grade FROM (SELECT deptno, AVG(sal) avgsal FROM emp GROUP BY deptno) e JOIN salgrade s ON (e.avgsal BETWEEN s.losal AND
s.hisal);
+--------+--------------------+-------+
| deptno | avgsal             | grade |
+--------+--------------------+-------+
|     20 | 1633.3333333333333 |     3 |
|     30 |               1850 |     3 |
|     40 |               6100 |     6 |
+--------+--------------------+-------+
3 rows in set (0.00 sec)

3.11子查询3:查询每个部门内平均的薪水等级

mysql> SELECT deptno, AVG(grade) avggrade FROM (SELECT e.ename, e.deptno,s.grade FROM emp e JOIN salgrade s ON (e.sal BETWEEN s.losal AND s.hisal)) t
GROUP BY deptno;
+--------+----------+
| deptno | avggrade |
+--------+----------+
|     20 |   2.0000 |
|     30 |   3.2500 |
|     40 |   6.0000 |
+--------+----------+
3 rows in set (0.00 sec)

总结:
Select //要取的字段
From tableName //单个表,或多张表,有时为嵌套查询语句提供的表!
Where //简单判断
Group By //用于分组
Having //用于对组函数进行判断
Order By //排序
Limit //分页

一般来说:select(要查询的字段)->from(从哪一张或哪几张表或视图)->where(过滤条件)->group by(having)(分组及条件)->order by(按哪个或哪几个字段进行升序或降序排列 ->limit限制数)

涉及到join on子句时,会有两种情况出现,如果表之间有等值关系则直接on后面接相等值,如果为不等值关系,则on后面接判断语句或区间语句等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值