数据库笔记02
ps:本文章只是自己的笔记,不喜勿喷;若发现问题还请私信我,谢谢
查询去重
这个其实是查询不做修改,关键字distinct
,distinct只能放在最前面(多个字段查询的时候,含有distinct的字段的需要放在最前面)
语法:
select distinct 字段名1,字段2.....from 表名;
其可能可以实现多个字段的去重。(”可能“是个人觉得)
连续查询(多表查询)
-
按照年段分:SQL92,SQL99;
-
按照连接方式:内连接(等值连接,非等值连接,自连接);外连接(左外连接,右外连接);全连接
-
当两张表进行连接查询的时候,没有任何条件限制,最终查询的结果的条数为两张表条数的积,这种现象被“笛卡尔乘积”,这个现象在离散中提到过。
避免手段:通过加上限制条件来进行解决,但是匹配的次数没有减少,它仍然会进行单个单个的匹配
-
语法(sql92)
select ...from 表1,表2 where 表连接的条件;
这种语法中会将表连接的条件和查询的条件都放在where中,很有可能将这两者混淆,所以一般不建议用这种写法,推荐使用SQL99语法
-
为了提高效率推荐将表起别名;并且通过表来查询表中对应的字段,否则那么就会在每个表中进行查找,这样可以提高效率,如:
(表名.字段)
。
内连接
特点:满足某一条件进行筛选出来。
等值连接
筛选条件是通过两张表中对应的数值相等来进行表连接,故叫“等值连接”
SQL99语法(下同):
select ....
from
表名1
join
表名2
on
表连接的条件(这里为两张表中字段对应的值相等,如:table1.name=table2.name)
where
查询的筛选的条件;
非等值连接
与上面的定义相反
这种的筛选条件一般为某一个范围,通过表的字段对应的值来进行实现,如:table1.sal>=table2.under and table1.sal<=table2.up
自连接
所谓自连接其实也就是将一张表抽象为两张表来看,通俗的理解就是:自己连接自己
ps:一张表可以取不同的别名
外连接
这个其实就是分了一下表的主次关系,将一张表作为主表,在查询主表的过程中捎带的去查询那张副表,这种情况下主表的所有记录(row)都是会被查询完的。
主表在join的那一侧就看情况使用left
right
,通过left以及right来判断是右外连接还是左外连接
外连接的特点:两张表产生了主次关系
3张表or多张表的连接
语法:
select
....
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
......
where
筛选条件;
先a和b连接,然后和c连接.........
注:一条SQL语句中可以内外连接交替出现。
子查询
select语句中嵌套的有select语句(下面为个人理解)
- while后面嵌套的有select语句(先会子查询),这种通常是一个值
- from后面通常是接的表名,所有在from后面跟select语句的话查询结果通常是一个表
- select后面嵌套select语句,注:后面查询的select语句查询结果只能对应一条结果,不能返回多个结果,否则就会报错
union合并
-
即将两条select查询的结果进行表的合并,通过“
union
”这个关键字进行连接。 -
语法格式:
select 字段1,字段2....from table1 union select 字段1,字段2...from table2;
当然也可以加筛选条件where等其他语句
-
使用union关键字注意:字段数目(即column)需要相同;在MySQL中数据类型可以不同,但是在Oracle中数据类型也需要相同。
-
使用union关键字可以提高效率,在进行表连接的时候可以使匹配次数减少。
limit
实现查询的时候可以限制查询的结果条数;可以实现分页操作。
语法:
select
......
from
....
where
.....
limit(start,length);
limit存在两个参数一个起始,一个长度。注:此处起始位置为0
limit通常放在最后面,在order by的后面
分页的公式:limit(pagesize*(pagecont-1),pagesize)
建表
建表的语法:(属于DDL语句)
create table 表名(字段1 数据类型,字段2 数据类型,......);
同时也可以在数据类型的后面加上default 默认值
,这样不指定值的时候就会使用这个default
要求:表名,字段见名知意即可
mysql中的常见的数据类型
类型 | 释&注 |
---|---|
varchar | 可变的字符串,会动态的分配空间;在使用的过程中需要指定长度,否则就会报错;maxlength=255 |
char | 不可变的字符串;maxlength=255 |
int | 整型;maxlength=11 |
bigint | 长整型 |
float | 单精度 |
double | 双精度 |
date | 短日期;不包括时分秒 |
datetime | 长日期;包括时分秒 |
clob | 字符大对象;最多可以存储4G的字符串 |
blob | 二进制大对象;可以存储图片.....;往blob型中插入图片,需要使用i/o流 |
删表
语法:
drop table 表名;
表不存在是会报错
新的写法:
drop table if exists 表名;
这样即使不存在也不会报错
insert语句
属于DML语句,语法:
insert into 表名(字段名......) values (对应的值);
字段数和值需要一一对应,且数据类型也需要相同
注:insert语句执行成功后就会向表中添加一条记录,当其他字段不存在时就会使用默认值
update语句
属于DML语句,语法:
update 表名 set 字段1=值,字段2=值,.......where 条件(及判断修改的条件);
注:必须加上筛选条件,否则就会将整张表的数据进行修改
delete语句
同样属于DML语句,语法:
delete from 表名 where 删除记录的条件;
注:必须加上筛选条件,否则整张表数据就会被删除
杂谈
-
format
:设置千分位;两个参数,一个是字段,一个是格式 -
str_to_date
:字符串转日期格式;两个参数,一个被转的字符串,一个是转化为日期的格式的字符串 -
date_format
:日期格式化;两个参数,一个当前的表中日期类型的字段,一个是转化的对应的日期格式 -
MySQL中日期的语法格式:%y %m %d %h %i %s,分别对应“年月日时分秒”
-
当字符串的格式是:'%y-%m-%d',这样可以不用str_to_date函数
-
在MySQL中一般会默认实现date类转varchar类
-
now()函数可以获取当前系统的时间
-
完整时间写法:'%y-%m-%d %h:%i:%s',这个视时间的类型而言,主要是是否需要后面的时分秒;