SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点
mysql数据库表及数据准备语句:
USE test;
DROP TABLE
IF EXISTS `teacher_table`;
DROP TABLE
IF EXISTS `student_table`;
CREATE TABLE `teacher_table` (
`id` ) NOT NULL AUTO_INCREMENT,
`tName` ) NOT NULL DEFAULT '老师名字',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `student_table` (
`id` ) NOT NULL AUTO_INCREMENT,
`sName` ) NOT NULL DEFAULT '学生名字',
`teacherId` ) ',
PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
INSERT INTO `teacher_table`
VALUES
(, '鲁迅'),
(, '三毛'),
(, '莫言'),
(, '易中天'),
(, '罗永浩');
INSERT INTO `student_table`
VALUES
(, ),
(, ),
(, ),
(, );
以上在mysql数据库中创建了两个表teacher_table和student_table,并准备好了数据。老师表有五条记录,前四条记录分别对应学生表的一条记录,最后一条记录在学生表中没有对应记录。
左连接查询语句如下:
SELECT
*
FROM
teacher_table t
LEFT JOIN student_table s ON t.id = s.teacherId;
在数据库连接软件中可以看到查询结果如下:
| id | tName | id1 | sName | teacherId |
| 1 | 鲁迅 | 3 | 小赵 | 1 |
| 2 | 三毛 | 1 | 小丽 | 2 |
| 3 | 莫言 | 2 | 小王 | 3 |
| 4 | 易中天 | 4 | 小张 | 4 |
| 5 | 罗永浩 | Null | Null | Null |
由查询结果可以分析出:
左连接查询的结果是:两个表满足连接条件的记录以及左表的剩余记录,其中左表的剩余记录中属于左表的字段的值为实际的值,属于右表的字段的值为null,注意不是对应字段的默认值。这个在用自己封装的ResultSetUitls工具类处理成List<Map<String,Object>>对象时也有验证。list对象其中一些map元素的值是null,而不是数据库对应字段的默认值;
此外,在项目中更推荐使用内连接inner join查询,内连接查询只会查询出连接表符合连接条件的记录。
以上是mysql数据库建表及插入数据的语句,sqlserver数据库有些不同:
IF (
SELECT
)
FROM
sysobjects
WHERE
name = 'teacher_table'
) DROP TABLE teacher_table ;
IF (
SELECT
)
FROM
sysobjects
WHERE
name = 'student_table'
) DROP TABLE student_table ; CREATE TABLE teacher_table (
id INT NOT NULL IDENTITY,
tName ) NOT NULL DEFAULT '老师名字',
PRIMARY KEY (id)
);
CREATE TABLE student_table (
id INT NOT NULL IDENTITY,
sName ) NOT NULL DEFAULT '学生名字',
teacherId ,
PRIMARY KEY (id)
);
INSERT INTO teacher_table
VALUES
('鲁迅'),
('三毛'),
('莫言'),
('易中天'),
('罗永浩');
INSERT INTO student_table
VALUES
(),
(),
(),
();
不同点:
1.判断表是否存在,如果存在则删除的方法不同;
2.创建表时自增长的标识字段不同,mysql中用AUTO_INCREMENT,sqlserver中用IDENTITY;
3.mysql数据库在创建表时可以给 int 类型指定列宽,如int(11),也可以不指定。而sqlserver数据库在创建表时则不能对 int 类型指定列宽;
4.自增长字段在插入数据时的sql语句不一样。mysql在插入数据时,可以插入自增长字段的值,只要不是重复的值就不会报错,而且不必要比现在最大值大;如果插入null,则对应记录的对应自增字段的值就是当前记录此自增字段的最大值加上步长(一般为1)。而sqlserver数据库在插入语句中默认是不能加自增字段的, 如果非要在插入语句中指定自增字段的值,则需要将IDENTITY_INSERT设值为0(仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表中的标识列指定显式值)。
5.分页查询不一样。
mysql分页用关键字limit,如每页3条,查询第2页的语句是:
,;
limit后面跟两个数,用逗号隔开,不用括号。第一个数是要查询的记录的起始索引,是算出来的,(page-1)*pageSize。第二个数就是每页的条数,是固定值。
sqlserver分页用top关键字,一般配合排名函数row_number() over()使用:
row_number() over([partition by xx] order by xx) as rowNumber ,按照特定顺序给每行记录添加一个行号。分组可选,排序必需,不管是正序还是逆序,行号永远从1开始。如下
SELECT
row_number () OVER (ORDER BY id DESC) AS rowNumber,
*
FROM
teacher_table;
查询结果是:
| rowNumber | id | tName |
| 1 | 5 | 罗永浩 |
| 2 | 4 | 易中天 |
| 3 | 3 | 莫言 |
| 4 | 2 | 三毛 |
| 5 | 1 | 鲁迅 |
可以看到这一sql语句把全部记录数按照我们的要求排序后给又给每一行都标上了行号,行号为1的就代表是第一条记录。
我们只需在当前记录数中用where截断记录然后去头多少行就好了。例如,还是每页3条,查询第2页,则就是where rowNumber>3,然后select top 3 *,其实就是在要查询的字段前加上top N。分页sql语句如下:
SELECT
*
FROM
(
SELECT
row_number () OVER (ORDER BY id DESC) AS rowNumber,
*
FROM
teacher_table
) R
WHERE
rowNumber ;
查询结果如下:
| rowNumber | id | tName |
| 4 | 2 | 三毛 |
| 5 | 1 | 鲁迅 |
总的来看,其实是用了子查询,先给所有的记录排序并标上行号,然后取从某个行号开始取固定长度的记录数,这就是sqlserver分页的原理。
SQL多表连接查询以及mysql数据库、sqlserver数据库常见不同点的更多相关文章
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- SQL多表连接查询(详细实例)(转)
http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...
- SQL多表连接查询(具体实例)
本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图例如以下: 表2:course 截图例如以下: (此时这样建表仅仅是为了演示连接SQL语句.当然实际开发中我们 ...
- C#通过SqlConnection连接查询更新等操作Sqlserver数据库
Sqlserver数据库连接方式有多种,这里只介绍最常用的通过SqlConnection和Sqlserver数据库用户名和密码验证来进行操作数据库. 数据库连接字符串: string connStri ...
- sql server 表连接
本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: SQL多表连接查询(详细实例)_新客网 表2:course 截图如下: SQL多表连接查询(详细实例)_新 ...
- MySQL数据库:多表连接查询
多表连接查询 注意:使用连接技术建议将表经行重命名! # explain 检索连接是否达标 # 内连接 # 语法1 from 表1 inner join 表2 on 主键字段=外键字段 [where ...
- MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习
MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...
- Mysql表连接查询
原文地址: https://www.cnblogs.com/qiuqiuqiu/p/6442791.html 1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等 ...
随机推荐
- Tiny6410之控制icache驱动
什么是cache: 基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一类高速的.容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU 在一段时间内使 ...
- SharpZipLib.dll 压缩文件,可以应用于MVC, webform. C# windows application 等等地方
Nuget 安装:Install-Package ICSharpCode.SharpZipLib.dll private void WriteZipFile(string[] filesToZip, ...
- Hive 常用函数
参考地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1. parse_url(url, partToExt ...
- /home 和 /root
/root Linux超级权限用户root的家目录./home 如果我们建立一个用户,用户名是"xx",那么在/home目录下就有一个对应的/home/xx路径,用来存放用 ...
- Shell学习笔记 ——第二天
1.显示日期 date | cal cal 2010 cal 2 2010 2.改变文件拥有者 chown 3.改变文件权限 chmod 4.显示当前目录 pwd 5.查看文件尾部内容,并 ...
- JavaScript DOM编程艺术-学习笔记(第十二章)
第十二章 1.本章是综合前面章节的所有东西的,一个综合实例 2.流程:①项目简介:a.获取原始资料(包括文本.图片.音视频等) b.站点结构(文件目录结构) c.页面(文件)结构 ②设计(切图) ③c ...
- Oracle获取时间日期月份星期数
1.日期和字符转换函数用法(to_date,to_char)select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; ...
- Spring Aspect 用法略讲
『配置Aspect』 若要启用AspectJ风格的注解则必须额外的导入AspectJ的jar包,此外还需要在spring的配置文件中进行配置,配置方式有两种; 一.在配置文件的Schema中进行配置 ...
- 批量安装XP补丁的命令
方法一: 新建一个bat文件,把这个文件和所有补丁文件放在同一个目录下,双击运行. BAT代码如下 @echo offfor %%i in (*.exe) do %%i /passive /nores ...
- ExtJS从入门到后面肯定要抛弃
一.ExtJs定义 ①基于JavaScript语言 ②基于JavaSwing的MVC架构 ③支持组件化.模块化设计 ④提供“本地数据源”的支持 ⑤完完善与服务端的交互机制 ⑥是最有可能拥有大规模可视化 ...