SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点

来源:互联网 发布:windows 远程桌面 打开 编辑:程序博客网 时间:2024/04/30 20:56

mysql数据库表及数据准备语句:

USE test;DROP TABLEIF EXISTS `teacher_table`;DROP TABLEIF EXISTS `student_table`;CREATE TABLE `teacher_table` (`id` INT (11) NOT NULL AUTO_INCREMENT,`tName` VARCHAR (20) NOT NULL DEFAULT '老师名字',PRIMARY KEY (`id`)) ENGINE = INNODB DEFAULT CHARSET = utf8;CREATE TABLE `student_table` (`id` INT (11) NOT NULL AUTO_INCREMENT,`sName` VARCHAR (20) NOT NULL DEFAULT '学生名字',`teacherId` INT (11) NOT NULL DEFAULT '0',PRIMARY KEY (`id`)) ENGINE = INNODB DEFAULT CHARSET = utf8;INSERT INTO `teacher_table`VALUES(1, '鲁迅'),(2, '三毛'),(3, '莫言'),(4, '易中天'),(5, '罗永浩');INSERT INTO `student_table`VALUES(1, '小丽', 2),(2, '小王', 3),(3, '小赵', 1),(4, '小张', 4);

以上在mysql数据库中创建了两个表并准备好了数据。老师表有五条记录,前四条记录分别对应学生表的一条记录,最后一条记录在学生表中没有对应记录。

左连接查询语句如下:

SELECT*FROMteacher_table tLEFT JOIN student_table s ON t.id = s.teacherId;

在数据库连接软件中可以看到查询结果如下:

idtNameid1sNameteacherId1鲁迅3小赵12三毛1小丽23莫言2小王34易中天4小张45罗永浩NullNullNull由查询结果可以分析出:

      左连接查询的结果是:两个表满足连接条件的记录以及左表的剩余记录,其中左表的剩余记录中属于左表的字段的值为实际的值,属于右表的字段的值为null,注意不是对应字段的默认值。

      右连接查询与左连接查询相似,实际不怎么用右连接查询,想用右连接查询时只需把两个表的先后顺序替换一下,用左连接查询即可。

这里有两个大坑:

1.左表的剩余记录中属于右表的字段的值为null,而不是对应字段的默认值。这个在用自己封装的ResultSetUitls工具类处理成List<Map<String,Object>>对象时也有验证。list对象其中一些map元素的值是null,而不是数据库对应字段的默认值;

2.在项目中,要干掉或者说过滤掉这些包含null值的记录,否则在后期处理的时候很可能会报空指针异常。因为一些公司的数据库是靠脚本来维护的,很可能就写错脚本,导致出现对不上的记录,出现null值,这个时候为了保证程序不出异常,要有过滤null值的操作。

以上是mysql数据库建表及插入数据的语句,sqlserver数据库有些不同:

IF (SELECTCOUNT (1)FROMsysobjectsWHEREname = 'teacher_table') = 1 DROP TABLE teacher_table ;IF (SELECTCOUNT (1)FROMsysobjectsWHEREname = 'student_table') = 1 DROP TABLE student_table ; CREATE TABLE teacher_table (id INT NOT NULL IDENTITY,tName VARCHAR (20) NOT NULL DEFAULT '老师名字',PRIMARY KEY (id));CREATE TABLE student_table (id INT NOT NULL IDENTITY,sName VARCHAR (20) NOT NULL DEFAULT '学生名字',teacherId INT NOT NULL DEFAULT 0,PRIMARY KEY (id));INSERT INTO teacher_tableVALUES('鲁迅'),('三毛'),('莫言'),('易中天'),('罗永浩');INSERT INTO student_tableVALUES('小丽', 2),('小王', 3),('小赵', 1),('小张', 4);
不同点:

1.判断表是否存在,如果存在则删除的方法不同;

2.创建表时自增长的标识字段不同,mysql中用AUTO_INCREMENT,sqlserver中用IDENTITY;

3.mysql数据库在创建表时可以给 int 类型指定列宽,如int(11),也可以不指定。而sqlserver数据库在创建表时则不能对 int 类型指定列宽;

4.自增长字段在插入数据时的sql语句不一样。mysql在插入数据时,可以插入自增长字段的值,如果是一个整数值,则对应记录的对应自增字段的值就是此整数值;如果是一个

小数值,如5.5,则对应记录的对应自增字段的值就是此小数值的整数部分,也就是5;如果是null,则对应记录的对应自增字段的值就是当前记录此自增字段的最大值加上步长(一般为1)。而sqlserver数据库在插入语句中默认是不能加自增字段的, 如果非要在插入语句中指定自增字段的值,则需要将IDENTITY_INSERT设值为0(仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表中的标识列指定显式值)。

0 0