一.DDL,DML,DQL概念
DDL:数据库定义语言,操作数据库中对象,数据库,表,列
***创建数据库
create database 数据库名;# 以默认的编码创建数据库
create database 数据库名 charset 编码名;
create database 数据库名 character set 编码名;
***创建表
create table 表名(
字段1 数据类型(长度) [约束],
字段2 数据类型(长度) [约束]
);
约束:
主键约束:primary key,该列的值必须唯一,并且不为空
自动增长列约束:auto_increment 该列值交给数据库维护ps:几个约束:
主键约束:primary key
唯一约束:unique
非空约束:not null
默认约束:default 值
自动增长约束:auto_incrementDML:数据库操作语言,操作数据库表中数据,对数据进行增删改
****添加一条记录
insert into 表名 (列名1.列名2..) values (值1,值2..);
注意:
1.列名和后面的值 必须一一对应
2.(列名1.列名2..) 这里的列名可以写一个或者多个
3.如果要写全列名,可以省略不写
4.如果值是数字类型的可以不加'',否则必须加上'' 或者 ""
****删除一条记录
delete from 表名;# 删除表中所有数据,不会重置自动增长值
truncate table 表名;#删除表所有数据,先把表摧毁再重建
delete from 表名 where 条件;# 这里条件和查询共用
****修改一条记录
update 表名 set 字段名=值,字段名=值;#表中所有记录的字段都修改了
update 表名 set 字段名=值,字段名=值 where 条件;# 这里条件和查询共用DQL:数据库查询语言,操作数据库表中数据,对数据进行查询
***基本查询:
格式:select distinct *|字段1,字段2 from 表名;
***条件查询
比较条件
>,<,>=,<=,<>,=
between xx and xx (含头行尾)
in (值1,值2)
like '_a%' 模糊查询
is null ,is not null 判断空或者不空
逻辑条件
与 and
或 or
非 notps:乱码问题, 在DOS创建 查询uft8编码的数据库数据时,会出现乱码
解决方案:
临时方案:set names gbk;//临时地把告诉数据库 我们用gbk来查询
永久方案:修改 my.ini的配置文件(不建议)
二.查询
基本查询:不加条件的查询
条件查询:增加where条件的查询
排序查询: order by
select * from 表名 order by 字段名 ASC(默认)|DESC;
此处的字段,最好是有大小关系的,比如是数值,单文单词
聚合查询: 纵向查询,查询出的结果就一个
COUNT:统计个数,忽略NULL值
求数值类型
MAX:求最大值
MIN:求最小值
AVG:求平均值
SUM:求总和
分组查询: group by
select count(*)| sum(price) from 表名 group by 字段名 having 条件;
where和having区别:
where用于基本查询后数据过滤,针对的是一张表
having用于分组查询后的数据过滤,针对不同的组(表),而不是一张表
分页查询: limit 序号,记录数(索引从0开始)
查询第m页的n条记录
limit (m-1)*n,n
三.表关系
一对多(多对一)关系:
建表原则:有主表,有从表,从表必须有一个外键,引用到主表的主键ps:属于数据库第三范式,解决了一张表上的非主属性之间存在依赖关系,造成与主属性之间的传递依赖关系,通过分表在从表上建立外键与主表上的主键进行关联起来。(从表是多,主表是一)
多对多关系:
建表原则:通过一个中间表把多对多关系分成两个多对一关系。中间表至少三个字段
1.一个主键 2.两个外键(分别关联两张表)ps:属于数据库BCNF范式,解决主属性之间的传递依赖关系和不完全依赖关系,通过主属性之间构建中间表的形式,把多对多关系分成多对一关系,来解决的。
一对一关系:
一般我们建立一张表!总结:
不管是一对多还是多对多关系,都是处理了重复数据,冗余数据的问题,通过分表加外键关联可以解决。
四.表连接
交叉连接查询
语法:
select * from 表1,表2;
总字段 = 表1字段+表2字段
总记录数= 表1记录数*表2记录数
交叉查询是没意义的,实际上是一个笛卡尔积
内连接查询: inner join,以两个表的列为基础,任何一列都不能为null否则不会查询出来。
隐式内连接查询:不写关键字 inner join
select * from 主表,从表 where 主键.主键 = 从表.外键
显示内连接查询:写上关键字 inner join
select * from 主表 inner join 从表 on 主键.主键 = 从表.外键
外连接查询: outer join,以某一个表的列为基础,不能为空但是另一个表的列可以为空。
左外连接: left outer join
左外连接 以左表为准,左表中的数据必须每条都有
右外连接: right outer joinps:全连接是内连接和外连接进行集合的结果。详细:https://www.cnblogs.com/superAng/p/5607079.html
总结:
与表连接相对应的是子查询,区别是表连接会构造一个临时表,而子查询不会构造而是表里查询。
子查询分为:相关子查询和不相关子查询。
相关子查询:外查询的键与内查询的键构成了关系,会扫描n遍表。
不相关子查询:外查询的键与内查询的键无关系,只会扫描一遍表。