基本查询语句与方法 多表查询 # 37

day37基本查询语句和方法
1.基本查询语句与方法

 1 """"""
 2 """
 3 提前创表准备:
 4 create table emp(
 5   id int not null unique auto_increment,
 6   name varchar(20) not null,
 7   sex enum('male','female') not null default 'male', #大部分是男的
 8   age int(3) unsigned not null default 28,
 9   hire_date date not null,
10   post varchar(50),
11   post_comment varchar(100),
12   salary double(15,2),
13   office int, #一个部门一个屋子
14   depart_id int
15 );
16 
17 #插入记录
18 #三个部门:教学,销售,运营
19 insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
20 ('jason','male',18,'20170301','张江第一帅形象代言',7300.33,401,1), #以下是教学部
21 ('egon','male',78,'20150302','teacher',1000000.31,401,1),
22 ('kevin','male',81,'20130305','teacher',8300,401,1),
23 ('tank','male',73,'20140701','teacher',3500,401,1),
24 ('owen','male',28,'20121101','teacher',2100,401,1),
25 ('jerry','female',18,'20110211','teacher',9000,401,1),
26 ('nick','male',18,'19000301','teacher',30000,401,1),
27 ('sean','male',48,'20101111','teacher',10000,401,1),
28 
29 ('歪歪','female',48,'20150311','sale',3000.13,402,2),#以下是销售部门
30 ('丫丫','female',38,'20101101','sale',2000.35,402,2),
31 ('丁丁','female',18,'20110312','sale',1000.37,402,2),
32 ('星星','female',18,'20160513','sale',3000.29,402,2),
33 ('格格','female',28,'20170127','sale',4000.33,402,2),
34 
35 ('张野','male',28,'20160311','operation',10000.13,403,3), #以下是运营部门
36 ('程咬金','male',18,'19970312','operation',20000,403,3),
37 ('程咬银','female',18,'20130311','operation',19000,403,3),
38 ('程咬铜','male',18,'20150411','operation',18000,403,3),
39 ('程咬铁','female',18,'20140512','operation',17000,403,3)
40 ;
41 """
42 """
43 ps: 如果在windows系统中, 插入中文字符,select的结果为空白,可以将所有字符编码统一设置为gbk
44 """
0.前期创表准备.py
 1 """"""
 2 """基本查询语句与方法"""
 3 """
 4 1.from    从...中查询
 5     SQl语句: select * from emp;
 6     select id from emp where id>3 and id<6;
 7 
 8     例:
 9     mysql> select id from emp where id>3 and id<6;
10     +----+
11     | id |
12     +----+
13     |  4 |
14     |  5 |
15     +----+
16     2 rows in set (0.00 sec)
17 
18 ***执行顺序
19     from  从表中获得数据
20     where   根据约束条件匹配
21     select  返回匹配结果
22 
23 ***\G
24     select * from emp\G;    
25     当表字段特别多的时候  结果排版可能会出现混乱现象,"\G"来规范查询结果
26 """
1.from.py
 1 """"""
 2 """基本查询语句与方法"""
 3 """
 4 2.where   当什什么时候
 5 # 1.查询id大于等于3小于等于6的数据
 6 SQL语句:select * from emp where id >= 3 and id <= 6;
 7 # 2.查询薪资是20000或者18000或者17000的数据
 8 SQL语句: 
 9     select * from  emp where salary = 20000 or salary = 18000 or salary = 17000;
10     select * from  emp where salary in (20000,18000,17000)\G;
11 # 3.查询员工姓名中包含o字母的员工姓名和薪资
12 SQL语句:
13     分析包o字母 like '%o%'
14     模糊匹配 like %:匹配所有任意字符
15                   _:匹配一个任意字符
16     select name,salary from emp where name like '%o%';
17     例:
18     mysql> select name,salary from emp where name like '%o%';
19     +-------+------------+
20     | name  | salary     |
21     +-------+------------+
22     | jason |    7300.33 |
23     | egon  | 1000000.31 |
24     | owen  |    2100.00 |
25     +-------+------------+
26     3 rows in set (0.00 sec)
27 # 4.查询员工姓名是由四个字符组成的员工姓名与其薪资
28 SQL语句:
29     select name,salary from emp where char_length(name)=4;
30 
31     length:   是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符;
32 
33     char_length:不管汉字还是数字或者是字母都算是一个字符;
34 
35     例:
36     mysql> select name,salary from emp where char_length(name)=4;
37     +------+------------+
38     | name | salary     |
39     +------+------------+
40     | egon | 1000000.31 |
41     | tank |    3500.00 |
42     | owen |    2100.00 |
43     | nick |   30000.00 |
44     | sean |   10000.00 |
45     +------+------------+
46     5 rows in set (0.00 sec)
47 # 5.查询id小于3或者大于6的数据
48 SQL语句:
49     select * from emp where id not between 3 and 6;
50 # 6.查询薪资不在20000,18000,17000范围的数据
51 SQL语句:
52     select * from emp where salary not in(20000,18000,17000);
53 # 7.查询岗位描述为空的员工名与岗位名  针对null不能用等号,只能用is
54 SQL语句:
55     select name,post from emp where post_comment=NULL; # 空
56     select name,post from emp where post_comment is NULL;
57     select name,post from emp where post_comment is not NULL;
58     Empty set (0.00 sec) # 空
59 
60     ps:"= 这里必须用 is "
61        mysql 对字母大小不敏感
62 """
2.where.py
  1 """"""
  2 """基本查询语句与方法"""
  3 """
  4 3.group by    分组
  5 # 数据分组应用场景 :每个部门的平均薪资,男女比例等
  6 
  7 #1.按部门分组:
  8 # 分组后取出每个组的第一条数据
  9 select * from emp group by post;
 10 # 验证:
 11 select id,name,sex from emp group  by post;
 12 
 13 例:
 14 mysql> select post from emp group by post;
 15 +-----------------------------+
 16 | post                        |
 17 +-----------------------------+
 18 | operation                   |
 19 | sale                        |
 20 | teacher                     |
 21 | 张江第一帅形象代言          |
 22 +-----------------------------+
 23 4 rows in set (0.00 sec)
 24 
 25 mysql> select id,name,sex from emp group  by post;
 26 +----+--------+--------+
 27 | id | name   | sex    |
 28 +----+--------+--------+
 29 | 14 | 张野   | male   |
 30 |  9 | 歪歪   | female |
 31 |  2 | egon   | male   |
 32 |  1 | jason  | male   |
 33 +----+--------+--------+
 34 4 rows in set (0.00 sec)
 35 # 
 36 #2.
 37 '''
 38 sql_mode sql模式   only_full_group_by 只有完整组
 39 设置sql_mode为only_full_group_by,意味着以后但凡分组,只能取到分组的依据
 40 不应该再去取组里的单个元素的值, 那样的话,分组就没有意义了,因为不分组就是对单个元素信息的随意获取
 41 '''
 42 # 设置SQL模式
 43 set global
 44 sql_mode="strict_trans_tables,only_full_group_by";
 45 ps:设置成功后,退出重新登陆
 46 # 报错
 47 select * from emp group by post;
 48 select id,name,sex from emp group by post;
 49 # 正确:获取部门信息 
 50 select post from emp group by post;
 51 ps: 只要分组了,就不能再"直接"找到单个字信息了,只能获取组名
 52 
 53 # 3.获取每个部门的最高工资
 54 # 以组为单位统计组内数据>>>>>>聚合查询(聚到一起合成为一个结果)
 55 # 每个部门最高工资
 56 select post,max(salary)from emp group by post;
 57 
 58 mysql> select post,max(salary) from emp group by post;
 59 +-----------------------------+-------------+
 60 | post                        | max(salary) |
 61 +-----------------------------+-------------+
 62 | operation                   |    20000.00 |
 63 | sale                        |     4000.33 |
 64 | teacher                     |  1000000.31 |
 65 | 张江第一帅形象代言          |     7300.33 |
 66 +-----------------------------+-------------+
 67 4 rows in set (0.00 sec)
 68 
 69 # 每个部门的最低工资
 70 select post,min(salary) from emp group by post;
 71 
 72 # 每个部门的平均工资
 73 select post,avg(salary) from emp group by post;
 74 
 75 # 每个部门的工资总和
 76 select post,sum(salary) from emp group by post;
 77 
 78 # 每个部门的人数
 79 select post,count(salary) from emp group by post;
 80 '''
 81 ps:
 82     在统计分组内个数的时候 填写任意非空字段都可以完成计数,推介使用能够标识唯一标识数据的字段,例:id
 83 
 84     聚合函数会自动将每个分组内的单个数据做想要的计算,无需你考虑
 85 '''
 86 # 4.查询分组之后的部门名称和每个部门下所有的学生姓名 
 87 知识点补充:
 88     group_concat "连在一起的名字,组合"(分组之后用) 不仅可以用来显示除分组外字段还有拼接字符串的作用
 89     ps:group_concat()能够拿到分组后每一个数据指定字段(可以是多个)对应的值
 90 SQL语句:    
 91     select post,group_concat(name) from emp group by post;
 92     例:
 93     mysql> select post,group_concat(name) from emp group by post;
 94     +-----------------------------+------------------------------------------------+
 95     | post                        | group_concat(name)                             |
 96     +-----------------------------+------------------------------------------------+
 97     | operation                   | 程咬铁,程咬铜,程咬银,程咬金,张野               |
 98     | sale                        | 格格,星星,丁丁,丫丫,歪歪                       |
 99     | teacher                     | sean,nick,jerry,owen,tank,kevin,egon           |
100     | 张江第一帅形象代言          | jason                                          |
101     +-----------------------------+------------------------------------------------+
102     4 rows in set (0.00 sec)
103     
104     select post,group_concat(name,'_SB') from emp group by post;
105     mysql> select post,group_concat(name,'_SB') from emp group by post;
106     +-----------------------------+---------------------------------------------------------------+
107     | post                        | group_concat(name,'_SB')                                      |
108     +-----------------------------+---------------------------------------------------------------+
109     | operation                   | 程咬铁_SB,程咬铜_SB,程咬银_SB,程咬金_SB,张野_SB               |
110     | sale                        | 格格_SB,星星_SB,丁丁_SB,丫丫_SB,歪歪_SB                       |
111     | teacher                     | sean_SB,nick_SB,jerry_SB,owen_SB,tank_SB,kevin_SB,egon_SB     |
112     | 张江第一帅形象代言          | jason_SB                                                      |
113     +-----------------------------+---------------------------------------------------------------+
114     4 rows in set (0.00 sec)
115 
116 
117     select post,group_concat(salary) from emp group by post;
118     
119     mysql> select post,group_concat(salary) from emp group by post;
120     +-----------------------------+--------------------------------------------------------------+
121     | post                        | group_concat(salary)                                         |
122     +-----------------------------+--------------------------------------------------------------+
123     | operation                   | 17000.00,18000.00,19000.00,20000.00,10000.13                 |
124     | sale                        | 4000.33,3000.29,1000.37,2000.35,3000.13                      |
125     | teacher                     | 10000.00,30000.00,9000.00,2100.00,3500.00,8300.00,1000000.31 |
126     | 张江第一帅形象代言          | 7300.33                                                      |
127     +-----------------------------+--------------------------------------------------------------+
128     4 rows in set (0.00 sec)
129 
130 # 5.补充concat(不分组时使用)拼接字符串达到更好的显示效果 as 语法使用
131     SQL语句:select name as 姓名 ,salary as 薪资 from emp;
132     select name as t1, salary as t2 from emp; 
133 例:
134 mysql> select name as t1, salary as t2 from emp;
135 +-----------+------------+
136 | t1        | t2         |
137 +-----------+------------+
138 | jason     |    7300.33 |
139 | egon      | 1000000.31 |
140 | kevin     |    8300.00 |
141 | tank      |    3500.00 |
142 | owen      |    2100.00 |
143 | jerry     |    9000.00 |
144 | nick      |   30000.00 |
145 | sean      |   10000.00 |
146 | 歪歪      |    3000.13 |
147 | 丫丫      |    2000.35 |
148 | 丁丁      |    1000.37 |
149 | 星星      |    3000.29 |
150 | 格格      |    4000.33 |
151 | 张野      |   10000.13 |
152 | 程咬金    |   20000.00 |
153 | 程咬银    |   19000.00 |
154 | 程咬铜    |   18000.00 |
155 | 程咬铁    |   17000.00 |
156 +-----------+------------+
157 18 rows in set (0.00 sec)
158 
159     SQL语句:select concat('NAME:',name)as 姓名,concat('SAL:',salary)as 薪资 from emp;
160     select concat('NAME:',name)as t3,concat('SAL:',salary)as t4 from emp;
161 例:    
162 mysql> select concat('NAME:',name) as t3,concat('SAL:',salary) as t4 from emp;
163 +----------------+----------------+
164 | t3             | t4             |
165 +----------------+----------------+
166 | NAME:jason     | SAL:7300.33    |
167 | NAME:egon      | SAL:1000000.31 |
168 | NAME:kevin     | SAL:8300.00    |
169 | NAME:tank      | SAL:3500.00    |
170 | NAME:owen      | SAL:2100.00    |
171 | NAME:jerry     | SAL:9000.00    |
172 | NAME:nick      | SAL:30000.00   |
173 | NAME:sean      | SAL:10000.00   |
174 | NAME:歪歪      | SAL:3000.13    |
175 | NAME:丫丫      | SAL:2000.35    |
176 | NAME:丁丁      | SAL:1000.37    |
177 | NAME:星星      | SAL:3000.29    |
178 | NAME:格格      | SAL:4000.33    |
179 | NAME:张野      | SAL:10000.13   |
180 | NAME:程咬金    | SAL:20000.00   |
181 | NAME:程咬银    | SAL:19000.00   |
182 | NAME:程咬铜    | SAL:18000.00   |
183 | NAME:程咬铁    | SAL:17000.00   |
184 +----------------+----------------+
185 18 rows in set (0.00 sec)
186 
187 补充as语法 既可以给字段起别名 也可以给表起别名
188 SQL语句:
189     select emp.id,emp.name from emp as t1;
190     # 报错,因为表名已经被你改成了t1
191     # 正确
192     select t1.id,t1.name from emp as t1;
193     
194     例:
195     mysql> select t1.id,t1.name from emp as t1;
196     +----+-----------+
197     | id | name      |
198     +----+-----------+
199     |  1 | jason     |
200     |  2 | egon      |
201     |  3 | kevin     |
202     |  4 | tank      |
203     |  5 | owen      |
204     |  6 | jerry     |
205     |  7 | nick      |
206     |  8 | sean      |
207     |  9 | 歪歪      |
208     | 10 | 丫丫      |
209     | 11 | 丁丁      |
210     | 12 | 星星      |
211     | 13 | 格格      |
212     | 14 | 张野      |
213     | 15 | 程咬金    |
214     | 16 | 程咬银    |
215     | 17 | 程咬铜    |
216     | 18 | 程咬铁    |
217     +----+-----------+
218     18 rows in set (0.00 sec)
219     
220 ***区别:
221     concat 就是用来帮你拼接数据
222     concat 不分组情况下使用
223     group_concat 分组之后使用
224 """
225 """
226 # 6.查询四则运算
227 SQL语句:
228     # 每个员工的月薪
229     select name,salary from emp;
230     # 年薪
231     select name,salary*12 as annual_salary from emp;
232     #简化 as 可省略
233     select name,salary*12 annual_salary from emp;
234     例:
235 mysql> select name,salary*12 as annual_salary from emp;
236 +-----------+---------------+
237 | name      | annual_salary |
238 +-----------+---------------+
239 | jason     |      87603.96 |
240 | egon      |   12000003.72 |
241 | kevin     |      99600.00 |
242 | tank      |      42000.00 |
243 | owen      |      25200.00 |
244 | jerry     |     108000.00 |
245 | nick      |     360000.00 |
246 | sean      |     120000.00 |
247 | 歪歪      |      36001.56 |
248 | 丫丫      |      24004.20 |
249 | 丁丁      |      12004.44 |
250 | 星星      |      36003.48 |
251 | 格格      |      48003.96 |
252 | 张野      |     120001.56 |
253 | 程咬金    |     240000.00 |
254 | 程咬银    |     228000.00 |
255 | 程咬铜    |     216000.00 |
256 | 程咬铁    |     204000.00 |
257 +-----------+---------------+
258 18 rows in set (0.00 sec)
259 """
260 """
261 练习题 
262 # 刚开始查询表,
263 一定要按照最基本的步骤,
264 1.先确定是哪张表,
265 2.再确定查这张表有没有限制条件,
266 3.再确定是否需要分类,
267 4.最后再确定需要什么字段对应的信息
268 
269 1. 查询岗位名以及岗位包含的所有员工名字
270     select post,group_concat(name) from emp group by post
271     
272     mysql> select post,group_concat(name) from emp group by post;
273     +-----------------------------+------------------------------------------------+
274     | post                        | group_concat(name)                             |
275     +-----------------------------+------------------------------------------------+
276     | operation                   | 程咬铁,程咬铜,程咬银,程咬金,张野               |
277     | sale                        | 格格,星星,丁丁,丫丫,歪歪                       |
278     | teacher                     | sean,nick,jerry,owen,tank,kevin,egon           |
279     | 张江第一帅形象代言          | jason                                          |
280     +-----------------------------+------------------------------------------------+
281     4 rows in set (0.00 sec)
282 
283     
284 2. 查询岗位名以及各岗位内包含的员工个数
285     select post,count(id) from emp group by post;
286 3. 查询公司内男员工和女员工的个数
287     select sex,count(id) from emp group by sex;
288     
289 mysql> select sex,count(id) from emp group by sex;
290 +--------+-----------+
291 | sex    | count(id) |
292 +--------+-----------+
293 | male   |        10 |
294 | female |         8 |
295 +--------+-----------+
296 2 rows in set (0.00 sec)
297 4. 查询岗位名以及各岗位的平均薪资
298     select post,avg(salary) from emp group by post;
299 5. 查询岗位名以及各岗位的最高薪资
300     select post,max(salary) from emp group by post;
301 6. 查询岗位名以及各岗位的最低薪资
302     select post,min(salary) from emp group by post;
303 7. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
304     select sex,avg(salary) from emp group by sex;
305 
306 """
307 """
308 ps:
309     # 关键字where group by同时出现的情况下,group by必须在where之后
310     # where先对整张表进行一次筛选,如何group by再对筛选过后的表进行分组
311     # 如何验证where是在group by之前执行而不是之后 利用聚合函数 因为聚合函数只能在分组之后才能使用
312     select id,name,age from emp where max(salary) > 3000;  # 报错!
313 
314     select max(salary) from emp;  
315     # 正常运行,不分组意味着每一个人都是一组,等运行到max(salary)的时候已经经过where,group by操作了,只不过我们都没有写这些条件
316 """
317 """
318 语法顺序:
319     select 
320     from
321     where
322     group by
323     
324 执行顺序:
325     from
326     where
327     group by
328     select
329 """
330 """
331 8、统计各部门年龄在30岁以上的员工平均工资
332     select post,avg(salary) from emp where age > 30 group by post;
333 
334 #拆分
335     # 对where过滤出来的虚拟表进行一个分组
336         select *from emp where age > 30;
337     # 还不明白可以分步执行查看结构
338         select * from emp where age > 30 group by post
339     # 基于上面的虚拟表进行分组
340 
341 """
3.group by.py
 1 """"""
 2 """基本查询语句与方法"""
 3 
 4 """
 5 4.having 
 6     select 查询字段1,查询字段2,...from 表名 where 过滤条件 group by 分组依据 having 过滤条件;
 7     
 8     执行顺序:
 9     from
10     where
11     group by
12     having
13     select
14     
15     ps:having的语法格式与where一致,只不过having是在分组之后进行的过滤,即where虽然不能用聚合函数,但是having可以!
16     
17     
18     练习:
19     1、统计各部门年龄在30岁以上的员工平均工资,并且保留平均工资大于10000的部门
20 select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
21 
22 mysql> select post,avg(salary) from emp where age > 30 group by post having avg(salary) > 10000;
23 +---------+---------------+
24 | post    | avg(salary)   |
25 +---------+---------------+
26 | teacher | 255450.077500 |
27 +---------+---------------+
28 # 如果不信你可以将having取掉,查看结果,对比即可验证having用法!
29 
30 #强调:having必须在group by后面使用
31 select * from emp having avg(salary) > 10000;  # 报错
32      ...
33 """
4.having.py
 1 """"""
 2 """基本查询语句与方法"""
 3 
 4 """
 5 5.distinct 去重
 6 作用: 对有重复展示的数据进行去重操作
 7     重必须数据是一模一样的才能去重
 8 只要有一个不一样 都不能算是的重复的数据
 9 SQL语句:
10     select distinct id,age form emp;
11 执行顺序
12     from 
13     where
14     group by
15     having
16     select
17     distinct
18 
19     ...
20 """
5.distinct 去重.py
 1 """"""
 2 """基本查询语句与方法"""
 3 
 4 """
 5 6.order by 排序
 6     asc 升序
 7     desc 降序
 8     
 9     # #默认升序排
10     select * from emp order by salary asc;
11     #降序排
12     select * from emp order by salary desc; 
13     
14     例:
15     #先按照age降序排,在年轻相同的情况下再按照薪资升序排
16     select * from emp order by age desc,salary asc;
17     
18     # 统计各部门年龄在10岁以上的员工平均工资,并且保留平均工资大于1000的部门,然后对平均工资进行排序
19 select post,avg(salary) from 
20     emp where age > 10 
21     group by post 
22     having avg(salary) > 1000 
23     order by avg(salary);
24 
25 执行顺序:
26     from
27     where
28     group by 
29     having
30     order by
31     select
32     ...
33 """
6.order by.py
 1 """"""
 2 """基本查询语句与方法"""
 3 
 4 """
 5 7.limit 翻页
 6 # 限制展示条数
 7 select * from emp limit 3;
 8 # 查询工资最高的人的详细信息
 9 select * from emp order by salary desc limit 1;
10 
11 mysql> select * from emp order by salary desc limit 1;
12 +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
13 | id | name | sex  | age | hire_date  | post    | post_comment | salary     | office | depart_id |
14 +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
15 |  2 | egon | male |  78 | 2015-03-02 | teacher | NULL         | 1000000.31 |    401 |         1 |
16 +----+------+------+-----+------------+---------+--------------+------------+--------+-----------+
17 
18 # 分页显示
19 # 第一个参数表示起始位置,第二个参数表示的是条数,不是索引位置
20 select * from emp limit 0,5;  
21 select * from emp limit 5,5;
22 select * from emp limit 10,5;
23 ...
24 """
25 """
26 """
27 """
28 ps:
29     1.当limit只有一个参数的时候  
30     表示的是只展示几条
31     2.当limit有两个参数的时候   
32     第一个参数表示的起始位置 
33     第二个参数表示从起始位置开始往后展示的条数
34 """
7.limit 翻页.py
1 """"""
2 """
3 8.正则
4 select * from emp where name regexp '^j.*(nly)$';
5 
6 例:
7 mysql> select * from emp where name regexp '^j.*(nly)$';
8 Empty set (0.00 sec)
9 """
8.正则.py

2.多表查询的方法 连表查询 子查询

 1 """"""
 2 """
 3 '''创建表'''
 4 #建表
 5 create table dep(
 6     id int,
 7     name varchar(20) 
 8     );
 9 
10 create table emp(
11     id int primary key auto_increment,
12     name varchar(20),
13     sex enum('male','female') not null default 'male',
14     age int,
15     dep_id int
16     );
17 
18 #插入数据
19 insert into dep values
20     (200,'技术'),
21     (201,'人力资源'),
22     (202,'销售'),
23     (203,'运营');
24 
25 insert into emp(name,sex,age,dep_id) values
26 ('jason','male',18,200),
27 ('egon','female',48,201),
28 ('kevin','male',38,201),
29 ('nick','female',28,202),
30 ('owen','male',18,200),
31 ('jerry','female',18,204)
32 ;
33 
34 # 当初为什么我们要分表,就是为了方便管理,在硬盘上确实是多张表,但是到了内存中我们应该把他们再拼成一张表进行查询才合理
35 
36 """
37 """
38 表查询:
39 1.select * from emp,dep;  # 左表一条记录与右表所有记录都对应一遍>>>笛卡尔积
40 
41 # 将所有的数据都对应了一遍,虽然不合理但是其中有合理的数据,现在我们需要做的就是找出合理的数据
42 
43 # 查询员工及所在部门的信息
44 select * from emp,dep where emp.dep_id = dep.id;
45 # 查询部门为技术部的员工及部门信息
46 select * from emp,dep where emp.dep_id = dep.id and dep.name = '技术';
47 """
0.开始前创表,即推导.py
 1 """"""
 2 """连表操作"""
 3 """
 4     1.inner join 内连接
 5     只取两张表有对应关系的记录
 6     select * from emp inner join dep on emp.dep_id = dep.id;
 7     select * from emp inner join dep on emp.dep_id = dep.id where dep.name = '技术';
 8     
 9 """
10 """
11     2.left join 左连接
12     在内连接的基础上保留左表没有对应关系的记录
13     select * from emp left join dep on emp.dep_id = dep.id;
14     select * from emp left join dep onemp.dep_id = dep.id where dep.name = '技术';
15 
16 """
17 """
18     3.right join 右连接
19     在内连接的基础上保留右表没有对应关系的记录
20     select * from emp right join dep on emp.dep_id = dep.id;
21     select * from emp right join dep onemp.dep_id = dep.id where dep.name = '技术';
22 """
23 """
24     4.union 全连接
25     在内连接的基础上保留左,右面表没有对应关系的记录
26     select * from emp left join dep on emp.dep_id = dep.id
27     union
28     select * from emp right join dep on emp.dep_id = dep.id;
29 """
1.连表操作查询.py
 1 """"""
 2 """子查询"""
 3 """
 4 子查询
 5     将一个表的查询结果作为另一个查询的sql语句的查询条件
 6 """
 7 """
 8 例:
 9 # 1.查询部门是技术或者人力资源的员工信息
10   select * from dep where where name = "技术" or name = "人力资源";
11    
12 思路分析:
13     1.先获取技术部和人力资源部的id号,
14     2.再去员工表里面根据前面的id筛选出符合要求的员工信息
15 select * from emp where dep_id in (select id from dep where name = "技术" or name = "人力资源");
16 """
17 """
18 例:
19 # 2.每个部门最新入职的员工 思路:先查每个部门最新入职的员工,再按部门对应上联表查询
20 select t1.id,t1.name,t1.hire_date,t1.post,t2.* from emp as t1
21 inner join
22 (select post,max(hire_date) as max_date from emp group by post) as t2
23 on t1.post = t2.post
24 where t1.hire_date = t2.max_date
25 ;
26 
27 """
2.子查询.py
1 # 可以给表起别名
2 # 可以给查询出来的虚拟表起别名
3 # 可以给字段起别名
别名

readme

 1 1.基本查询语句即方法
 2     from    从...中查询
 3     where   当什什么时候
 4     group by    分组
 5     having  与分组配合时使用 与where作用相同
 6     distinct  去重
 7     order by    排序
 8     limit   翻页
 9     ...
10 2.连表操作
11     inner join 内连接
12     left join 左连接
13     right join 右连接
14     union 全连接
15 3.子查询
16     将一个表的查询结果作为另一个查询的sql语句的查询条件
17 
18 
19 
20     s
readme

猜你喜欢

转载自www.cnblogs.com/llx--20190411/p/11391754.html