php mysql sql语句怎么写_PHP面试 MySQL的SQL语句编写

MySQL的SQL语句编写

面试题一

有A表(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50的记录的c1,c2更新到A表中统一记录中的c1,c2字段中

SQL语句一:update A as a,B as b set a.c1=b.c1,a.c2=b.c2 where a.id=b.id and age>50;

SQL语句二:update A inner join B on A.id = B.id set A.c1 = B.c1,A.c2=B.c2 where B.age >50;

六种关联查询

交叉连接(CROSS JOIN)

SELECT * FROM A,B(,C)  或者  SELECT  * FROM A CROSS JOIN B (CROSS JOIN C)

没有任何关联条件,结果时笛卡尔积,结果集会很大,没有意义,很少使用。

内连接(INNER JOIN)

SELECT * FROM A,B WHERE A.id = B.id;

SELECT  FROM A INNER JOIN B ON A.id = B.id;

多表中同时符合某种条件的数据记录的集合

内连接分为三类

等值连接:ON A.id = B.id

不等值连接:ON A.id > B.id

自连接:select * from a t1 inner join a t2 on t1.id = t2.pid;

外连接(LEFT JOIN /  RIGHT JOIN)

左外连接:LEFT OUTER JOIN ,以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,可以简写成LEFT JOIN

右外连接:RIGHT OUTER  JOIN, 以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用null填充,可以简写成RIGHT JOIN

联合查询(UNION /  UNION ALL )

select * from a union select * from b union ....

就是把多个结果集集合中在一起,union前的结果为基准,需要注意的时联合查询的列数要相等,相同的记录会合并,如果使用union all ,不会合并重复的记录行

全连接(FULL JOIN)

MySQL不支持全连接

可以使用left join 和right join 联合使用、

select * from a  left join b on a.id=b.id union select * from a right join b on a.id=b.id

嵌套查询

用一条SQL语句的结果作为另一条SQL语句的条件

SELECT * FROM A WHERE id in (SELECT id from B)

根据考题要搞清楚表的结构和多表之间的关系,根据想要的结果思考使用哪种关联方式,通常要把查询的列先写出来,然后分析这些列都属于那些表,才考虑使用关联查询

面试题二

为了记录足球比赛的结果,设计表如下:

参赛队伍表   team

字段名称

类型

描述

teamid

int

主键

teamName

varchar(20)

队伍名称

赛程表   match

字段名称

类型

描述

matchid

int

主键

hostTeamid

int

主队id

guestTeamid

int

客队id

matchResult

varchar(20)

比赛结果

matchTime

Date

比赛日期

其中,match赛程表中的hostTeamID与guestTeamID 都和team表中的teamid关联,查询2006-6-1到2006-1-1之间举行的所有比赛,并且用以下形式列出:拜仁 2:0   不莱梅 2006-6-21

SQL语句:SELECT t1.teamName,m.matchResult,t2.teamName,m.matchTime FROM matchs as m LEFT JOIN team as t1 ON m.hostTeamid=t1.teamid LEFT JOIN team as t2 ON m.guestTeamid=t2.teamid WHERE m.matchTime BETWEEN "2006-06-01" AND "2006-07-01";

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值