1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
| 标量子查询 例1:谁的工资比Angel高。 ①查询Angel的工资 SELECT salary FROM employees WHERE last_name = 'Angel';
②:查询员工的信息,满足salary>①的结果 SELECT * FROM employees WHERE salary>{ SELECT salary FROM employees WHERE last_name = 'Angel' };
2:返回job_id与141号员工相同,salary比143号员工多的员工,job_id和工资。 ①:查询141号员工的job_id SELECT job_id FROM employees WHERE employee_id = 141
②:查询143号员工的salary SELECT salary FROM employees WHERE employee_id = 143
③:查询员工的姓名,job_id和工资,要求job_id=①并且salary>② SELECT last_name,job_id,salary FROM employees WHERE job_id = { SELECT job_id FROM employees WHERE employee_id = 141 } AND salary>{ SELECT salary FROM employees WHERE employee_id = 143 };
3:返回公司工资最少的员工的last_name,job_id和salary ①:查询公司的最低工资 SELECT MIN(salary) FROM employees
②:查询last_name,job_id和salary,要求salary=① SELECT last_name,job_id,salary FROM employees WHERE salary={ SELECT MIN(salary) FROM employees };
4:查询最低工资大于50号部门最低工资的部门id和其最低工资 ①:查询50号部门的最低工资 SELECT MIN(salary) FROM employees WHERE depertment_id = 50
②:查询每个部门的最低工资 SELECT MIN(salary),department_id FROM employees GROUP BY department_id
③:在②的基础上筛选,满足min(salary)>① SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>{ SELECT MIN(salary) FROM employees WHERE department_id = 50 };
列子查询(多行子查询): 例1:返回location_id是1400或1700的部门中的所有员工姓名 ①:查询locati_id是1400或1700的部门编号 SELECT DISTINCT department_id FROM depertments WHERE location_id IN (1400,1700)
②:查询员工姓名,要求部门号是①列表中的某一个 SELECT last_name FROM employees WHERE department_id <>ALL{ SELECT DISTINCT department_id FROM depertments WHERE location_id IN (1400,1700) };
2:返回其它工种中比job_id为'IT_PROG'工种任一工资低的员工的员工号、姓名、job_id以及salary ①:查询job_id为'IT_PROG'部门任一工资 SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG'
②:查询员工号、姓名、job_id以及salary,salary<①中的任意一个 SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ANY( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#或 SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<( SELECT MAX(salary) FROM employees WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
3:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工 的员工号、姓名、job_id 以及salary SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<ALL( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
#或 SELECT last_name,employee_id,job_id,salary FROM employees WHERE salary<( SELECT MIN( salary) FROM employees WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
行子查询(结果集一行多列或多行多列) 例1:查询员工编号最小并且工资最高的员工信息 SELECT * FROM employees WHERE (employee_id,salary)=( SELECT MIN(employee_id),MAX(salary) FROM employees );
①:查询最小的员工编号 SELECT MIN(employee_id) FROM employees
#②查询最高工资 SELECT MAX(salary) FROM employees
#③:查询员工信息 SELECT * FROM employees WHERE employee_id=( SELECT MIN(employee_id) FROM employees )AND salary=( SELECT MAX(salary) FROM employees );
select后面仅仅支持标量子查询 例1:查询每个部门的员工个数 SELECT d.*,(
SELECT COUNT(*) FROM employees e WHERE e.department_id = d.`department_id` ) 个数 FROM departments d; 2:查询员工号=102的部门名 SELECT ( SELECT department_name,e.department_id FROM departments d INNER JOIN employees e ON d.department_id=e.department_id WHERE e.employee_id=102 ) 部门名;
from后面将子查询结果充当一张表,要求必须起别名 例1:查询每个部门的平均工资的工资等级 ①:查询每个部门的平均工资 SELECT AVG(salary),department_id FROM employees GROUP BY department_id
②:连接①的结果集和job_grades表,筛选条件平均工资 between lowest_sal and highest_sal SELECT ag_dep.*,g.`grade_level` FROM ( SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id ) ag_dep INNER JOIN job_grades g ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
exists后面(相关子查询) 语法: exists(完整的查询语句) 结果:1或0 SELECT EXISTS(SELECT employee_id FROM employees WHERE salary=300000); 例1:查询有员工的部门名 #in SELECT department_name FROM departments d WHERE d.`department_id` IN( SELECT department_id FROM employees )
#exists SELECT department_name FROM departments d WHERE EXISTS( SELECT * FROM employees e WHERE d.`department_id`=e.`department_id` );
2:查询没有女朋友的男神信息 #in SELECT bo.* FROM boys bo WHERE bo.id NOT IN( SELECT boyfriend_id FROM beauty )
#exists SELECT bo.* FROM boys bo WHERE NOT EXISTS( SELECT boyfriend_id FROM beauty b WHERE bo.`id`=b.`boyfriend_id` );
|