《深入浅出SQL》问答录(七)
本系列出自《深入浅出MySQL》,全文以问答形式展开,是我的个人学习笔记
问答录
先看花絮。
Q:我为什么需要交叉联接?
A:知道交叉联接的存在,有助于我们找出修正联接的正确方式。还有,交叉联接有时可用于RDBMS软件及其配置的运行速度。运行交叉联接所需的时间可以轻易的检测与比较出速度慢的查询。
Q:内联接和交叉联接有什么区别吗?
A:交叉联接属于内联接的一种。内联接就是通过查询中的条件移除了某些结果的交叉联接。
Q:可以联接多于两张表吗?
A:可以,后续章节再说,有点饿了。
Q:ORDER BY 这些东西也能与联接放到一起吗?
A:是的。
Q:外联接呢?
A:莫急。
花絮
字符串切割函数
同时(几乎同时)CREATE、SELECT、INSERT
CREATE TABLE profession(
id INT(11) NOT NULL AUTP+INCREMENT PRIMARY KEY,
profession varchar(20)
);
INSERT INTO profession (profession)
SELECT profession FROM my_contacts
GROUP BY profession
ORDER BY profession;
CREATE TABLE profession AS
SELECT profession FROM my_contacts
GROUP BY profession
ORDER BY profession;
ALTER TABLE profession
ADD COLUMN id INT NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY(id);
CREATE TABLE profession(
id INT(11) NOT NULL AUTP+INCREMENT PRIMARY KEY,
profession varchar(20)
) AS
SELECT profession FROM my_contacts
GROUP BY profession
ORDER BY profession;
关键字AS
看上面语句,AS能把SELECT的查询结果填入表中。
短短一个查询语句,就出现了五次“profession”,这五次profession效果各有不同,我们容易弄晕,但是SQL能够很轻易的分辨。 为了能让我们容易分辨,SQL推出了假名功能。
创建别名真的很简单,在查询软件中首次使用原始列名的地方后接一个AS并设定要采用的别名,告诉软件现在开始要以另一个名称引用my_contacs表的profession列,这样可以让查询更容易被我们理解。
表的别名,谁会需要?
你会需要! 接下来要开始对表进行联结了,嘿嘿,睁大眼睛吧。
创建表的别名的方式和创建列的别名的方式几乎一样。在查询中首次出现表名的地方后接AS并设定别名。 当然,你甚至可以连AS也省了。
联接
交叉联接(笛卡尔积)
假设你有一个存储男孩姓名的表以及一个记录男孩们都有哪些玩具的表,现在我们要试着找出每个男孩拥有的玩具。
SELECT t.toy,b.boy
From toys t
CROSS JOIN
boys AS b
;
CROSS JOIN返回两张表的每一行相乘的结果。
内联接
INNER JOIN利用条件判断中的比较运算符结合两张表的记录。只有联接记录符合记录条件时才会返回列。
SELECT somecolumns
FROM table1
INNER JOIN
table2
ON somecondition; --条件式里课采用任何一个比较运算符,也可以改用WHERE
示例:
SELECT mc.last_name,mc.first_name,p.profession
FROM my_contacts AS mc
INNER JOIN
profession AS p
ON mc.prof_id = p.prof_id;
自然联接
属于内联接的一种。 自然联接只有在联接的列在两张表中的名称相同时才会用。
SELECT boys.boy,toys.toy
FROM boys
NATURAL JOIN
toys;
- 你写的单例真的对吗
- TensorFlow layers模块用法
- Spark算子详解及案例分析(分类助记)
- Spark详解07广播变量BroadcastBroadcast
- TensorFlow验证码识别
- python selenium2 开发环境搭建
- 聊聊同步辅助类CountDownLatch
- Java多线程编程笔记之Condition
- python selenium2示例 - 生成 HTMLTestRunner 测试报告
- python selenium2示例 - email发送
- pyhton-----break语句
- python unittest使用基本过程
- 基于unittest集成你的selenium2测试
- Selenium Webdriver Desired Capabilities
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 玩转dnmp之自定义容器
- python那些实用且不为人知的技巧
- 实现接口的契约测试
- java泛型总结
- 彻底搞懂 etcd 系列文章(九):etcd compact 和 watch API
- lru算法和redis的lru
- ThreadLocal
- 前端开发:font属性与font-variant如何使用?
- spring-boot使用aop进行多数据源切换
- CRC校验原来这么简单
- centos7安装kubernetes教程
- spring-boot自定义starter
- 实操 | kafka如何手动异步提交offset
- 解惑 | 为什么我根据时间戳获得的offset为空呢?
- spring-boot使用aop进行日志记录