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 时,才能为表中的标识列指定显式值)。
- SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点
- 连接数据库的步骤SQL Server 与mysql 以及一些数据库查询语句
- java连接mysql数据库 以及java连接sql server数据库
- mysql数据库 连接查询
- MySQL连接数据库查询
- 连接MySql和SQLServer数据库
- hibernate连接sqlserver、mysql数据库
- Mysql数据库_DML_多表连接.sql
- 通用SQL数据库查询语句/连接查询/多表连接查询 sql小例子
- 通用SQL数据库查询语句/连接查询/多表连接查询 sql小例子
- sql server,mysql与oracle常见数据库的分页查询
- 简单的数据库(DB)连接以及sql查询
- SQL查询连接不同数据库的表
- 数据库SQL之表关系&连接查询
- 数据库基础--SQL多表连接查询(详细实例)
- [数据库 开发] SQL多表连接查询(详细实例)
- django 连接sqlserver总是出错,以及怎样使用django-mssql连接sql server2008数据库。
- SQL 数据库的连接查询
- 对比iOS中的四种数据存储
- 自主悬停&高度融合 作者:nieyong
- NDK 错误:Unable to launch cygpath. Is Cygwin on the path
- 死锁避免算法-银行家算法
- java/jsp-向mysql写数据时出现了中文乱码
- SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点
- 螺旋矩阵(C语言实现)- 2016.01.04
- 请求的链式处理——职责链模式
- 两个栈实现一个队列
- IOS crash atos
- 关系型数据库管理系统简介
- 实例8:状态栏中显示代表登陆状态的图标(实现仿QQ登陆状态显示)
- NDK :Native method not found
- textview加链接