Sql Join面试题实例分析

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()函数等。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐