SQL的数据查询功能之三---多表连接查询
SQL查询技术

聚合函数和GROUP BY子句 1.2.1 聚合函数和GROUP BY子句
• 例1-23 利用特殊函数COUNT(*)求计算机系学生的总数 程序清单如下: SELECT COUNT(*) FROM S WHERE DEPT=‘计算机’ • 注意:上例中,COUNT(*)用来统计元组的个数。此函数不消除重复行,也 不允许使用DISTINCT关键字。 • 在分组查询中,只要表达式中不包括聚合函数,就可以按该表达式分组。如 下例所示。 • 例1-24 查询每位学生的学号及其选课的门数。 程序清单如下: SELECT CNO,COUNT(*) AS C_NUM FROM SC GROUP BY CNO • GROUP BY子句按CNO的值分组,所有具有相同CNO的元组为一组,对每一组 使用函数COUNT进行计算,统计出各位学生选课的门数。 • 例1-25统计各年度出生的雇员人数 程序清单如下。 Use adventureworks SELECT DATEPART(year, birthdate ) AS Year, COUNT(*) AS NumberOfemployees FROM humanresources.employee GROUP BY DATEPART(year, birthdate)
表1-3常用的聚合函数
函数名称 功能 MIN 求一列中 的最小值 MAX 求一列中的 最大值 SUM AVG COUNT COUNT(*)
按列计算值 按列计算 的总和 平均值
按列值计个 返回表中的所 数 用行数
深圳市直方软件技术有限公司
聚合函数和GROUP BY子句 1.2.1 聚合函数和GROUP BY子句
深圳市直方软件技术有限公司
1.1.2 条件查询
join在sql中的用法

join在sql中的用法join在SQL中的用法在SQL中,join是一种常用的操作,用于将多个表中的数据连接在一起。
通过join操作,可以从多个表中检索数据并根据指定的条件将它们组合在一起。
本文将详细介绍join的用法,包括不同类型的join操作以及它们的应用场景。
一、什么是join操作在数据库中,数据通常存储在多个表中,这些表之间通过关系进行连接。
而join操作就是通过某种条件连接多个表,并返回满足条件的数据。
join 操作可以根据连接条件的不同分为多种类型,如内连接、外连接和交叉连接等。
二、内连接内连接是最常用的join操作之一。
当执行内连接时,只有满足连接条件(即两个表中对应列的值相等)的行才会被返回。
内连接可以使用关键字INNER JOIN或简单地使用JOIN来实现。
下面是一个示例,假设我们有两个表- "顾客"表和"订单"表:表:顾客顾客ID 姓名地址1 张三北京市2 李四上海市3 王五广州市表:订单订单ID 顾客ID 订单日期1 1 2022-01-012 2 2022-01-023 1 2022-01-03我们可以使用以下SQL语句来执行内连接操作:SELECT *FROM 顾客INNER JOIN 订单ON 顾客.顾客ID = 订单.顾客ID;将上述SQL语句执行后,将返回一个新的表,包含了"顾客"表和"订单"表中符合连接条件的行。
结果如下:顾客ID 姓名地址订单ID 顾客ID 订单日期1 张三北京市 1 1 2022-01-011 张三北京市 3 1 2022-01-032 李四上海市 2 2 2022-01-02三、外连接外连接也是一种常用的join操作。
与内连接不同的是,外连接会返回连接表中的所有行,即使没有满足连接条件的行。
外连接可以分为左外连接、右外连接和全外连接等几种类型。
1.左外连接左外连接即包含左表中的所有行,以及右表中与左表连接条件匹配的行。
SQL数据查询

任何单个字符。
指定范围(例如 [a-f])或集合(例如 [abcdef])内的 任何单个字符。 不在指定范围(例如 [^a - f])或集合(例如 [^abcdef]) 内的任何单个字符。
25 25
例20 查询含有“计算机”的课程信息。 USE jwglxt GO SELECT * from Course WHERE Cname like ‘%计算机 %’ 例21 查询DB%Design课程的课程信息。 USE jwglxt GO SELECT * from Course WHERE Cname like 'DB\%Design' ESCAPE'\'
19 19
(2)范围查询条件(BETWEEN AND和 NOT BETWEEN AND) SQL语句中也有一个特殊的 BETWEEN 运算符,用于检查某个值是 使用BETWEEN关键词和AND来指定要查询的列值范围的语法如下: SELECT 列名1, ……, 列名n
否在两个值之间(包括等于两端的值)。
2 2
1 简单查询
SQL数据查询语句是SELECT语句。该语句的基本框架
是SELECT-FROM-WHERE,它包含输出字段、数据来源 和查询条件等基本子句。在这种固定格式中,可以不要 WHERE,但是SELECT和FROM是必备的。SELECT语句 的子句很多,理解了这条语句各项的含义,就能从数据库中
22 22
例18 查询选修01001或01002的学生的学号、课程号和成绩。
程序清单如下:
SELECT SNO, CNO, SCORE FROM SC WHERE CNO IN(‘01001’, ‘01002’) 此语句也可以使用逻辑运算符“OR”实现。相应的程序清单如下: SELECT SNO, CNO, SCORE FROM SC WHERE CNO=‘01001’ OR CNO= ‘01002’
sql操作数据库(3)--外键约束、数据库表之间的关系、三大范式、多表查询、事务

sql操作数据库(3)--外键约束、数据库表之间的关系、三⼤范式、多表查询、事务外键约束在新表中添加外键约束语法: constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)在已有表中添加外键约束:alter table 从表表名 add constraints 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)删除外键语法: alter table 从表表名 drop foreign key 外键名称;级联操作:注意:在从表中,修改关联主表中不存在的数据,是不合法的在主表中,删除从表中已经存在的主表信息,是不合法的。
直接删除主表(从表中有记录数据关联) 会包删除失败。
概念:在修改或者删除主表的主键时,同时它会更新或者删除从表中的外键值,这种动作我们称之为级联操作。
语法:更新级联 on update cascade 级联更新只能是创建表的时候创建级联关系。
当更新主表中的主键,从表中的外键字段会同步更新。
删除级联 on delete cascade 级联删除当删除主表中的主键时,从表中的含有该字段的记录值会同步删除。
操作:-- 给从表student添加级联操作create table student(s_id int PRIMARY key ,s_name VARCHAR(10) not null,s_c_id int,-- constraint 外键约束名称 foreign key(外键的字段名称) references 主表表名(主键字段名)CONSTRAINT stu_cour_id FOREIGN key(s_c_id) REFERENCES course(c_id) -- 给s_c_id 添加外键约束ON UPDATE CASCADE ON DELETE CASCADE)insert into student VALUE(1,'⼩孙',1),(2,'⼩王',2),(3,'⼩刘',4);insert into student VALUE(4,'⼩司马',1),(5,'⼩赵',1),(6,'⼩钱',1);-- 查询学⽣表中的记录select * from student;-- 级联操作。
第4章_结构化查询语言SQL-6学时

说明1:
SELECT S••F联Tro接Um条D短件E语:N:两T后.个学面表接号进多行,姓个联表名接时查,,性询两别的个前,表成提之是绩间一用;定逗有号“隔相开同。” FROM STUDENT,S的C字O段R名E。; WHERE 成•联绩接>的8方0法A:如N:D表“名Ss1Tt.u字Ud段eDn名tE.学=N表号T名=.学s2c.字o号r段e.=学名S号C”ORE.学号
无条件查询小结:
6)结果排序 【例】查询显示COURSE表中的所有信息,并按学分 升序排序。
SELECT * FROM COURSE ORDER BY 学分
2、单表条件查询----SELECT … FROM …WHERE …
【格式】SELECT [ALL | DISTINCT] <字段列表> FROM <表> [WHERE <条件表达式> ]
1975~1979,IBM San Jose Research Lab的关系数据库管 理系统原型System R实施了这种语言
SQL-86是第一个SQL标准
(ANSI)
SQL-89、SQL-92(SQL2)、SQL-99(SQL3) (ANSI)
●现状:大部分DBMS产品都支持SQL,成为操作数据库的标 准语言
第四章 结构化查询语言SQL
本章主要内容
4.1 数据查询 4.2 数据操作 4.3 数据定义 本章作业
SQL语言的基本概述
●SQL:Structured Query Language 缩写
结构化查询语言,目前关系型数据库的通用语言。
●SQL的发展
1974年,由Boyce和Chamberlin提出
vfp之SQL

37
8.3.2 更新记录
命令格式: 命令格式:
Update 表名 Set <字段名> = < 表达式 >
Where < 条件 >
38
更新记录的例子
命令格式: 命令格式:
Update rcda.dbf Set 姓名 = 〃刘德华〃
Where 姓名 = 〃刘伟箭 〃
39
8.3.3 删除记录
命令格式: 命令格式:
45
4, LIKE 运算符 和 % 通配符 【例8.25】列出所有的 姓 〃赵 〃的学生名单.
SELECT 学号 , 姓名
WHERE
FROM
学生
姓名 LIKE 〃赵%〃 赵
注: % 通配符代表一个或多个字符
*
Hale Waihona Puke 代表全部字段468.2.3 嵌套查询
在一个 SELECT 命令的 WHERE子句中出现 子句中出现 命令,则称为嵌套查询或子查询. 另一个 SELECT 命令,则称为嵌套查询或子查询. 子查询必须用括号括起来. 子查询必须用括号括起来.
四,多表联接查询:—— 输出内容来自三个表
SELECT <父表.字段1 > ,<父表. 字段2 > , … <子表1.字段1 > ,<子表1. 字段2 > , … <子表2.字段1 > ,<子表2. 字段2 > , … FROM < 父表 > INNER JOIN INNER JOIN <子表 <子表1> 子表1>
<子表 <子表2> 子表2>
ON < 联接条件 > 联接条件1
MySQL基本SQL语句之单表查询、多表查询和子查询

一、简单查询:基本语法:SELECT*FROMtb_name;查询全部SELECTfield1,field2FROMtb_name;投影SELECT[DISTINCT]*FROMtb_nameWHEREqualification;选择说明:FROM子句:要查询的关系表、多个表、其它SELECT语句WHERE子句:布尔关系表达式,主要包含如下这几类表达式:比较:=、>、>=、<=、<逻辑关系:ANDORNOTBETWEEN...AND...:在两个值之间LIKE‘’%:任意长度任意字符_:任意单个字符REGEXP,RLIKE:正则表达式,此时索引无效INISNULLISNOTNULL如下查询本博客的wp-links和wp_posts表:mysql>select*fromwp_links;查询全部mysql>selectlink_name,link_urlfromwp_links;投影+-------------------+--------------------------------------+|link_name|link_url|+-------------------+--------------------------------------+|腾讯微博|/toxingwang||新浪微博|/gz100ww||51CTO技术博客|/|+-------------------+--------------------------------------+10rowsinset(0.00sec)mysql>selectID,post_title,post_datefromwp_posts where ID>1290andpost_status='publish';选择+------+----------------------------------------------------------------+----------------------+|ID|post_title|post_date|+------+----------------------------------------------------------------+----------------------+|1291|【转】HP3PAR存储概念之三|2013-08-2917:21:27||1298|【转】HP3PAR存储概念之四|2013-08-2917:22:33||1351|【转】XenDesktop5.5+vSphere5创建虚拟机报错|2013-09-0417:41:26||1357|linux下强大的网络工具Netcat|2013-09-0922:26:45||1360|MySQL常用命令、技巧和注意事项|2013-09-2011:04:15||1369|【转】数据库设计原理知识--B树、B-树、B+树、B*树都是什么|2013-09-2112:30:18||1379|MySQL基本SQL语句之常用管理SQL|2013-09-2112:39:23|+------+----------------------------------------------------------------+---------------------+7rowsinset(0.01sec)对查询结果排序:ORDERBYfield_name{ASC|DESC}如下:mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'ORDERby ID;##升序,ID是排序的字段mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'ORDERby ID DES C;##降序字段别名:ASselectcol_name AS COL_Aliases…:对字段使用别名selectcol_name,…fromtb_nameAStb_Aliases…:对表使用别名如下:mysql>selectpost_title AS文章标题fromwp_postswhereID>1290andpost_status='publish';+----------------------------------------------------------------+|文章标题|+----------------------------------------------------------------+|【转】HP3PAR存储概念之三||【转】HP3PAR存储概念之四||【转】XenDesktop5.5+vSphere5创建虚拟机报错||linux下强大的网络工具Netcat||MySQL常用命令、技巧和注意事项||【转】数据库设计原理知识--B树、B-树、B+树、B*树都是什么||MySQL基本SQL语句之常用管理SQL|+----------------------------------------------------------------+7rowsinset(0.02sec)##还可以这样:mysql>select3+2ASSUM;+-----+|SUM|+-----+|5|+-----+1rowinset(0.00sec)LIMIT子句:LIMIT[offset,]Count如下:mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'limit5;+------+--------------------------------------------------+---------------------+|ID|post_title|post_date|+------+--------------------------------------------------+---------------------+|1291|【转】HP3PAR存储概念之三|2013-08-2917:21:27||1298|【转】HP3PAR存储概念之四|2013-08-2917:22:33||1351|【转】XenDesktop5.5+vSphere5创建虚拟机报错|2013-09-0417:41:26||1357|linux下强大的网络工具Netcat|2013-09-0922:26:45||1360|MySQL常用命令、技巧和注意事项|2013-09-2011:04:15|+------+--------------------------------------------------+---------------------+5rowsinset(0.01sec)mysql>selectID,post_title,post_datefromwp_postswhereID>1290andpost_status='publish'limit2,3;##红色部分(逗号前的数字)表示偏移量+------+--------------------------------------------------+---------------------+|ID|post_title|post_date|+------+--------------------------------------------------+---------------------+|1351|【转】XenDesktop5.5+vSphere5创建虚拟机报错|2013-09-0417:41:26||1357|linux下强大的网络工具Netcat|2013-09-0922:26:45||1360|MySQL常用命令、技巧和注意事项|2013-09-2011:04:15|+------+--------------------------------------------------+---------------------+3rowsinset(0.00sec)聚合:SUM(),MIN(),MAX(),AVG(),COUNT(),括号中为字段名mysql>select sum(ID)fromwp_posts;计算和mysql>select min(ID)fromwp_posts;查早最小的mysql>select max(ID)fromwp_posts;查找最大的mysql>select avg(ID)fromwp_posts;平均值mysql>select count(ID)fromwp_posts;计数分组:GROUPBY,一般配合聚合运算使用如下:mysql>select count(post_status)AS各状态数量,post_statusAS状态名称fromwp_posts groupby post_status;+-----------------+--------------+|各状态数量|状态名称|+-----------------+--------------+|1|auto-draft||9|draft||251|inherit||238|publish||2|trash|+-----------------+--------------+5rowsinset(0.01sec)注意:可以使用HAVING qualification将GROUPBY的结果再次过滤,用法同where二、多表查询连接:交叉连接:笛卡尔乘积自然连接:将两张表某字段中相等连接起来,如下mysql>,students.Age,ame,students.GenderFROMstudents,coursesWHER Estudents.CID1=courses.CID;+--------------+------+------------------+--------+|Name|Age|Cname|Gender|+--------------+------+------------------+--------+|GuoJing|19|TaiJiquan|M||YangGuo|17|TaiJiquan|M||DingDian|25|Qishangquan|M||HuFei|31|Wanliduxing|M||HuangRong|16|Qianzhuwandushou|F||YueLingshang|18|Wanliduxing|F||ZhangWuji|20|Hamagong|M||Xuzhu|26|TaiJiquan|M|+--------------+------+------------------+--------+8rowsinset(0.00sec)外连接:左外连接:left_tbLEFTJOINright_tbON...:以左表为标准mysql>,ameFROMstudentsASs LEFTJOIN coursesASc ON s.CID1=c.CID; +--------------+--------------------+|Name|Cname|+--------------+--------------------+|GuoJing|TaiJiquan||YangGuo|TaiJiquan||DingDian|Qishangquan||HuFei|Wanliduxing||HuangRong|Qianzhuwandushou||YueLingshang|Wanliduxing||ZhangWuji|Hamagong||Xuzhu|TaiJiquan||LingHuchong|NULL||YiLin|NULL|+--------------+--------------------+10rowsinset(0.00sec)右外连接:left_tbRIGHTJOINright_tbON...:以右表为标准mysql>,ameFROMstudentsASs RIGHTJOIN coursesASc ON s.CID1=c.CID; +--------------+--------------------+|Name|Cname|+--------------+--------------------+|GuoJing|TaiJiquan||YangGuo|TaiJiquan||DingDian|Qishangquan||HuFei|Wanliduxing||HuangRong|Qianzhuwandushou||YueLingshang|Wanliduxing||ZhangWuji|Hamagong||Xuzhu|TaiJiquan||NULL|Yiyangzhi||NULL|Jinshejianfa||NULL|Qiankundanuoyi||NULL|Pixiejianfa||NULL|Jiuyinbaiguzhua|+--------------+--------------------+13rowsinset(0.01sec)自连接:本表中不同字段间进行连接mysql>ASstudent,ASteacherFROMstudentsASc,studentsASsWHEREc.TID=s.SID; +-----------+-------------+|student|teacher|+-----------+-------------+|GuoJing|DingDian||YangGuo|GuoJing||DingDian|ZhangWuji||HuFei|HuangRong||HuangRong|LingHuchong|+-----------+-------------+5rowsinset(0.02sec)注意:使用了别名三、子查询:一个查询中嵌套另外一个查询如下:在students表中查询年龄大于平均年龄的学生mysql>SELECTName,AgeFROMstudentsWHEREAge>(SELECTAVG(Age)FROMstudents);+-------------+------+|Name|Age|+-------------+------+|DingDian|25||HuFei|31||Xuzhu|26||LingHuchong|22|+-------------+------+4rowsinset(0.08sec)子查询注意事项:•比较操作中使用子查询:子查询只能返回单个值;•IN():使用子查询;•在FROM中使用子查询;联合查询:UNION,将两个查询的结果合并mysql>(SELECTName,AgeFROMstudents)UNION(SELECTTname,AgeFROMtutors); +--------------+------+|Name|Age|+--------------+------+|GuoJing|19||YangGuo|17||DingDian|25||HuFei|31||HuangRong|16||YueLingshang|18||ZhangWuji|20||HuYidao|42||NingZhongze|49|+--------------+------+19rowsinset(0.00sec)。
第03章 SQL查询

2013-7-17
扬州科技学院
15
SELECT 查询4
在何处编写SELECT语句?
编写SQL查询语句的步骤:
按下“在设计视图中创建查询”选项 在显示表的窗口内直接按“关闭”按钮,此时就是设计 视图的窗口。
接着按下“视图”按钮下的“SQL视图”, 即进入SQL语句的编写窗口。
2013-7-17
常用的SQL语句包括Select、Insert、Update、Delete、 Create等。
数据定义语句(DATA DEFINITION LANGUAGE,简称DDL) 实现其数据定义功能。包括定义数据库、基本表、视图和索引。 数据操纵语句( Data Manipulation Language ,DML)及其 编译程序,包括数据查询与数据更新两大类,实现对数据库的 基本操作。数据更新包括插入、修改、删除等操作。 数据控制语句 (Data Control Language,简称DCL)对数据库 进行统一的控制管理。对用户访问数据的控制有基本表和视图 的授权、完整性规则的描述,事务控制语句等。
说明:<>表示必填 [ ]表示可选填 | 表示多项选择中只能选择其一 { }表示必选项
扬州科技学院 6
2013-7-17
数据定义
例:创建一个“雇员”表,包括雇员号、姓名、 出生日期、备注字段 Create Table 雇员
(雇员号 Smallint Primary Key, 姓名 char(4) not null , 出生日期 Date, 备注 memo)
2013-7-17
扬州科技学院
18
SELECT 查询7
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个数据库中的多个表之间一般都存在某种内在联系,它们共同提供有用的信息。
前面的查询都是针对一个表进行的。
若一个查询同时涉及两个以上的表,则称之为连接查询。
连接查询主要包括内连接、外连接和交叉连接。
1.内连接
内连接是一种最常用的连接类型,使用内连接是,如果两个表的相关字段满足连接条件则从这两个表中提取数据并组合成新的记录。
当连接运算符为=时,称为等值连接。
使用其它运算符称为非等值连接。
连接谓词中的列名称为连接字段。
连接条件中的各连接字段类型必须是可比的,但不必是相同的。
例如,可以都是字符型,或都是日期型;也可以一个是整型,另一个是实型,整型和实型都是数值型,因此是可比的。
但若一个是字符型,另一个是整数型就不允许了,因为它们是不可比的类型。
从概念上讲DBMS执行连接操作的过程是,首先在表1中找到第一个元组,然后从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组, 就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。
表2全部扫描完毕后,再到表1中找第二个元组,然后再从头开始顺序扫描或按索引扫描表2,查找满足连接条件的元组,每找到一个元组, 就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。
重复上述操作,直到表1全部元组都处理完毕为止。
例38 查询每个学生及其选修课程的情况
学生情况存放在Student表中,学生选课情况存放在SC表中,所以本查询实际上同时涉及Student与SC 两个表中的数据。
这两个表之间的联系是通过两个表都具有的属性Sno实现的。
要查询学生及其选修课程的情况,就必须将这两个表中学号相同的元组连接起来。
这是一个等值连接。
完成本查询的SQL语句为: SELECT * FROM Student JOIN SC ON Student.Sno=SC.Sno;
如果是按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列,则称之为自然连接
例39 自然连接Student和SC表
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student INNER JOIN SC ON Student.Sno=SC.Sno;
在本查询中,由于Sname、 Ssex、 Sage、Sdept、Cno和Grade属性列在Student与SC表中是唯一的,因此引用时可以去掉表名前缀。
而Sno在两个表都出现了,因此引用时必须加上表名前缀。
该查询的执行结果不再出现SC.Sno列。
例40 查询选修2号课程且成绩在90分以上的所有学生
SELECT Student.Sno, Sname FROM Student INNER JOIN SC ON Student.Sno=SC.Sno
WHERE o='2' AND SC.Grade>90;
例41 查询每个学生及其选修的课程名其及成绩
SELECT Student.Sno, Sname, ame, SC.Grade
FROM Student S INNER JOIN ON S.Sno=SC.Sno
JOIN Course C ON o=o;
2.自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接。
例42 查询与刘晨在同一个系学习的学生的姓名和所在系
为清楚起见,我们可以为Student表取两个别名,一个是S1,另一个是S2,也可以在考虑问题时就把Course
表想成是两个完全一样表,一个是S1表,另一个是S2表。
如下所示:
完成该查询的SQL语句为:
SELECT S2.Sname, S2.Sdept
FROM Student as S1 JOIN Student as S2 ON S1.Sdept=S2.Sdept
WHERE S1.Sname=‘刘晨’AND S2.Sname!=‘刘晨’;
3.外连接
在通常的连接操作中,只有满足连接条件的元组才能作为结果输出,如在例35和例36的结果表中没有关于95003和95004两个学生的信息,原因在于他们没有选课,在SC表中没有相应的元组。
但是有时我们想以Student表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况信息,其选课信息为空值即可,这时就需要使用外连接(Outer Join)。
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUTER JOIN SC ON Student.Sno=SC.Sno;
Student.Sno Sname Ssex Sage Sdept Cno Grade
----------- ------- ------ ------ ------- ------ -------
95002 刘晨女 19 信息系 3 80
95003 王名女 18 数学系 NULL NULL
95004 张立男 18 信息系 NULL NULL
右连接同理。