欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Sql Join面试题实例分析

程序员文章站 2022-04-12 20:22:57
Sql Join用于根据两个或多个表格中的列之间的关系,来查询数据 一道面试题: 两个SQL表描述如下: 部门表(department) +——+&...

Sql Join用于根据两个或多个表格中的列之间的关系,来查询数据

一道面试题:

两个SQL表描述如下:

部门表(department)

+——+———-+

| id | name |

+——+———-+

| 1 | caiwu |

| 2 | xiaoshou |

| 3 | kefu |

+——+———-+

员工表(employee)

+——+——-+—————+

| id | name | id_department |

+——+——-+—————+

| 1 | zhang | 1 |

| 2 | li | 1 |

| 3 | wang | 3 |

| 4 | zhao | 3 |

+——+——-+—————+

用一个sql语句输出以下统计表

+——+———-+—–+

| id | name | num |

+——+———-+—–+

| 1 | caiwu | 2 |

| 2 | xiaoshou | 0 |

| 3 | kefu | 2 |

+——+———-+—–+

sql语句:

SQL Server/MS Access

select d.*,e.isnull(num,0) num from department d

left join

(

select id_department,count(*) num from employee group by id_department

)e on e.id_department = d.id;

MySQL(实测)

select d.*,ifnull(e.num,0) num from department d

left join

(

select id_department,count(*) num from employee group by id_department

)e

on e.id_department = d.id;

SQL Inner Join(与Join相同):在表中存在至少一个匹配时,Inner Join关键字返回行,语法:

SELECT column_name(s)

FROM table_name1

INNER JOIN table_name2

ON table_name1.column_name=table_name2.column_name

SQL Left Join:返回左表(table_name1)中所有的行,即使右表中没有匹配行,语法:

SELECT column_name(s)

FROM table_name1

LEFT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

SQL Right Join:返回右表中所有的行,即使左表中没有匹配行,语法:

SELECT column_name(s)

FROM table_name1

RIGHT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

SQL Full Join:只要某个表中存在匹配行,即返回,语法:

SELECT column_name(s)

FROM table_name1

FULL JOIN table_name2

ON table_name1.column_name=table_name2.column_name

该问题中还涉及到表别名(Oracle 不支持AS关键字。要在 Oracle 中使用别名,可以不用AS,简单地指定列名即可(因此,应该是Customers C,而不是Customers AS C)。),count()函数等。