MySQL的增删改查2

MySQL的增删改查2

码农世界 2024-06-06 前端 104 次浏览 0个评论

文章目录

  • 1. 数据库约束
    • 1.1 约束类型
    • 1.2 NOT NULL约束
    • 1.3 UNIQUE唯一约束
    • 1.4 DEFAULT默认值约束
    • 1.5 PRIMARY KEY主键约束
    • 1.6 FOREIGN KEY外键约束
    • 1.7 CHECK约束
    • 2. 新增
    • 3. 查询
      • 3.1 聚合查询
        • 3.1.1 聚合函数
        • 3.1.2 GROUP BY子句
        • 3.1.3 HAVING
        • 3.2 联合查询
          • 3.2.1 内连接
          • 3.2.2 外连接
          • 3.2.3 自连接

            1. 数据库约束

            1.1 约束类型

            约束类型说明
            NOT NULL指定某列不能存储NULL值
            UNIQUE保证某列的每行必须有唯一的值
            DEFAULT规定没有给列赋值时的默认值
            PRIMARY KEY主键约束,是NOT NULL和UNIQUE的结合,确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
            FOREIGN KEY外键约束,外键用来保证一个表中的数据与另一个表的数据相关联,外键约束确保了表之间的引用完整性,即一个表中的外键列值必须在另一个表的主键列中存在。
            CHECK保证列中的值符合指定的条件

            1.2 NOT NULL约束

            在创建表时,可以指定某列不为空

            例如:指定序号不能为空,重新建立student表

            create table student(
            serial_number int not null,
            id int,
            age int,
            sex varchar(2),
            name varchar(32),
            qq_mail varchar(20)
            );
            

            1.3 UNIQUE唯一约束

            在创建表时,指定某一列为唯一的

            例如:指定学号为唯一的,重新重新创建学生表

            drop table if exists student;
            create table student(
            serial_number int not null,
            id int unique,
            age int,
            sex varchar(2),
            name varchar(32),
            qq_mail varchar(20)
            );
            

            1.4 DEFAULT默认值约束

            指定默认值

            例如:如果年龄为空,默认值为15

            drop table if exists student;
            create table student(
            serial_number int not null,
            id int unique,
            age int default 15,
            sex varchar(2),
            name varchar(32),
            qq_mail varchar(20)
            );
            

            1.5 PRIMARY KEY主键约束

            指定学号列为主键

            drop table if exists student;
            create table student(
            serial_number int not null,
            id int primary key,
            age int default 15,
            sex varchar(2),
            name varchar(32),
            qq_mail varchar(20)
            );
            

            1.6 FOREIGN KEY外键约束

            外键用于关联其他表的主键或唯一键.

            语法:

            foreign key (字段名) references 主表(列) 
            
            1. 创建班级表,学号为主键
            drop table if exists classes;
            create table classes(
            id int primary key,
            name varchar(20)
            );
            
            1. 创建学生表,学号为主键,班级号为外键,一个学生对应一个班级,一个班级对应多个学生。
            drop table if exists student;
            create table student(
            serial_number int not null,
            id int primary key,
            class_id int,
            age int default 15,
            sex varchar(2),
            name varchar(32),
            qq_mail varchar(20),
            foreign key(class_id) references classes(id)
            );
            

            1.7 CHECK约束

            在MySQL中无法使用check约束,但是使用不会报错。

            drop table if exists student;
            create table student(
            serial_number int not null,
            id int primary key,
            class_id int,
            age int default 15,
            sex varchar(2),
            name varchar(32),
            qq_mail varchar(20),
            check(sex = '男' or sex = '女'),
            foreign key(class_id) references classes(id)
            );
            

            2. 新增

            语法:

            INSERT INTO table_name [(column [, column ...])] SELECT ...
            

            示例:创建一张用户表,有姓名、性别、年龄、qq邮箱、手机号字段,将已有的学生数据复制进来

            drop table if exists user;
            create table user(
            id int primary key,
            name varchar(32),
            age int,
            qq_mail varchar(20),
            sex varchar(2),
            mobile varchar(20)
            );
            insert into user(name,age,sex,qq_mail) select name,age,sex,qq_mail from student;
            

            我真是不想再建表了

            3. 查询

            3.1 聚合查询

            3.1.1 聚合函数

            常见的聚合函数有:

            函数说明
            COUNT([DISTINCT] EXPR)返回查询到的数据的数量
            SUM([DISTINCT] expr)返回查询到的数据的总和
            AVG([DISTINCT] expr)返回查询到的数据的平均值
            MAX([DISTINCT] expr)返回查询到的数据的最大值
            MIN([DISTINCT] expr)返回查询到的数据的最小值

            注意:后四个使用时,不是数字没有意义。

            示例:

            1. COUNT

            统计班级一共有多少同学

            select count(*) from student;
            select count(0) from student;
            

            统计已知qq_mail有多少同学(不为NULL)

            select count(qq_mail) from student;
            
            1. SUM

            求班级数学成绩的总分

            select sum(math) from student;
            

            求数学成绩在80以上的学生的数学总分

            select sum(math) from student where math > 80;
            
            1. AVG

            求zhangsan同学的平均分

            select avg(math + chinese + english) from student where name = 'zhangsan';
            

            求全班的平均分

            select avg(math + chinese + english) from student;
            
            1. MAX

            返回数学最高分

            select max(math) from student;
            
            1. MIN

            返回数学最低分

            select min(math) from student;
            

            3.1.2 GROUP BY子句

            对指定列进行分组查询,将具有相同属性值的记录分组在一起,并对每个组进行聚合操作。

            满足条件:使用 GROUP BY 进行分组查

            询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函

            数中。

            3.1.3 HAVING

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

            例如:建立员工表

            create table employee(
            id int primary key,
            name varchar(32),
            sex varchar(2),
            depart varchar(50) comment '部门',
            salary int comment '薪水'
            );
             insert into employee(id,name,sex,depart,salary) values(1,'zhangsan','男','销售部',8000),(2,'lisi','男','技术部',12000),(3,'wangwu','女','行政部','15000'),(4,'zhaoliu','男','技术部',12500),(5,'qianqi','女','销售部',9000),(6,'xiaoba','男','行政部',15000);
            

            例题1:查询男女员工平均工资

            select sex,avg(salary) from employee group by sex;
            

            例题2:查询各部门的总工资

            select depart,sum(salary) from employee group by depart;
            

            例题3:查询姓名重复的员工信息

            select name from employee group by name having count(name) > 1;
            

            3.2 联合查询

            实际开发中往往数据来自不同的表,所以需要多表联合查询,需要对多张表取笛卡尔积。例如

            3.2.1 内连接

            语法

            select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
            select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
            

            例如:查询张三同学的成绩

            select sco.score from student stu inner join score sco on stu.id = sco.student_id and stu.name = '张三';
            

            或者

            select sco.score from student stu,score sco where stu.id = sco.student_id and stu.name = '张三';
            

            3.2.2 外连接

            外连接分为左外连接和右外连接。

            如果联合查询,左侧的表完全显示就称为左外连接;右侧的表完全显示就称为右外连接。

            语法:

            -- 左外连接,表1完全显示
            select 字段名  from 表名1 left join 表名2 on 连接条件;
            -- 右外连接,表2完全显示
            select 字段 from 表名1 right join 表名2 on 连接条件;
            

            例如:查询所有学生的成绩以及个人信息

            左外连接

            select *from student stu left join score sco on stu.id = sco.student_id;
            

            右外连接

            select *from student stu right join score sco on stu.id = sco.student_id;
            

            3.2.3 自连接

            即同一张表连接自身。

            例如:查询成绩表中,数学成绩高于英语成绩的信息

            SELECT
             s1.* 
            FROM
             score s1
             JOIN score s2 ON s1.student_id = s2.student_id 
             AND s1.score < s2.score 
             AND s1.course_id = 1 
             AND s2.course_id = 3;
            

            行了,连接这是不懵了,等我下篇会详细讲解,请点点关注期待我的下一篇文章

转载请注明来自码农世界,本文标题:《MySQL的增删改查2》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,104人围观)参与讨论

还没有评论,来说两句吧...

Top