• 基本查询语句与方法 多表查询 # 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 empG;    
    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
  • 相关阅读:
    计时器chronometer补充
    SpannableString富文本
    java数据结构整理(二)
    Java数据结构整理(一)
    graphical Layout调大一点
    eclipse快捷键
    弹出式菜单(下拉菜单)实现——PopupMenu
    二级横向菜单实现——ListView
    java求两个集合的差集
    Java中String的split()方法的一些需要注意的地方
  • 原文地址:https://www.cnblogs.com/llx--20190411/p/11391754.html
Copyright © 2020-2023  润新知