MySQL

分组查询

注意分组之后只能加上分组的字段还有聚合函数,因为加上其他字段是没有意义的

select sex,avg(math) from student group by sex;

限定分组前的条件:在group by之前使用where限定。

限定分组之后的条件:having 

select sex,avg(math) from student where math>70 group by sex having count(id)>2;

查询在数学成绩大于70分的人中按照性别分组并且每个组人数大于2

where和having的区别

 1、where在分组之前进行限定,如果不满足条件就不准参与分组,having在分组之后进行限定,如果不满足结果就不会被查询出来。

 2、where不能后面跟上聚合语句,having之后可以跟上聚合语句

分页查询

语法:limit,开始索引,每页查询的数

select * from student limit 0,3;
select * from student limit 3,3;

公式,开始的索引当前的页码减去1,再成每页显示的条数。

select 字段列表
from表
where条件列表
group by分组字段
having分组之后的限定
order by 排序
limit 条件限定

模糊查询

占位符    "_"任意单个字符  "%"任意多个字符(0个也是可以的)

select * from student where name like '马%'

查询姓马的

查询名字是三个字的人三个"_"

select * from student where name like '___'

约束

(对表中的数据进行限定,保证数据的有效性和完整性)

分类:主键约束、非空约束,唯一约束(索引),外键约束

非空约束:not null 表示值不能是空的

创建表时候添加约束

create table stu(
  id int,
  name varchar(20) not null  --非空约束
);

删除约束

alter table stu modify name varchar(20);

创建表之后添加约束

alter table stu modify name varchar(20) not null;

唯一约束:unique,表示值不能重复(null值 是可以重复的)

create table stu(
  id int ,
  phone_number varchar(20) unique
)

删除

alter table stu drop index phone_number;

创建表之后添加唯一约束

alter table stu modify phone_number varchar(20) unique;


主键约束:primary key 

1、表示非空且唯一

2、一张表只能有一个主键约束

3、主键就是表中的唯一标识

创建表时候添加主键约束

create table stu(
  id  int primary key auto_increment,   -- 表示自增长
  name varchar(20)
)

删除主键约束

alter table stu drop primary key

删除自动增长

alter table stu modify id int  -- 注意因为主键约束使用这个是不能直接删除的,所以这个可以用来删除自增长

添加自增长(通常和主键一起使用)

alter table stu modify id int auto_increment

添加主键约束

alter table stu modify id int primary key


外键约束:foreign key

  1.在创建表时候可以添加外检约束

    create table 表名(

      constraint 外键名称 foreign key 外键列名 references 主表名称(主表列名称)

    )

    create table employee(
      id int primary key auto_increment,
      name varchar(20),
      age int ,
      dep_id int , --外键对应主表的主键
      constraint emp_dept_fk foreign key(dep_id) reference department(id) on update cascade--设置及联更新操作
    )

这里不能直接删除department表,因为有其他表引用这个表。外键可以是null但是不能是不存在的值

删除外键

alter table employee drop foreign key emp_dept_fk;

创建表之后添加外键

alter table employee add constraint emp_dept_fk foreign key (dep_id) references department(id);

级联操作,添加外键的时候设置级联(谨慎使用,特别是级联删除,使用之前好好考虑)

部门id改变,引用department表的表中也需要修改

constraint emp_dept_fk foreign key(dep_id) reference department(id) on update cascade--设置及联操作

级联删除

constraint emp_dept_fk foreign key(dep_id) reference department(id) on delete cascade--设置及联删除操作

注意被引用中删除行,对应引用表中引用的就会被删除。


数据库的设计

1.多表之间的关系

  1.一对一关系:人和身份证 一个人只能有一个身份证,一个身份证只能对应一个人

    可以在任意的一方添加外键,指向另一方。并且让外键唯一,给外键添加唯一约束unique(直接合成一张表)

  2.一对多或者多对一关系:部门和员工,一个部门有多个员工,一个员工只能对应一个部门。

    实现方式:在多的一方建立外键指向一的一方的主键

  3.多对多的关系:学生和课程之间的关系。

    实现方式:通过中间表实现,中间表至少有两个字段,这两个字段分别指向两个表的主键,这两个字段分别作为两个外键,指向两张表的主键,这两个就是联合主键,

案列,旅游项目中

分类表->路线表  一对多

分类表

create category(

  cid int primary key auto_increment,

  cname varchar(100) not null unique

)

线路表

create tab_route(

  rid int primary key auto_increment,

  rname varchar(100) not null unique,

  price doublel,

  rdate date,

  cid int ,

  foreign key (cid) reference category(cid)

)

用户表

create tab_user(

  uid int primary key auto_increment,

  username varchar(100) unique not null,

  password varchar(30) not null,

  name varchar (100) ,

  birthday date,

  sex varchar(1) default  '',

  telephone varchar(11),

  email varchar(100)

)

路线表->用户表 多对多

创建中间表favorite

create tab_favorite(

  rid int ,

  date datetime,

  uid int ,

  primary key(rid,uid),--联合主键

  foreign key (rid) references tab_route(rid),

  foreign key(rid) references tab_user(uid)

)

2.数据库设计的范式

第一范式:每列都是不可分割的原始数据

第二范式:在及第一范式的基础上, 非码属性必须完全依赖码属性(消除非主属性对主码属性的部分依赖)

  函数依赖:如果通过A的属性的值可以确定

  完全函数依赖:如果A是一个属性组,则B属性值的确定完全依赖A属性中所有的属性值

   部分函数依赖:如果A是一个属性组,B属性的确定只需要A中的某一个确定

  传递函数依赖:通过A属性确定B属性,由B属性确定C

  码:字啊一张表中,如果一个属性或属性组,被其他所有属性完全依赖,就成这个属性是这个表的码

    码属性:属性组中的所有属性

    非码属性:除上面之外的。

第三范式:在二范式的基础上消除传递依赖,(这样就不会因为某个行的删除,对应系也会删除)

满足第一范式(属性不可分割)下面表中的码是学号和课程名

 

 满足第二范式(非码属性完全依赖码属性)

 满足第三范式(上面系主任依赖系名,系名依赖学号,删除学生对应的系和主任也会删除。)


数据库的备份

命令行:

  语法:mysqldump -u用户名 -p密码  数据库名称> 保存路径

  还原:登录数据库,创建数据库,使用数据库,执行文件source文件的路径

    语法:source 上面保存文件的路径。

图形化工具:右键导出,右键执行sql脚本

原文地址:https://www.cnblogs.com/feixiangdecainiao/p/10759162.html