数据库的基本操作(期末复习大全)

数据库的基本操作

一、数据库的创建

语法格式:create database 数据库名;
例如:创建一个数据库 xxgc
在这里插入图片描述

查看数据库

语法格式:show databases;
数据库的基本操作(期末复习大全)_第1张图片
如果想要查看已经创建好的数据库:例如查看已经创建好的数据库xxgc的信息
语法格式:show create database 数据库名;
数据库的基本操作(期末复习大全)_第2张图片
显示的就是数据库xxgc的创建信息和编码方式

修改数据库编码方式

数据库创建好之后,数据库的编码方式就确定了。
修改数据库的编码方式:语法格式:alter database 数据库名 default character set 编码方式 collate 编码方式_bin;
例如:将数据库xxgc的编码方式改为gbk编码:
alter database xxgc default character set gbk collate gbk_bin;
在这里插入图片描述
数据库名就是要修改数据库的名字,编码方式就是要修改的编码方式。
为了验证数据库的编码格式是否修改成功,使用语句查看:show create database 数据库名; 查看
例如:查看数据库xxgc 数据库的编码方式是否成功。语法格式:show create database xxgc;
数据库的基本操作(期末复习大全)_第3张图片

数据库的删除

语格式:drop database 数据库名;
例如:删除数据库xxgc 。语法格式:drop database xxgc;
数据库的基本操作(期末复习大全)_第4张图片
此时查看数据库就没有了xxgc这个数据库了。

二、数据表的基本操作

创建数据表事前要先进入数据库
语法格式:use 数据库名;
例如:先创建数据库xxgc,然后进入数据库。
数据库的基本操作(期末复习大全)_第5张图片

然后就可以创建数据表了。

创建数据表

语法格式:create table 数据表名(字段名 数据类型,字段名 数据类型…);
例如创建一个数据表teacher,用于存储老师的基本信息
语法:create table teacher (id int, name carchar(20), email varchar(30));
在这里插入图片描述

查看数据表

查看数据表的数据结构

语法:desc 数据表名;
例如查看数据表 teacher 的数据结构
语法:desc teacher;
数据库的基本操作(期末复习大全)_第6张图片

查看数据库里面有哪些数据表

语法:show tables;
例如查看数据库xxgc里面有哪些数据表
数据库的基本操作(期末复习大全)_第7张图片

修改数据表

修改数据表名

语法结构:alter table 旧表名 rename 新表明;
例如将数据表teacher 修改成 xxgc_teacher
在这里插入图片描述
修改好之后,在来查看数据表结构
数据库的基本操作(期末复习大全)_第8张图片

修改数据表字段名和数据类型

语法:alter table 表名 change 旧字段名 新字段名 新数据类型;
其中旧字段名是修改之前的字段名,新字段名是修改之后的字段名,新数据类型是修改后 新字段的数据类型(这里不能为
空),如过数据类型不想改变,那就将数据类型设置为原来的数据类型

例如:将xxgc_teacher 数据表中的id 改为 teacher_id,数据类型不变
数据库的基本操作(期末复习大全)_第9张图片

修改数据表字段的数据类型

语法:alter table 表名 modify 字段名 新数据类型;

例如:将xxgc_teacher 数据表中的 teacher_id 的数据类型改变为 varchar(20);
alter table xxgc_teacher modify teacher varchar(20);
数据库的基本操作(期末复习大全)_第10张图片

在创建好的数据表中添加新字段

语法:alter table 表名 add 新字段名 数据类型[约束条件] ;
例如:在xxgc_teacher 数据表中添加字段没有约束条件的age,数据类型为int。
数据库的基本操作(期末复习大全)_第11张图片

删除字段

语法:alter table 表名 drop 字段名;
例如:删除xxgc_teacher 数据表中的age字段
数据库的基本操作(期末复习大全)_第12张图片

修改字段的位置

语法:alter table 表名 modify 字段名1 新数据类型 first | after 字段名2;
其中first 是可选参数,用于将字段名1设置为第一个字段,after 也是可选参数,用于将字段名1移动到字段名2后面。此命令可以同时修改数据类型和位置,如果不想修改数据类型就将型数据类型设置为原来的数据类型。

例如:将xxgc_teacher表中的name设置为第一个字段
alter table xxgc_teacher modify name varchar(15) first;
数据库的基本操作(期末复习大全)_第13张图片

例如:将xxgc_teacher表中的name移动到email的后面
alter table xxgc_teacher modify name varchar(15) after email;
数据库的基本操作(期末复习大全)_第14张图片

删除数据表

语法:drop table 数据表名;
例如:将数据库中的xxgc数据表删除
1、查看数据库中有哪些数据表
语法:show tables;
数据库的基本操作(期末复习大全)_第15张图片

2、删除数据表
语法:drop table xxgc_teacher;
数据库的基本操作(期末复习大全)_第16张图片

三、数据表的约束

主键约束primary key

primary key 是 not null 和 unique 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录

单字段主键primary key

创建表时指定主键

语法:create table 数据表名(字段名 数据类型 primary key);
例如:创建表company表,并设置company_id字段为主键
语法:
create table company(company_id int primary key,
company_name varchar(20),
company_address varchar(200)
);
数据库的基本操作(期末复习大全)_第17张图片

给创建好的数据表添加主键约束

语法:alter table 数据表名 modify 字段名 数据类型 primary key ;
例如:给创建好的company表中的company_id添加主键约束
1、先将company表删除
语法:drop table company;
数据库的基本操作(期末复习大全)_第18张图片

2、在创建company表
语法:create table company(company_id int,
company_name varchar(20),
company_address varchar(200)
);

数据库的基本操作(期末复习大全)_第19张图片
此时company_id还没有添加主键
3、给company_id添加主键
语法:alter table company modify company_id int primary key;
数据库的基本操作(期末复习大全)_第20张图片

删除主键约束

语法:alter table 数据表名 drop primary key;
例如:删除company中company_id的主键约束
数据库的基本操作(期末复习大全)_第21张图片

复合主键复合主键primary key

复合主键指由多个字段组成

创建表时指定复合主键

**语法:create table 数据表名( 字段1 数据类型,字段1 数据类型,…,primary key(字段1 ,字段2,…)); **

例如创建sales表,设置product_id,region_code字段为复合主键。
语法:create table sales(product_id int,
region_code varchar(20),
quantity int,
price float,
primary key(product_id,region_code));

数据库的基本操作(期末复习大全)_第22张图片

在创建好的表中添加复合主键

语法:alter table 数据表名 add primary key(字段名1,字段名2,…);

例如:在创建好的sales表中添加复合主键
1、先将数据表sales删除
语法:drop tables sales;
在这里插入图片描述

2、在创建数据表sales
语法:create table sales (product_id int,
region_code varchar(20),
quantity int,
price float,
);

数据库的基本操作(期末复习大全)_第23张图片
3、添加复合主键
语法:alter table sales add primary key(product_id,region_code);
数据库的基本操作(期末复习大全)_第24张图片

删除复合主键

语法:alter table 数据表名 drop primary key;
例如:删除sales中的复合主键
语法:alter table sales drop primary key;
数据库的基本操作(期末复习大全)_第25张图片

外键约束

1.定义
外键用来在两个表的数据之间建立链接,它可以是一列或者多列;一个表可以有一个或多个外键。

外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。

外键是表的一个字段,不是表的主键,但对应另一个表的主键;定义外键后,不允许删除另一个表中具有关联关系的行。

主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表;

从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。

被指向的实体,称之为主实体(主表),也叫父实体(父表)

负责指向的实体,称之为从实体(从表),也叫子实体(子表);

若‘表1’的一个列既是主键又是外键,而这个外键约束又对应另一个表‘表2’的主键,那么‘表1’和‘表2’就可以合并起来了

2.作用:
外键的主要作用是保持数据的一致性、完整性。

如果主表没有相关的记录,从表不能插入;

更新时,不能改为主键表中没有的值;

删除主键表记录时,可以在建外键时选定外键记录一起级联删除还是拒绝删除;同样有级联更新和拒绝更新的选择。

ON DELETE CASCADE 级联删除

ON UPDATE CASCADE 级联更新

创建表时添加外键约束foreign key

语法:constraint 外键名 foreign key (从表的外键字段名) references 主表名 (主表的主键字段名)
其中,外键名 是指从表创建外键约束的名字

例如:创建两个表员工表emp和部门表dept,并且在员工表上面添加外键
注意:创建表的时候,一定是要先创建主表,在创建从表
1、先创建主表
语法:create table dept(id int primary key, name varchar(20), locaton varchar(20), descrip varchar(20) );
数据库的基本操作(期末复习大全)_第26张图片
2、在创建从表
语法:create table emp(id int primary key, name varchar(20), dept_id int, salary float, constraint fk_emp_dept foreign key(dept_id) references dept(id) );
数据库的基本操作(期末复习大全)_第27张图片

在创建好的表添加外键约束

语法:
alter table 从表名 add constraint 外键名 foreign key (从表的外键字段名) references 主表名(主表的主键字段名) ;
在创键好的员工表emp 和 部门表dept,为员工表添加外键
1、先删除员工表和部门表
drop table emp; drop table dept;
数据库的基本操作(期末复习大全)_第28张图片
2、在创建部门表dept
create table dept(id int primary key, name varchar(20), locaton varchar(20), descrip varchar(20) );
数据库的基本操作(期末复习大全)_第29张图片
创建员工表emp
create table emp(id int primary key, name varchar(20), dept_id int, salary float );
数据库的基本操作(期末复习大全)_第30张图片

3、在给从表添加外键约束
语法:alter table emp add constraint fk_emp_dept foreign key(dept_id) references dept(id);
数据库的基本操作(期末复习大全)_第31张图片

删除外键约束

语法:alter table 从表名 drop foreign key 外键名;
例如:删除emp的外键约束
语法:alter table emp drop foreign key fk_emp_dept;
数据库的基本操作(期末复习大全)_第32张图片
注意:此时明明已经删除了,,但是为什么还是看见外键还在,这是因为MySQL创建外键之后,会创建一个同名的索引,外键删除,索引不会删除

非空约束not null

非空约束指字段的值不能为空。在同一个数据表中可以定义多个非空字段。

创建表时添加非空约束

语法:create table 数据表名(字段名 数据类型 not null,字段名 数据类型 not null,…);
注意:此时是给字段添加非空约束,也可以不加!
例如:创建一个表company,并设置company_id为主键,company_address为非空主键。
语法:create table company(company_id int primary key, company_name varchar(20), company_address varchar(200) not null );
数据库的基本操作(期末复习大全)_第33张图片
此时看见标记处为NO代表不能为空

在给创建好的表添加非空约束

语法:alter table 数据表名 modify 字段名 数据类型 not null;
例如:给创建好的company数据表字段company_name添加非空约束
语法:alter table company modify company_name varchar(20) not null;
数据库的基本操作(期末复习大全)_第34张图片

删除非空约束

语法:alter table 数据表名 modify 字段名 数据类型;
例如:删除数据表company中company_name的非空约束;
语法:alter table company modify company_name varchar(20);
数据库的基本操作(期末复习大全)_第35张图片

唯一约束unique

唯一约束表示该列中只有唯一的值 ,不能重复(就像身份证一样不能重复)

在创建表时添加唯一约束

语法:create table 数据表名(字段名 数据类型 unique,字段名 数据类型 unique,…);
例如:创建一个表company,并设置company_id为主键,company_address为唯一约束。
语法:create table company(company_id int primary key, company_name varchar(20), company_address varchar(200) unique );
数据库的基本操作(期末复习大全)_第36张图片

在创建好的表里添加唯一约束

语法:alter table 数据表名 modify 字段名 数据类型 unique;
例如:给创建好的company数据表字段company_name添加唯一约束
语法:alter table company modify company_name varchar(20) unique;
数据库的基本操作(期末复习大全)_第37张图片

删除唯一约束

语法:alter table 数据表名 drop index 字段名;
例如:删除数据表company中company_name的唯一约束;
语法:alter table company drop index company_name;
数据库的基本操作(期末复习大全)_第38张图片

默认约束default

如果将数据表的某一列的值设置为默认约束,在用输入新的数据时,没有为这一列添加数据是,此时的默认的值就是默认值,也可是null。

创建表时添加默认值

语法:create table 数据表名(字段名 数据类型 default 设置的默认值,…);
例如:创建一个表company,并设置company_id为主键,company_address为默认值“www.aaa”。
语法:create table company(company_id int primary key, company_name varchar(20), company_address varchar(200) default 'www.aaa' );
数据库的基本操作(期末复习大全)_第39张图片

在创建好的表添加默认值

语法:alter table 数据表名 modify 字段名 新数据类型 default ‘设置的默认值’;
例如:给创建好的company数据表字段company_name添加默认约束
语法:alter table company modify company_name varchar(15) default '999';
数据库的基本操作(期末复习大全)_第40张图片

删除默认约束

语法:alter table 数据表名 modify 字段名 数据类型;
例如:给创建好的company数据表字段company_name删除默认约束。
语法:alter table company modify company_name varchar(15);
数据库的基本操作(期末复习大全)_第41张图片

设置表的字段值自动增加(自增主键)auto_increment

在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长

注意:
默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
一个表中只能有一个字段使用 auto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
auto_increment 约束的字段必须具备 NOT NULL 属性。
auto_increment 约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等)。
auto_increment 约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment 就会失效。

在创建表时添加自增主键

语法:create table 数据表名(字段名 数据类型 auto_increment,…);
例如:创建一个表company,并设置company_id为主键,company_id为自增主键。
语法:create table company(company_id int primary key auto_increment, company_name varchar(20), company_address varchar(200) );
数据库的基本操作(期末复习大全)_第42张图片

在创建好的表添加自增主键

语法:alter table 数据表名 modify 字段名 数据类型 auto_increment;
例如:给创建好的company数据表字段company_id添加自增主键
语法:alter table company modify company_id int auto_increment; 数据库的基本操作(期末复习大全)_第43张图片

删除自增主键

语法:alter table 数据表名 modify 字段名 数据类型;
给创建好的company数据表字段company_id删除自增主键。
语法:alter table company modify company_id int;
数据库的基本操作(期末复习大全)_第44张图片

四、数据表内容的基本操作

数据表的插入操作 insert

插入单行数据

语法:insert into values [(字段名,字段名,…)](列表值,列表值,…);
注意[ ] 中括号里面的是参数,可有可无,依据情形来判断
例如:创建一个数据表student,添加字段sid 学生id,sname 学生姓名,sgender 学生性别,sbirth 学生出生年月,sclass 学生班级。
1、先创建学生表
语法:create table student(sid int, sname varchar(20), sgender varchar(5), sbirth datetime, sclass varchar(30) );
数据库的基本操作(期末复习大全)_第45张图片
2、插入单行数据([ ]此时中括号里面没有参数)
插入学生“张三”
语法:insert into student values(1, '张三', '男', '2021-01-01', 'java102');
数据库的基本操作(期末复习大全)_第46张图片
通过select 语句可以查询表的内容: select * from 数据表名;
语法:select * from student;
数据库的基本操作(期末复习大全)_第47张图片
3、插入单行数据([ ]此时中括号里面有参数)
插入一个王二
语法:insert into student(sid,sname) values(2, '王二');
注意:此时没有插入数据的都为默认值
数据库的基本操作(期末复习大全)_第48张图片

插入多条记录

同时插入李四和小芳
语法:insert into student values(3, '李四', '男', '2021-01-01', 'java108'), (4, '小芳', '女', '2001-11-11', 'java105');
在这里插入图片描述
此时每条记录之间要用(),();这样的方式插入
数据库的基本操作(期末复习大全)_第49张图片

数据表的记录修改操作update

MySQL中使用update来修改数据表的记录

语法:update 数据表名 set 字段名=value where 条件表达式;
注意:此时value的值是修改后的值,value的值可以是表达式

例如;将学生表中王二的性别改为“男”
语法:update student set sgender = '男' where sname = '王二';
数据库的基本操作(期末复习大全)_第50张图片

注意:如果没有条件表达式的话,那就是将字段名这一列的值都设置为“男”

例如:将性别这一列设置为“女”
语法:update student set sgender = '女';
在这里插入图片描述

数据表记录的删除delete(删除一条记录)

语法:delete from 数据表名 where 条件表达式;
例如:删除数据表中张三这条记录
语法:delete from student where sname = '张三';
数据库的基本操作(期末复习大全)_第51张图片

数据表记录的删除delete(删除全部记录)

语法:delete from 数据表名;
例如:删除数据表student中所有记录
语法:delete from student;
数据库的基本操作(期末复习大全)_第52张图片

使用truncate删除数据表中所有数据

语法:truncate table 数据表名;
例如:删除学生表中所有数据;
1、先在数据表中增加数据
2、然后在使用truncate删除数据:truncate table student;
数据库的基本操作(期末复习大全)_第53张图片

五、数据查询select(重点)

MySQL中使用最多的就是数据查询,所以这是重点

这是我们接下使用到的数据

insert into student values(1, '张三', '男', '2021-01-01', 'java102'),
						  (3, '李四', '男', '2021-01-01', 'java108'),
						  (4, '小芳', '女', '2001-11-11', 'java105'),
						  (5, '孙悟空', '男', '1021-01-01', 'c++'),
						  (6, '大明', '女', '5001-11-11', 'C语言'), 
						  (7, '小明', '女', '1801-11-11', 'sql语言'); 

数据库的基本操作(期末复习大全)_第54张图片

基本查询

查询数据表中所有的数据

语法:select * from 数据表名;
例如:查询学生表中所有的数据
语法:select * from student;
数据库的基本操作(期末复习大全)_第55张图片

查询指定列(一列或多列)的数据

上面的“*”星号就是字段名的通配符

语法:select 【字段名,字段名,… 】from 数据表名;
例如:查询学生表中sid,sname,sclass的数据
语法:select sid,sname,sclass from student;
数据库的基本操作(期末复习大全)_第56张图片
注意:上面的查询字段的内容的顺序是可以改变的
这是根据自己来指定的
例如:select sname,sclass,sid from student;
数据库的基本操作(期末复习大全)_第57张图片

查询指定列(一列或多列)的数据,显示查询的日期(now()函数来实现)

语法:select 字段名,字段名,now() from 数据表名;
例如:查询数据表,显示查询时间
语法:select sid,sname,sclass,now() from student;
数据库的基本操作(期末复习大全)_第58张图片

查询时指定别名,通过as来实现

就是相当于给字段名指定别名,例如:将sid 改变成“学生ID”
注意:此时的指定别名并不是将原始数据库中的字段名改变,仅仅是显示出来的字段名改成你指定的别名

语法:select 字段名 as 别名,字段名 as 别名 from 数据表名;
例如:将学生表中的sid指定成学生id,sname 指定成 学生姓名,sclass 指定成 班级;
语法:select sid as '学生id', sname as '学生姓名', sclass as '班级', now() as '查询时间' from student;
数据库的基本操作(期末复习大全)_第59张图片

对查询的记录进行去重distinct

先出记录中重复的数据

语法:select distinct 字段名,字段名,… from 数据表名;
消除一列中重复的数据
例如:查询student表中agender这一列,对相同数据去重
语法:select distinct sgender from stundent;
数据库的基本操作(期末复习大全)_第60张图片
注意下面几种情况:
1、当你对整张表去重时,查询的结果会是错误的结果,不能这样去使用
数据库的基本操作(期末复习大全)_第61张图片
2、这样也是不行的,去重只针对一列,如果多列进行去重就会出错(这仅仅是我的结论)
数据库的基本操作(期末复习大全)_第62张图片

使用条件where查询

这是用到的数据表
数据库的基本操作(期末复习大全)_第63张图片

比较运算符的使用

数据库的基本操作(期末复习大全)_第64张图片

语法:select * from 数据表 where 字段名 条件语句
注意:此时的“*”星号是通配符,你也可以查询寻指定列
例如:查询student 表中 sid > 5 的数据
语法:select * from student where sid > 5;
数据库的基本操作(期末复习大全)_第65张图片
“ > < = != ” 这里就不写了

is null 和 is not null

IS NULL 或 ISNULL 运算符用来检测一个值是否为 NULL,如果为 NULL,返回值为 1,否则返回值为 0。ISNULL 可以认为是 IS NULL 的简写,去掉了一个空格而已,两者的作用和用法都是完全相同的。

IS NOT NULL 运算符用来检测一个值是否为非 NULL,如果是非 NULL,返回值为 1,否则返回值为 0。

例如1:判断sclass是否为空
语法:select * from student where sclass is null;
数据库的基本操作(期末复习大全)_第66张图片

例如2:判断sclass是否为非空
语法:select * from student where sclass is not null;
数据库的基本操作(期末复习大全)_第67张图片

范围运算符between and 和 in

有关日期的运算可以看看这篇文章:时间的运算
判断是否在一个特定的范围内,这是一个闭区间 [ 3,6 ]

between and
例如:判断sid 在 3 - 6 这个范围;
语法:select * from student where sid between 3 and 6;
数据库的基本操作(期末复习大全)_第68张图片

in
语法:select * from student where sid in (5,7,1);
数据库的基本操作(期末复习大全)_第69张图片

通配符 % _ 下划线

通配符要配合 like 一起使用
在这里插入图片描述

例如:查找张%
语法:select * from student where sname like '张%';
在这里插入图片描述

例如:查找孙%
语法:select * from student where sname like '孙%';
数据库的基本操作(期末复习大全)_第70张图片

例如:查找孙_
语法:select * from student where sname like '孙_';
在这里插入图片描述

例如:查找孙__
语法:select * from student where sname like '孙__';
数据库的基本操作(期末复习大全)_第71张图片

逻辑运算符and or not

数据库的基本操作(期末复习大全)_第72张图片

例如:查询姓名为张三,性别为男的数据
语法:select * from student where sname = '张三' and sgender = '男';
数据库的基本操作(期末复习大全)_第73张图片

例如:查询姓名为张三,或者为孙悟空数据
语法:select * from student where sname = '张三' or sname = '孙悟空' ;
在这里插入图片描述
例如:查询姓名不为张三的数据
语法:select * from student where not sname = '张三' ;
数据库的基本操作(期末复习大全)_第74张图片

使用 order by 子句(排序 升序/降序)

**语法:select * from 表名 where 条件表达式 order by 字段名 desc; **
使用 order by子句应该注意以下几个方面:
order by 子句中可以包含子查询。
当排序的值中存在空值时, order by 子句会将该空值作为最小值来对待。
当在 order by 子句中指定多个列进行排序时,MySQL 会按照列的顺序从左到右依次进行排序。
查询的数据并没有以一种特定的顺序显示,如果没有对它们进行排序,则将根据插入到数据表中的顺序显示。使用 order by 子句对指定的列数据进行排序。

关键字 asc 表示按升序分组,关键字desc 表示按降序分组,其中 asc 为默认值。这两个关键字必须位于对应的列名、表达式、列的位置之后。

例如:将student 的男生的sid 字段进行降序排序
语法:select * from student where sgender = ‘男’ order by sid desc;
数据库的基本操作(期末复习大全)_第75张图片

使用limit子句

Limit接受一个或两个数字参数。参数必须是一个整数常量。

一个参数:它表示返回最大的记录数。从第一行开始算。

两个参数:参数1是指定第一个返回的记录行的索引+1,参数2是最后返回最大的记录数

数据库的基本操作(期末复习大全)_第76张图片
查询数据表的前n条记录
语法:select * from 数据表名 limit n;
例如:查询数据表的前三条记录
语法:select * from student limit 3;
数据库的基本操作(期末复习大全)_第77张图片

查询从第n条记录开始(不包含第n条记录),查询的m条记录(n,…]
语法:select * from 数据表名 limit 2,5;
例如:查询从第2条记录开始,查询的5条记录
语法:select * from student limit 2,5;
数据库的基本操作(期末复习大全)_第78张图片

聚合函数

常见的聚合函数

数据库的基本操作(期末复习大全)_第79张图片

聚合函数count

当某一列有null值的时候,这条记录就不参与计算(指定列的时候)

语法:select count(列名 / *) from 表名
列名:是指定列查询。 * 星号是全列查询
例如:查询这个数据表有多少条记录
语法:select count( *) from student;
数据库的基本操作(期末复习大全)_第80张图片

例如:查询班级这一列有多少条记录
语法:select count(sclass) from student;
在这里插入图片描述
聚合函数的基本用法都基本上一致,所以后面几个聚合函数就没有写了

having是要和分组查询group by 子句 搭配使用

使用 group by 子句可以将数据划分到不同的组中,实现对记录的分组查询。group by 从英文字面的意义上可以理解为“根据(by)一定的规则进行分组(group)”,该子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对这若干个小区域进行统计汇总。

group by 子句通常与聚合函数同时使用,如 max()、min()、count()、sum() 和 avg()。

//创建数据表
create table student1(id int primary key, 
				 	  name varchar(10) not null,
				      class varchar(20) not null,
				      english int,
				      math int,
				      chinese int,
				      xuanxiuke int);

//添加记录
insert into student1 values(1, '张三', 'java101', 50, 60, 100, 1),
						  (2, '李四', 'java101', 55, 65, 98, 1),
						  (3, '王二', 'java102', 50, 61, 74, 2),
						  (4, '麻子', 'java102', 77, 60, 70, 2),
						  (5, '小明', 'java103', 89, 90, 91, 3),
						  (6, '大明', 'java103', 66, 78, 46, 3),
						  (7, '孙悟空', 'java104', 32, 18, 22, 5),
						  (8, '沙和尚', 'java104', 57, 85, 71, 5),
						  (9, '猪八戒', 'java105', 59, 45, 98, 9),
						  (10, '小白龙', 'java105', 88, 90, 36, 3);

数据库的基本操作(期末复习大全)_第81张图片
数据库的基本操作(期末复习大全)_第82张图片

group by 搭配条件
1、where条件表达式
where 子句设置的条件筛选在group by之前发生作用,,并且条件中不能使用 聚合函数

2、having 条件表达式
having 设置的条件筛选 在group by之后发生作用,并且条件中能使用 聚合函数

语法:select 【*/要查询的字段名】from 数据表名 where group by 字段名列表 having 条件表达式;
数据库的基本操作(期末复习大全)_第83张图片

例如:查询每个班的 同学成绩在80以上的同学
语法:select * from student1 where english > 80 and math > 80 and chinese > 80 group by class;
数据库的基本操作(期末复习大全)_第84张图片

多表查询

先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。

内连接:是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。

外连接:其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。

左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。

右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。

进行多表查询的时候首先要进行笛卡尔积
数据库的基本操作(期末复习大全)_第85张图片

假设此时有两张表,学生表和班级表
学生表
数据库的基本操作(期末复习大全)_第86张图片
此时进行笛卡尔积:语法:select * from 学生表名,班级表名
语法:select * from student,class;
数据库的基本操作(期末复习大全)_第87张图片
注意此时虽然看见了很多条记录,但是有些记录是没有用的记录
数据库的基本操作(期末复习大全)_第88张图片
例如1:查询同学姓名 和 对应班级的名字
注意:此时学生表中有class_id 班级表中也有class_id ,此时如果条件表达式中要区分的话,就可以使用表名.字段名 的方式 来表示, student.class_id 这就代表是学生表中的class_id了
数据库的基本操作(期末复习大全)_第89张图片

笛卡尔积之后就可以进行查询了,此时我们知道多表查询就是将多张表进行笛卡尔积,然后再加上条件表达式

首先创建几张表,多表查询要用

先创建几个表
学生表:

//创建学生表
create table student(student_id int primary key auto_increment,
					 sn varchar(20),
					 name varchar(20),
					 qq_mail varchar(50),
					 classes_id int);

//插入数据
insert into student(sn, name, qq_mail, classes_id) values
('09982','黑旋风李逵','xuanfeng@qq.com',1),
('00835','菩提老祖',null,1),
('00391','白素贞',null,1),
('00031','许仙','xuxian@qq.com',1),
('00054','不想毕业',null,1),
('51234','好好说话','say@qq.com',2),
('83223','tellme',null,2),
('09527','老外学中文','foreigner@qq.com',2);					 

查看表的结构和数据内容
数据库的基本操作(期末复习大全)_第90张图片

创建课程表

//创建课程表
create table course(id int primary key auto_increment,
					name varchar(20)
					);

//插入数据
insert into course(name) values
('Java'),
('中国传统文化'),
('计算机原理'),
('语文'),
('高阶数学'),
('英文');

查看课程表结构和数据
数据库的基本操作(期末复习大全)_第91张图片
创建班级表

create table classes(id int primary key auto_increment,
					 name varchar(20),
					 `desc` varchar(20)
					 );


insert into classes(name, `desc`) values
('计算机系20191', '学习了计算机原理'),
('中文系20193','学习了中国传统文学'),
('自动化20195','学习了机械自动化');

查看班级表结构和数据
数据库的基本操作(期末复习大全)_第92张图片

创建分数表

create table score(score decimal(3, 1),
				   student_id int,
				   score_id int
				   );

insert into score(score, student_id, course_id) values
-- 黑旋风李逵
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
-- 菩提老祖
(60, 2, 1),(59.5, 2, 5),
-- 白素贞
(33, 3, 1),(68, 3, 3),(99, 3, 5),
-- 许仙
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
-- 不想毕业
(81, 5, 1),(37, 5, 5),
-- 好好说话
(56, 6, 2),(43, 6, 4),(79, 6, 6),
-- tellme
(80, 7, 2),(92, 7, 6);

数据库的基本操作(期末复习大全)_第93张图片

这是要用到的表的整体
数据库的基本操作(期末复习大全)_第94张图片

在这个场景中,涉及到的主题,主要有三个:学生、班级、课程。
学生 和 班级 是一对多的关系【一个学生只能属于一个班级,一个班级可以包括多个学生】
学生 和 课程 是多对多的关系【一个学生可以选着多门课程,一门课程可以包含多个学生】
而处理多对多的关系,运用的是建立一张关系表,score 分数表就是这样的情况。
分数表“:表示一个学生选择了那门课,并且该门课的成绩是多少、

内连接 join on 和 where

join on 可以用做内连接和外连接(外连接分为左外链接和右外连接)
where只能用作内连接

练习1:查询“许仙”的成绩(使用where)

注意:我们做多表查询的时候最好是分步骤来写
1、首先,查询“许仙”的成绩,我们要先得到许仙的名字,此时我们就要看许仙的名字在那个表里面》学生表,成绩在那个表里面》成绩表
这时我们就将学生表和成绩表先做笛卡尔积
数据库的基本操作(期末复习大全)_第95张图片

注意这只是笛卡尔积结果的一部分
2、加条件
上面已经有了名字和成绩,那那就看学生表和成绩表
学生表里面有student_id,分数表里面也有student_id ,那不就代表当学生表的student_id = 分数表的student_id,并且名字 name = 许仙,那不就是许仙的成绩吗!
select * from 表1,表2, where 条件语句

语法:select * from student,score where student.student_id = score.student_id and student.name = '许仙';
数据库的基本操作(期末复习大全)_第96张图片
这是不就是许仙的名字和成绩吗
3、显示你要看到的内容
题目是查询“许仙”的成绩所以只显示许仙的成绩和姓名就行了
select * from student,score where student.student_id = score.student_id and student.name = ‘许仙’;
这是将上面的通配符“ * ”改变成要查询的内容
语法:select student.name,score.score from student,score where student.student_id = score.student_id and student.name = '许仙';
数据库的基本操作(期末复习大全)_第97张图片

练习2:查询“许仙”的成绩 ( join 关键字 实现 多表查询)
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
注意:此处的别名也可以不要

select 字段 from 表1 别名1,2 别名2 where 连接条件 and 其他条件;

select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
注意:此时的inner可以省略的 相当于 inner join on = join on

语法:select * from student join score on student.student_id = score.student_id and student.name = '许仙;
数据库的基本操作(期末复习大全)_第98张图片
再将你要显示的内容显示出来就行了
数据库的基本操作(期末复习大全)_第99张图片

练习2:查询所有同学的总成绩(使用where)

1、首先要将有效的数据进行筛选,此时有关题目的表就是学生表和分数表
此时学生表中的student_id = 分数表中的 student_id
那就是有关于所有同学的成绩的有效数据

数据库的基本操作(期末复习大全)_第100张图片
2、注意此时是要显示总成绩,所以要用到聚合函数sum();
但是,此时要的是每个同学的总成绩,所以就要将每个同学进行分组,使用group by
数据库的基本操作(期末复习大全)_第101张图片
3、分好组之后再求每个人的总成绩
数据库的基本操作(期末复习大全)_第102张图片

练习2:查询所有同学的总成绩(使用join on)

数据库的基本操作(期末复习大全)_第103张图片

练习3:查询所有同学的每门成绩(where)

这里就要用到三张表了,学生表,分数表,课程表
数据库的基本操作(期末复习大全)_第104张图片
1、先进行条件筛选
数据库的基本操作(期末复习大全)_第105张图片

2、显示出你要显示的内容
数据库的基本操作(期末复习大全)_第106张图片

练习3:查询所有同学的每门成绩(join on)

数据库的基本操作(期末复习大全)_第107张图片

外连接(外连接只能用join on 不能使用where(where是用作内连接的))

左外连接 left join on

左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。

数据库的基本操作(期末复习大全)_第108张图片
此时我们使用左连接看看情况
在这里插入图片描述

右外连接 right join on

右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。

和左连接意思差不多的
看效果
数据库的基本操作(期末复习大全)_第109张图片

自连接

自连接就是自己与自己进行笛卡尔积
此时有张学生表student2
数据库的基本操作(期末复习大全)_第110张图片
自己与自己进行笛卡尔积
但是,自己与自己进行笛卡尔积会出现问题,那就是表的名字是相同的,所以要指定别名来区分
数据库的基本操作(期末复习大全)_第111张图片

自连接的应用场景,显示所有“计算机原理”成绩比“java”成绩高的成绩信息

前面提到的where和join on 他们的筛选条件,那都是针对列与列之间的
例题:显示所有“计算机原理”成绩比“java”成绩高的成绩信息
先看两个表:分数表和课程表
数据库的基本操作(期末复习大全)_第112张图片
1、首先,分数表和分数表进行笛卡尔积,并且指定别名
数据库的基本操作(期末复习大全)_第113张图片
上面说行行之间不能比较,现在不就是列与列之间的比较吗
这就是自连接的作用,将行与行之间的比较转换成列与列之间的比较
2、显示有效数据,两个表学生id 相同的就是有效的数据
数据库的基本操作(期末复习大全)_第114张图片
2、此时我们直保留course_id 为1 和 3 的数据
在这里插入图片描述
3、然后在保留 计算机原理 > java 的数据
此时s1就表示java的的分数表,s2就表示计算机原理的分数表数据库的基本操作(期末复习大全)_第115张图片> 当然如果为了好看。你也可以指定 列名 的别名
在这里插入图片描述

子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
换个说法:把多个 select 合并成一个。
简单来说就是套娃!是一种非常反人类的操作,So Sick!

单行子查询(查询与“不想毕业”同学 的同班同学)

首先查看表,与题目有关的表
数据库的基本操作(期末复习大全)_第116张图片
但是此时,你应该要先知道“不想毕业”同学的班级id
然后再来根据班级id查找
数据库的基本操作(期末复习大全)_第117张图片

但是。现在的就要一次性写完两个个步骤(套娃,那上一个查询的结果,来做下一次的筛选条件)
这种套娃是真的恶心啊,此时你都还不觉得,到套个七八蹭的时候呢?????
数据库的基本操作(期末复习大全)_第118张图片

多行子查询 - 返回多行记录的子查询(查询“语文”或“英语”课程的成绩信息)

先看表
数据库的基本操作(期末复习大全)_第119张图片

对于这个问题:
1、首先,先查询语文和英文的id。
2、在根据课程id找到对应的成绩信息
数据库的基本操作(期末复习大全)_第120张图片

合并查询(查询id小于3,或者名字为“英文"的课程:)

合并查询,就是把多个查询语句的结果给合并到一起了

合并多个select的执行结果.
可以使用集合操作符 union,union all。
【union 在 c中,表示一种叫做联合体。即:用一块内存表示不同内存的含义】
通过 union 把两个 sql 的查询结果合并到一起。
合并的前提是:两个 sql 查询的列 是 对应的。
【你可以理解为同一个表,或者 两个表的每一列的类型都是相对应的】
union 操作会自动的进行去重
union all是不会去重的
数据库的基本操作(期末复习大全)_第121张图片
这种操作也可以用 or 来写,使用or的时候必须是针对同一个表
数据库的基本操作(期末复习大全)_第122张图片

你可能感兴趣的:(MySQL,mysql)