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来判断是右外连接还是左外连接
外连接的特点:两张表产生了主次关系
语法:
select .... from a join b on a和b的连接条件 join c on a和c的连接条件 ...... where 筛选条件;
先a和b连接,然后和c连接.........
注:一条SQL语句中可以内外连接交替出现。
select语句中嵌套的有select语句(下面为个人理解)
即将两条select查询的结果进行表的合并,通过“union
”这个关键字进行连接。
语法格式:
select 字段1,字段2....from table1 union select 字段1,字段2...from table2;
当然也可以加筛选条件where等其他语句
使用union关键字注意:字段数目(即column)需要相同;在MySQL中数据类型可以不同,但是在Oracle中数据类型也需要相同。
使用union关键字可以提高效率,在进行表连接的时候可以使匹配次数减少。
实现查询的时候可以限制查询的结果条数;可以实现分页操作。
语法:
select ...... from .... where ..... limit(start,length);
limit存在两个参数一个起始,一个长度。注:此处起始位置为0
limit通常放在最后面,在order by的后面
分页的公式:limit(pagesize*(pagecont-1),pagesize)
建表的语法:(属于DDL语句)
create table 表名(字段1 数据类型,字段2 数据类型,......);
同时也可以在数据类型的后面加上default 默认值
,这样不指定值的时候就会使用这个default
要求:表名,字段见名知意即可
类型 | 释&注 |
---|---|
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 表名;
这样即使不存在也不会报错
属于DML语句,语法:
insert into 表名(字段名......) values (对应的值);
字段数和值需要一一对应,且数据类型也需要相同
注:insert语句执行成功后就会向表中添加一条记录,当其他字段不存在时就会使用默认值
属于DML语句,语法:
update 表名 set 字段1=值,字段2=值,.......where 条件(及判断修改的条件);
注:必须加上筛选条件,否则就会将整张表的数据进行修改
同样属于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',这个视时间的类型而言,主要是是否需要后面的时分秒;