数据库的增删查改(进阶)

打印 上一主题 下一主题

主题 1730|帖子 1730|积分 5190

1. 数据库的束缚

   束缚就是检查数据的合法性
  1.1 not null

  1. not null ,指列不能储存空值`在这里插入代码片`
复制代码


1.2 unique

  1. //每次插入修改前,都进行查询,若已经存在,则失败
  2. unique   , 指这一列所有行数据唯一(不可重复)
复制代码


1.3 default

  1. default ,规定没有给列赋值时的默认值(默认的默认值是null)
复制代码


1.4 primary key

  1. primary key ,主键,一条记录的身份标识,not null + unique
  2. //主键只能有一个,但是一个主键不一定只针对一个列
  3. //对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。
  4. //一般使用整数 id
复制代码



  • auto_increment


1.5 foreign key

  1. foreign key ,外键涉及到两个表之间的关系
复制代码



  • 若要删除表,要先删除子表,才气删除父表
  • 父表与子表之间相互束缚
  • 子表引用的父表的那一列要么是unique、要么是primary key
1.6 check

  1. check  ,指定条件,插入/修改数据,数据符合才插入/修改成功
  2. //通过check指定一个条件(gender = '男' or gender = '女')
复制代码
2. 表的设计通用步调及关系示例


表设计通用步调:

  • 辨认核心实体(如用户、商品、订单等)
  • 定义实体属性(如用户表需存储姓名、年事、手机号等)
  • 确定主键(唯一标识每条纪录的字段,如 user_id)
  • 分析实体关系(通过关系模型毗连不同表)

2.1 一对一关系

典型场景:一个实体严酷对应另一个实体
示例:用户表(user) ↔ 用户详情表(user_profile)
  1. -- 用户表(基础信息)
  2. CREATE TABLE user (
  3.   user_id INT PRIMARY KEY AUTO_INCREMENT,
  4.   username VARCHAR(50) NOT NULL,
  5.   phone VARCHAR(20) UNIQUE
  6. );
  7. -- 用户详情表(扩展信息)
  8. CREATE TABLE user_profile (
  9.   profile_id INT PRIMARY KEY,
  10.   address VARCHAR(100),
  11.   emergency_contact VARCHAR(20),
  12.   -- 外键指向user表
  13.   FOREIGN KEY (profile_id) REFERENCES user(user_id)
  14. );
复制代码
特点


  • 通过 user_id 直接关联
  • 适合拆分敏感字段或大字段(如个人详细地址)

2.2 一对多关系

典型场景:一个实体关联多个子实体
示例:部门表(department) ↔ 员工表(employee)
  1. -- 部门表
  2. CREATE TABLE department (
  3.   dept_id INT PRIMARY KEY AUTO_INCREMENT,
  4.   dept_name VARCHAR(50) NOT NULL
  5. );
  6. -- 员工表(多端)
  7. CREATE TABLE employee (
  8.   emp_id INT PRIMARY KEY AUTO_INCREMENT,
  9.   emp_name VARCHAR(50) NOT NULL,
  10.   -- 外键指向部门表
  11.   dept_id INT,
  12.   FOREIGN KEY (dept_id) REFERENCES department(dept_id)
  13. );
复制代码
特点


  • 在“多端”表(employee)中存储外键(dept_id)
  • 常见于层级布局(如电商中的分类 ↔ 商品)

2.3 多对多关系

典型场景:两个实体互相拥有多个关联
示例:弟子表(student) ↔ 课程表(course) ↔ 关联表(student_course)
  1. -- 学生表
  2. CREATE TABLE student (
  3.   stu_id INT PRIMARY KEY AUTO_INCREMENT,
  4.   stu_name VARCHAR(50) NOT NULL
  5. );
  6. -- 课程表
  7. CREATE TABLE course (
  8.   course_id INT PRIMARY KEY AUTO_INCREMENT,
  9.   course_name VARCHAR(50) NOT NULL
  10. );
  11. -- 关联表(中间表)
  12. CREATE TABLE student_course (
  13.   stu_id INT,
  14.   course_id INT,
  15.   -- 联合主键 + 外键约束
  16.   PRIMARY KEY (stu_id, course_id),
  17.   FOREIGN KEY (stu_id) REFERENCES student(stu_id),
  18.   FOREIGN KEY (course_id) REFERENCES course(course_id)
  19. );
复制代码
特点


  • 必须通过中间表(student_course)维护关系
  • 常见于标签系统(如博客 ↔ 标签)或订单商品关系

关系对比速查表
关系类型示例场景表数目外键位置典型SQL操作一对一用户-身份证2主表的主键作为外键JOIN ... ON a.id = b.id一对多部门-员工2在“多端”表中存储外键WHERE dept_id = ?多对多弟子-课程3中间表存储两边外键GROUP BY ... HAVING COUNT 3. 新增



  • 将查询的第一个结果插入到第二个表中

4. 查询

4.1 聚合查询

4.1.1 聚合函数

函数说明COUNT()返回查询到的数据纪录数目SUM()返回查询数据的数值总和(非数值类型无统计意义)AVG()返回查询数据的算术平均值(非数值类型无统计意义)MAX()返回查询数据集中的最大值(非数值类型无统计意义)MIN()返回查询数据集中的最小值(非数值类型无统计意义)

  • count()…

4.1.2 GROUP BY子句

MySQL 未指定排序时,按数据物理存储顺序或索引顺序读取第一条纪录

4.1.3 having

GROUP BY 子句举行分组以后,需要对分组结果再举行条件过滤时,不能利用 WHERE 语句,而需要用HAVING


  • 体现人数少于一人的

4.2 团结查询

实际开发中往往数据来自不同的表,所以需要多表团结查询。多表查询是对多张表的数据取笛卡尔积:
   笛卡尔积,就是两个表的纪录,分列组合
  

  • 笛卡尔的列数,两个表的列数和
  • 笛卡尔的行数,两个表的行数积
  团结查询:就是把表的数据变多,再变少
  1. create table classes
  2.         (
  3.                 id int primary key auto_increment,
  4.                 name varchar(20) default'unkown',
  5.                 `desc` varchar(20)
  6.         );
复制代码
  1. create table student
  2.         (
  3.                 id int primary key auto_increment,
  4.                 sn int unique,
  5.                 name varchar(20) default'unkown',
  6.                 qq_mail varchar(20),
  7.                 classes_id int,
  8.                 foreign key (classes_id) references classes(id)
  9.         );
复制代码
  1. create table course
  2.         (
  3.                 id int primary key auto_increment,
  4.                 name varchar(20)
  5.         );
复制代码
  1. create table score
  2.         (
  3.                 id int primary key auto_increment,
  4.                 score decimal(3,1),
  5.                 student_id int,
  6.                 course_id int,
  7.                 foreign key(student_id) references student(id),
  8.                 foreign key (course_id) references course(id)
  9.         );
复制代码
创建的四张表:

4.2.1 内毗连

   四步走:
  

  • 举行笛卡尔积
    select * from 表1,表2;
  • 添加毗连信息,去除无用信息
    select * from 表1,表2 where 毗连条件;
  • 添加其他条件,举行信息筛选
    select * from 表1,表2 where 毗连条件 and 其他条件;
  • 精简列,去除无用列
    select 字段 from 表1,表2 where 毗连条件 and 其他条件;
  示例:

  • 查询 “许仙”的成绩








  • 法二:利用 join…on…



  • 查询全部同学的总成绩及同学的个人信息

  • 查询全部同学的成绩,及同学的个人信息:

4.2.2 外毗连

外毗连分为左外毗连和右外毗连。如果团结查询,左侧的表完全体现我们就说是左外毗连;右侧的表完全体现我们就说是右外毗连。

   若两张表完全重合,内外毗连一个意思
若两张表只有一部分重合,外毗连就是交集
  

4.2.3 自毗连

   自毗连是指在同一张表毗连自身举行查询(自己和自己举行笛卡尔积)。
  

  • 体现全部“计算机原理“成绩比”]ava”成绩高的成绩信息

4.2.4 子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询


  • 查询与“不想结业” 同学的同班同学:

  • 查询“语文”或“英文”课程的成绩信息

4.2.5 合并查询



  • 查询id小于3,或者名字为“英文”的课程:



  • 查询id小于3,或者名字为“Java”的课程


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表