构建2
This commit is contained in:
1 parent
089a540486
commit
2712c037a0
15 files changed
+301
No files matched your search
@@ -0,0 +1,156 @@
|
||||
|
||||
## 连接查询分类
|
||||
根据语法出现年代划分:
|
||||
|
||||
SQL92(DBA,数据库管理)、
|
||||
SQL99
|
||||
|
||||
根据表的连接方式来划分:
|
||||
|
||||
- 内连接:
|
||||
- 等值连接
|
||||
- 非等值连接
|
||||
- 直连接
|
||||
- 外连接:
|
||||
- 左外连接(左连接)
|
||||
- 右外连接(右连接)
|
||||
- 全连接
|
||||
|
||||
|
||||
|
||||
## 笛卡尔积现象
|
||||
笛卡尔乘积现象:
|
||||
|
||||
案例:找出每一个员工的部门名,要求显示员工名和部门名
|
||||
找出每一个员工对应的部门:【EMP】
|
||||
|
||||

|
||||
|
||||
找出编号对应部门:【dept】
|
||||
|
||||

|
||||
|
||||
当两个表进行联合查询时,在 EMP 表取 enamel,在 dept 取 dname:
|
||||
|
||||

|
||||
|
||||
因为没有添加筛选条件,所以查询时,ename 会和每个 dname 进行组合并进行输出,输出的条数时 14*4 为 56 条。
|
||||
|
||||
> [!tip]
|
||||
> 两张表联合查询没有任何条件限制的话,最终查询结果条数是两个表的记录的成绩乘积,这种现象被称为笛卡尔积现象
|
||||
|
||||
如何避免:
|
||||
> 加条件进行限制。
|
||||
|
||||
> 增加限制条件也不能避免笛卡尔积现象,不会减少记录的匹配次数,次数不会变。
|
||||
> 只不过显示的记录是有效记录
|
||||
|
||||
增加限制条件:【SQL92写法】
|
||||
|
||||

|
||||
|
||||
匹配时还是逐条进行匹配,但是只有当两个表中的DEPTNO相同时才会进行显示,反之进行过滤。
|
||||
|
||||
## 内连接
|
||||
|
||||
### 等值连接
|
||||
|
||||
最大的特点是:`条件是等量关系。`
|
||||
SQL99:
|
||||
```sql
|
||||
Jion ... on:
|
||||
。。。
|
||||
表A
|
||||
(inner) Join
|
||||
表B
|
||||
On
|
||||
连接条件
|
||||
Where
|
||||
。。。
|
||||
```
|
||||
inner可省略,带inner可读性更好
|
||||
SQL99语法结构更清晰,表的连接条件和后来的where条件进行了分离
|
||||
|
||||
案例:查询每个员工部门名称,要求显示员工名和部门名
|
||||
|
||||

|
||||
|
||||
|
||||
### 非等值连接
|
||||
特点:来连接条件中的关系是非等量关系的。
|
||||
|
||||
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。
|
||||
|
||||

|
||||
|
||||
|
||||
### 自连接
|
||||
特点:一张表看作两张表,自己连自己
|
||||
|
||||
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名
|
||||
|
||||

|
||||
|
||||
## 外连接
|
||||
什么外连接,和内连接有什么区别。
|
||||
|
||||
内连接:
|
||||
> 假设A和B表进行连接,使用内连接连接,凡是A表和B表能匹配上的记录都查询出来,这是内连接,两张表是平等的,两张表没有主副之分。
|
||||
|
||||
外连接:
|
||||
> 假设A和B表进行连接,使用外连接连接,AB两个表有一个是主表,另一个是副表,主要查询主表中的数据,捎带查询副表中的数据,当副表中的数据没有和主表中的数据匹配上时,副表自动模拟出NULL与之匹配。
|
||||
|
||||
左外连接:左边的表是主表
|
||||
右外连接:右边的表是主表
|
||||
|
||||
右连接有左连接写法,左连接也有对应的左连接的写法。
|
||||
|
||||
> [!TIP]
|
||||
> 外连接最主要的特点是:主表中的数据全部无条件地显示出来
|
||||
|
||||
案例:找出每个员工的上级领导,没有的也要找出来。
|
||||
左连接:
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
Select
|
||||
字段。。。
|
||||
From
|
||||
表1
|
||||
Left / right (outer) join
|
||||
表2
|
||||
On
|
||||
条件
|
||||
outer (可以省略)
|
||||
```
|
||||
找出哪个部门没有员工;
|
||||
|
||||
逻辑:查找两个表中所有的元素,将部门(DEPT)作为主表,并进行筛选,将表中为NULL的元素全部删除,得出结果
|
||||
|
||||

|
||||
|
||||
## 三表联查
|
||||
|
||||
案例:找出每一个员工的部门名称以及工资等级
|
||||
|
||||

|
||||
|
||||
emp先和dept进行连接;再和salgrade连接
|
||||
|
||||
案例:找出每一个员工的部门名称以及工资等级,以及上级领导
|
||||
|
||||

|
||||
|
||||
## 多表查询注意事项
|
||||
多表查询原理:
|
||||
|
||||
在第一张表中拿到第一个字段,和第二张表中的所有指定字段进行匹配
|
||||
|
||||
**当多表查询时,最好为每个表取一个别名**
|
||||
好处:
|
||||
|
||||
> 执行效率高(不用取每张表中找指定的字段名)
|
||||
> 可读性好
|
||||
|
||||

|
||||
Binary file not shown.
|
After Width: | Height: | Size: 171 KiB |
@@ -0,0 +1,145 @@
|
||||
## 表的创建
|
||||
|
||||
建表语句:
|
||||
|
||||
```sql
|
||||
Create tables 表名(
|
||||
字段名1 数据类型,
|
||||
字段名2 数据类型 default 默认值,
|
||||
字段名3 数据类型,
|
||||
。。。
|
||||
);
|
||||
```
|
||||
|
||||
a
|
||||
|
||||
关于MySQL当中字段的数据类型,(常用的):
|
||||
|
||||
| 类型 | 描述 |
|
||||
| ---------------------------- | ------------------------------------------------------------ |
|
||||
| Char(长度) | 定长字符串,存储空间大小固定,适合作为主键或外键【最长255】 |
|
||||
| Varchar(长度) | 变长字符串,存储空间等于实际数据空间【最长255】 |
|
||||
| double(有效数字位数,小数位) | 数值型 |
|
||||
| Float(有效数字位数,小数位) | 数值型 |
|
||||
| Int( 长度) | 整型 |
|
||||
| bigint(长度) | 长整型【Java中Long】 |
|
||||
| Date | 日期型年月日 |
|
||||
| DateTime | 日期型年月日时分秒毫秒【对应Java中的java.sql.Date类型】 |
|
||||
| time | 日期型时分秒 |
|
||||
| BLOB | Binary Large OBject(二进制大对象)【存储图片,视频流媒体信息】 |
|
||||
| CLOB | Character Large OBject(字符大对象)【存储大文本,可存储4G的字符串】 |
|
||||
| 其它………………… | |
|
||||
|
||||
|
||||
|
||||
### char 和 varchar
|
||||
|
||||
char:
|
||||
|
||||
> 表示创建一个六个长度的字符空间,即使字符本身长度少于6,分配的空间依然是6;当长度超过指定的空间(6) 后,直接报错。
|
||||
|
||||
varchar:
|
||||
|
||||
> 也是创建一个长度是6的空间,长度超过指定长度依旧会进行报错,但是当长度小于指定时,**varchar会自动分配长度**【所以相对char效率较低】
|
||||
|
||||
|
||||
|
||||
> 当长度是固定的时,如:性别,生日(10位),日期(19位)。使用char效率更好;
|
||||
>
|
||||
> 当长度不固定时,如:自我介绍。可以使用varchar,可以提高存储效率。
|
||||
|
||||
|
||||
|
||||
BLOB数据不能直接进行传输,只能使用Java的io流进行传输,并且大文件一般放硬盘中,数据库中存储内存地址
|
||||
|
||||
|
||||
|
||||
表名在数据库中一般建议以:**t__ 或者 tbl__ 开始。**
|
||||
|
||||
|
||||
|
||||
## 插入数据
|
||||
|
||||
语法格式:
|
||||
|
||||
Insert into 表名(字段名1 ,字段名2 ,字段名3,。。。) values (值1 ,值2 ,值3,。。。)
|
||||
|
||||
要求:字段的数量和值的数量相同,并且数据类型要对应相同。
|
||||
|
||||
|
||||
|
||||
只指定一个数据其他不指定时,默认用NULL进行填充
|
||||
|
||||
|
||||
|
||||
一次插入多个数据:
|
||||
|
||||
Insert into 表名(字段名1 ,字段名2 ,字段名3,。。。) values
|
||||
|
||||
(值1 ,值2 ,值3,。。。),
|
||||
|
||||
(值1 ,值2 ,值3,。。。),
|
||||
|
||||
(值1 ,值2 ,值3,。。。);
|
||||
|
||||
|
||||
|
||||
插入一条数据:
|
||||
|
||||
 中的内容时:第二个括号中的数据必须和表格中的数据配列顺序匹配,反之报错
|
||||
|
||||
 values(9997,'zhangsan','MANAGER', null, '1981-06-12',3000, 500, 10);
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
#### 第二种方法,采用str_to_date
|
||||
|
||||
```sql
|
||||
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9996,'zhangsan','MANAGER',null,str_to_date('1981-06-12','%Y-%m-%d'),3000, 500, 10);
|
||||
```
|
||||
|
||||
|
||||
|
||||
)
|
||||
|
||||
```sql
|
||||
insert into emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values(9995,'zhangsan','MANAGER',null,now() ,3000, 500, 10);
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 表的复制
|
||||
|
||||
```sql
|
||||
Create table 表名 as DQL语句
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
Reference in new issue
Block a user