数据库笔记02

数据库笔记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',这个视时间的类型而言,主要是是否需要后面的时分秒;

上一篇:Python - 模块内省


下一篇:mybatis学习-02-增删改查