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 """
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 """""" 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 """
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 """
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 """
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 """
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 """
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 """
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 """
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 """
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 """""" 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 """
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