mysql cant'获取要在查询中显示的空数据

时间:2016-04-24 00:34:29

标签: mysql null

这是我需要实现的目标:

person_id   last_name   first_name  region_id   region name                         
  1         barnum        phineas      1        maricopa                                    
  2         loman         willy        2        pima                                        
  2         loman         willy        3        pinal                                       
  2         loman         willy        4        santa cruz                                  
  3         kay           mary         5        cochise                                     
  3         kay           mary         6        gila                                        
  3         kay           mary         7        graham                                      
  4         lillian       vernon       NULL     NULL

以下是我的表格:

Create database sales
use sales

create table if not exists
  `Sales_People` 
    (`person_id` int primary key,
     `last_name` char(16) not null,
     `first_name` char(16) not null);

INSERT INTO Sales_people
    (`person_id`, `last_name`, `first_name`)
  values 
    ('1', 'barnum', 'phineas'),
    ('2', 'loman', 'willy'),
    ('3', 'kay', 'mary'),
    ('4', 'lillian', 'vernon');

create table if not exists
  `Sales_Region` 
    (`region_id` int primary key,
     `name` char(16) not null);

INSERT INTO Sales_Region
    (`region_id`, `name`)
  Values
    ('1', 'maricopa'),
    ('2', 'pima'),
    ('3', 'pinal'),
    ('4', 'santa cruz'),
    ('5', 'cochise'),
    ('6', 'gila'),
    ('7', 'graham');

create table if not exists
  `Sales_People_Region` 
    (`person_id` int not null,
     `region_id` int not null,
      constraint spr_pk primary key(person_id, region_id),
      constraint spr_fk1 foreign key(person_id) 
        references Sales_People(person_id),
      constraint spr_fk2 foreign key(region_id) 
        references Sales_Region(region_id));

INSERT INTO Sales_People_Region
    (`person_id`, `region_id`)
  Values
    ('1', '1'),
    ('2', '2'),
    ('2','3'),
    ('2', '4'),
    ('3', '5'),
    ('3', '6'),
    ('3','7');

create table if not exists
  `Sales`
    (`year` int not null,
     `month` int not null,
     `region_id` int not null,
     `amount_sold` decimal(11,2),
      constraint s_pk primary key(year, month, region_id),
      constraint s_fk foreign key(region_id)
        references Sales_Region(region_id));

INSERT INTO Sales
    (`year`, `month`, `region_id`, `amount_sold`)
  Values
    ('2016', '01', '1', '800000'),
    ('2016', '02', '1', '850000'),
    ('2016', '03', '1', '990000'),
    ('2016', '01', '2', '425000'),
    ('2016', '02', '2', '440000'),
    ('2016', '03', '2', '450000'),
    ('2016', '01', '3', '200000'),
    ('2016', '02', '3', '210000'),
    ('2016', '03', '3', '220000'),
    ('2016', '01', '4', '50000'),
    ('2016','02', '4', '52000'),
    ('2016', '03', '4', '55000'),
    ('2016', '01', '5', '40000'),
    ('2016', '02', '5', '41000'),
    ('2016', '03', '5', '42000'),
    ('2016', '01', '6', '3000'),
    ('2016', '02', '6', '31000'),
    ('2016','03', '6', '32000'),
    ('2016', '01', '7', '20000'),
    ('2016', '02', '7', '21000'),
    ('2016', '03', '7', '22000');

这是我的代码:

select sales_people.person_id, `last_name`, `first_name`, sales_region.Region_id, 
    trim(sales_region.`name`) AS 'Region Name'   
  from `sales_region` 
  inner join sales_people_region
    on sales_people_region.region_id = sales_region.region_id 
  inner join sales_people
    on sales_people_region.`person_id` = sales_people.`person_id`
  group by  sales_region.region_id, sales_people.person_id
    having sales_people.person_id >= ''
  order by sales_people.person_id, sales_region.region_id asc;

我得到了什么:

person_id   last_name   first_name  Region_id   "Region Name"
1            barnum     phineas          1      maricopa
2             loman     willy            2      pima
2       loman       willy       3       pinal
2       loman       willy       4       "santa cruz"
3       kay         mary        5        cochise
3       kay         mary        6       gila
3       kay         mary        7       graham

我无法让它看到最后一个person_id,因为它们没有分配region_ids。在表中,sales_people_region region_id是主键,因此不能为null。

如果我按person_id查询sales_people和group,那么她确实会出现。

1 个答案:

答案 0 :(得分:0)

我认为外部联接可以解决这个问题。内连接要求在连接的每一侧至少存在一行;左外连接将从左侧表中选择所有行,包括右侧表中没有匹配行的那些。 (右外连接是此镜像,完整外连接选择两侧不匹配的行。)

尝试此查询:

SELECT sales_people.person_id, last_name, first_name, sales_region.Region_id, 
    TRIM(sales_region.`name`) AS 'Region Name'   
  FROM sales_people
  LEFT OUTER JOIN sales_people_region
    on sales_people.person_id = sales_people_region.person_id
  LEFT OUTER JOIN sales_region
    ON sales_people_region.region_id = sales_region.region_id 
  GROUP BY sales_region.region_id, sales_people.person_id
    HAVING sales_people.person_id != ''
  ORDER BY sales_people.person_id, sales_region.region_id ASC;