语法格式:
show databases;
如果想要查看已经创建好的数据库:例如查看已经创建好的数据库xxgc的信息
语法格式:show create database 数据库名;
显示的就是数据库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;
语格式:drop database 数据库名;
例如:删除数据库xxgc 。语法格式:drop database xxgc;
此时查看数据库就没有了xxgc这个数据库了。
然后就可以创建数据表了。
语法格式:create table 数据表名(字段名 数据类型,字段名 数据类型…);
例如创建一个数据表teacher,用于存储老师的基本信息
语法:create table teacher (id int, name carchar(20), email varchar(30));
语法结构:
alter table 旧表名 rename 新表明;
例如将数据表teacher 修改成 xxgc_teacher
修改好之后,在来查看数据表结构
语法:alter table 表名 change 旧字段名 新字段名 新数据类型;
其中旧字段名是修改之前的字段名,新字段名是修改之后的字段名,新数据类型是修改后 新字段的数据类型(这里不能为
空),如过数据类型不想改变,那就将数据类型设置为原来的数据类型
语法:alter table 表名 modify 字段名 新数据类型;
例如:将xxgc_teacher 数据表中的 teacher_id 的数据类型改变为 varchar(20);
alter table xxgc_teacher modify teacher varchar(20);
语法:alter table 表名 add 新字段名 数据类型[约束条件] ;
例如:在xxgc_teacher 数据表中添加字段没有约束条件的age,数据类型为int。
语法:alter table 表名 modify 字段名1 新数据类型 first | after 字段名2;
其中first 是可选参数,用于将字段名1设置为第一个字段,after 也是可选参数,用于将字段名1移动到字段名2后面。此命令可以同时修改数据类型和位置,如果不想修改数据类型就将型数据类型设置为原来的数据类型。例如:将xxgc_teacher表中的name设置为第一个字段
alter table xxgc_teacher modify name varchar(15) first;
例如:将xxgc_teacher表中的name移动到email的后面
alter table xxgc_teacher modify name varchar(15) after email;
语法:drop table 数据表名;
例如:将数据库中的xxgc数据表删除
1、查看数据库中有哪些数据表
语法:show tables;
primary key 是 not null 和 unique 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录
语法:create table 数据表名(字段名 数据类型 primary key);
例如:创建表company表,并设置company_id字段为主键
语法:
create table company(company_id int primary key,
company_name varchar(20),
company_address varchar(200)
);
语法:alter table 数据表名 modify 字段名 数据类型 primary key ;
例如:给创建好的company表中的company_id添加主键约束
1、先将company表删除
语法:drop table company;
2、在创建company表
语法:create table company(company_id int,
company_name varchar(20),
company_address varchar(200)
);
此时company_id还没有添加主键
3、给company_id添加主键
语法:alter table company modify company_id int primary key;
语法:alter table 数据表名 drop primary key;
例如:删除company中company_id的主键约束
复合主键指由多个字段组成
**语法: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));
语法:alter table 数据表名 add primary key(字段名1,字段名2,…);
2、在创建数据表sales
语法:create table sales (product_id int,
region_code varchar(20),
quantity int,
price float,
);
3、添加复合主键
语法:alter table sales add primary key(product_id,region_code);
语法:alter table 数据表名 drop primary key;
例如:删除sales中的复合主键
语法:alter table sales drop primary key;
1.定义
外键用来在两个表的数据之间建立链接,它可以是一列或者多列;一个表可以有一个或多个外键。
外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键是表的一个字段,不是表的主键,但对应另一个表的主键;定义外键后,不允许删除另一个表中具有关联关系的行。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表;
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
被指向的实体,称之为主实体(主表),也叫父实体(父表)
负责指向的实体,称之为从实体(从表),也叫子实体(子表);
若‘表1’的一个列既是主键又是外键,而这个外键约束又对应另一个表‘表2’的主键,那么‘表1’和‘表2’就可以合并起来了
2.作用:
外键的主要作用是保持数据的一致性、完整性。
如果主表没有相关的记录,从表不能插入;
更新时,不能改为主键表中没有的值;
删除主键表记录时,可以在建外键时选定外键记录一起级联删除还是拒绝删除;同样有级联更新和拒绝更新的选择。
ON DELETE CASCADE 级联删除
ON UPDATE CASCADE 级联更新
语法:constraint 外键名 foreign key (从表的外键字段名) references 主表名 (主表的主键字段名)
其中,外键名 是指从表创建外键约束的名字例如:创建两个表员工表emp和部门表dept,并且在员工表上面添加外键
注意:创建表的时候,一定是要先创建主表,在创建从表
1、先创建主表
语法:create table dept(id int primary key, name varchar(20), locaton varchar(20), descrip varchar(20) );
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) );
语法:
alter table 从表名 add constraint 外键名 foreign key (从表的外键字段名) references 主表名(主表的主键字段名) ;
在创键好的员工表emp 和 部门表dept,为员工表添加外键
1、先删除员工表和部门表
drop table emp; drop table dept;
2、在创建部门表dept
create table dept(id int primary key, name varchar(20), locaton varchar(20), descrip varchar(20) );
创建员工表emp
create table emp(id int primary key, name varchar(20), dept_id int, salary float );
3、在给从表添加外键约束
语法:alter table emp add constraint fk_emp_dept foreign key(dept_id) references dept(id);
语法:alter table 从表名 drop foreign key 外键名;
例如:删除emp的外键约束
语法:alter table emp drop foreign key fk_emp_dept;
注意:此时明明已经删除了,,但是为什么还是看见外键还在,这是因为MySQL创建外键之后,会创建一个同名的索引,外键删除,索引不会删除
非空约束指字段的值不能为空。在同一个数据表中可以定义多个非空字段。
语法: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 );
此时看见标记处为NO代表不能为空
语法:alter table 数据表名 modify 字段名 数据类型 not null;
例如:给创建好的company数据表字段company_name添加非空约束
语法:alter table company modify company_name varchar(20) not null;
语法:alter table 数据表名 modify 字段名 数据类型;
例如:删除数据表company中company_name的非空约束;
语法:alter table company modify company_name varchar(20);
唯一约束表示该列中只有唯一的值 ,不能重复(就像身份证一样不能重复)
语法: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 );
语法:alter table 数据表名 modify 字段名 数据类型 unique;
例如:给创建好的company数据表字段company_name添加唯一约束
语法:alter table company modify company_name varchar(20) unique;
语法:alter table 数据表名 drop index 字段名;
例如:删除数据表company中company_name的唯一约束;
语法:alter table company drop index company_name;
如果将数据表的某一列的值设置为默认约束,在用输入新的数据时,没有为这一列添加数据是,此时的默认的值就是默认值,也可是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' );
语法:alter table 数据表名 modify 字段名 新数据类型 default ‘设置的默认值’;
例如:给创建好的company数据表字段company_name添加默认约束
语法:alter table company modify company_name varchar(15) default '999';
语法:alter table 数据表名 modify 字段名 数据类型;
例如:给创建好的company数据表字段company_name删除默认约束。
语法:alter table company modify company_name varchar(15);
在 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) );
语法:alter table 数据表名 modify 字段名 数据类型 auto_increment;
例如:给创建好的company数据表字段company_id添加自增主键
语法:alter table company modify company_id int auto_increment;
语法:alter table 数据表名 modify 字段名 数据类型;
给创建好的company数据表字段company_id删除自增主键。
语法:alter table company modify company_id int;
语法: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) );
2、插入单行数据([ ]此时中括号里面没有参数)
插入学生“张三”
语法:insert into student values(1, '张三', '男', '2021-01-01', 'java102');
通过select 语句可以查询表的内容: select * from 数据表名;
语法:select * from student;
3、插入单行数据([ ]此时中括号里面有参数)
插入一个王二
语法:insert into student(sid,sname) values(2, '王二');
注意:此时没有插入数据的都为默认值
同时插入李四和小芳
语法:insert into student values(3, '李四', '男', '2021-01-01', 'java108'), (4, '小芳', '女', '2001-11-11', 'java105');
此时每条记录之间要用(),();这样的方式插入
MySQL中使用update来修改数据表的记录
语法:update 数据表名 set 字段名=value where 条件表达式;
注意:此时value的值是修改后的值,value的值可以是表达式例如;将学生表中王二的性别改为“男”
语法:update student set sgender = '男' where sname = '王二';
注意:如果没有条件表达式的话,那就是将字段名这一列的值都设置为“男”
例如:将性别这一列设置为“女”
语法:update student set sgender = '女';
语法:delete from 数据表名 where 条件表达式;
例如:删除数据表中张三这条记录
语法:delete from student where sname = '张三';
语法:delete from 数据表名;
例如:删除数据表student中所有记录
语法:delete from student;
语法:truncate table 数据表名;
例如:删除学生表中所有数据;
1、先在数据表中增加数据
2、然后在使用truncate删除数据:truncate table student;
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语言');
语法:select * from 数据表名;
例如:查询学生表中所有的数据
语法:select * from student;
上面的“*”星号就是字段名的通配符
语法:select 【字段名,字段名,… 】from 数据表名;
例如:查询学生表中sid,sname,sclass的数据
语法:select sid,sname,sclass from student;
注意:上面的查询字段的内容的顺序是可以改变的
这是根据自己来指定的
例如:select sname,sclass,sid from student;
语法:select 字段名,字段名,now() from 数据表名;
例如:查询数据表,显示查询时间
语法:select sid,sname,sclass,now() from student;
就是相当于给字段名指定别名,例如:将sid 改变成“学生ID”
注意:此时的指定别名并不是将原始数据库中的字段名改变,仅仅是显示出来的字段名改成你指定的别名
语法:select 字段名 as 别名,字段名 as 别名 from 数据表名;
例如:将学生表中的sid指定成学生id,sname 指定成 学生姓名,sclass 指定成 班级;
语法:select sid as '学生id', sname as '学生姓名', sclass as '班级', now() as '查询时间' from student;
先出记录中重复的数据
语法:select distinct 字段名,字段名,… from 数据表名;
消除一列中重复的数据
例如:查询student表中agender这一列,对相同数据去重
语法:select distinct sgender from stundent;
注意下面几种情况:
1、当你对整张表去重时,查询的结果会是错误的结果,不能这样去使用
2、这样也是不行的,去重只针对一列,如果多列进行去重就会出错(这仅仅是我的结论)
语法:select * from 数据表 where 字段名 条件语句
注意:此时的“*”星号是通配符,你也可以查询寻指定列
例如:查询student 表中 sid > 5 的数据
语法:select * from student where sid > 5;
“ > < = != ” 这里就不写了
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;
例如2:判断sclass是否为非空
语法:select * from student where sclass is not null;
有关日期的运算可以看看这篇文章:时间的运算
判断是否在一个特定的范围内,这是一个闭区间 [ 3,6 ]
between and
例如:判断sid 在 3 - 6 这个范围;
语法:select * from student where sid between 3 and 6;
例如:查找张%
语法:select * from student where sname like '张%';
例如:查询姓名为张三,性别为男的数据
语法:select * from student where sname = '张三' and sgender = '男';
例如:查询姓名为张三,或者为孙悟空数据
语法:select * from student where sname = '张三' or sname = '孙悟空' ;
例如:查询姓名不为张三的数据
语法:select * from student where not sname = '张三' ;
**语法: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;
Limit接受一个或两个数字参数。参数必须是一个整数常量。
一个参数:它表示返回最大的记录数。从第一行开始算。
两个参数:参数1是指定第一个返回的记录行的索引+1,参数2是最后返回最大的记录数
查询数据表的前n条记录
语法:select * from 数据表名 limit n;
例如:查询数据表的前三条记录
语法:select * from student limit 3;
查询从第n条记录开始(不包含第n条记录),查询的m条记录(n,…]
语法:select * from 数据表名 limit 2,5;
例如:查询从第2条记录开始,查询的5条记录
语法:select * from student limit 2,5;
当某一列有null值的时候,这条记录就不参与计算(指定列的时候)
语法:select count(列名 / *) from 表名
列名:是指定列查询。 * 星号是全列查询
例如:查询这个数据表有多少条记录
语法:select count( *) from student;
例如:查询班级这一列有多少条记录
语法:select count(sclass) from student;
聚合函数的基本用法都基本上一致,所以后面几个聚合函数就没有写了
使用 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);
group by 搭配条件
1、where条件表达式
where 子句设置的条件筛选在group by之前发生作用,,并且条件中不能使用 聚合函数2、having 条件表达式
having 设置的条件筛选 在group by之后发生作用,并且条件中能使用 聚合函数
语法:select 【*/要查询的字段名】from 数据表名 where group by 字段名列表 having 条件表达式;
例如:查询每个班的 同学成绩在80以上的同学
语法:select * from student1 where english > 80 and math > 80 and chinese > 80 group by class;
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
内连接:是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接:其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。
右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。
假设此时有两张表,学生表和班级表
学生表
此时进行笛卡尔积:语法:select * from 学生表名,班级表名
语法:select * from student,class;
注意此时虽然看见了很多条记录,但是有些记录是没有用的记录
例如1:查询同学姓名 和 对应班级的名字
注意:此时学生表中有class_id 班级表中也有class_id ,此时如果条件表达式中要区分的话,就可以使用表名.字段名 的方式 来表示, student.class_id 这就代表是学生表中的class_id了
笛卡尔积之后就可以进行查询了,此时我们知道多表查询就是将多张表进行笛卡尔积,然后再加上条件表达式
先创建几个表
学生表:
//创建学生表
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);
创建课程表
//创建课程表
create table course(id int primary key auto_increment,
name varchar(20)
);
//插入数据
insert into course(name) values
('Java'),
('中国传统文化'),
('计算机原理'),
('语文'),
('高阶数学'),
('英文');
create table classes(id int primary key auto_increment,
name varchar(20),
`desc` varchar(20)
);
insert into classes(name, `desc`) values
('计算机系2019级1班', '学习了计算机原理'),
('中文系2019级3班','学习了中国传统文学'),
('自动化2019级5班','学习了机械自动化');
创建分数表
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);
在这个场景中,涉及到的主题,主要有三个:学生、班级、课程。
学生 和 班级 是一对多的关系【一个学生只能属于一个班级,一个班级可以包括多个学生】
学生 和 课程 是多对多的关系【一个学生可以选着多门课程,一门课程可以包含多个学生】
而处理多对多的关系,运用的是建立一张关系表,score 分数表就是这样的情况。
分数表“:表示一个学生选择了那门课,并且该门课的成绩是多少、
join on 可以用做内连接和外连接(外连接分为左外链接和右外连接)
where只能用作内连接
注意:我们做多表查询的时候最好是分步骤来写
1、首先,查询“许仙”的成绩,我们要先得到许仙的名字,此时我们就要看许仙的名字在那个表里面》学生表,成绩在那个表里面》成绩表
这时我们就将学生表和成绩表先做笛卡尔积
注意这只是笛卡尔积结果的一部分
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 = '许仙';
这是不就是许仙的名字和成绩吗
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 = '许仙';
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 = '许仙;
再将你要显示的内容显示出来就行了
1、首先要将有效的数据进行筛选,此时有关题目的表就是学生表和分数表
此时学生表中的student_id = 分数表中的 student_id
那就是有关于所有同学的成绩的有效数据
2、注意此时是要显示总成绩,所以要用到聚合函数sum();
但是,此时要的是每个同学的总成绩,所以就要将每个同学进行分组,使用group by
3、分好组之后再求每个人的总成绩
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。
右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。
自连接就是自己与自己进行笛卡尔积
此时有张学生表student2
自己与自己进行笛卡尔积
但是,自己与自己进行笛卡尔积会出现问题,那就是表的名字是相同的,所以要指定别名来区分
前面提到的where和join on 他们的筛选条件,那都是针对列与列之间的
例题:显示所有“计算机原理”成绩比“java”成绩高的成绩信息
先看两个表:分数表和课程表
1、首先,分数表和分数表进行笛卡尔积,并且指定别名
上面说行行之间不能比较,现在不就是列与列之间的比较吗
这就是自连接的作用,将行与行之间的比较转换成列与列之间的比较
2、显示有效数据,两个表学生id 相同的就是有效的数据
2、此时我们直保留course_id 为1 和 3 的数据
3、然后在保留 计算机原理 > java 的数据
此时s1就表示java的的分数表,s2就表示计算机原理的分数表> 当然如果为了好看。你也可以指定 列名 的别名
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
换个说法:把多个 select 合并成一个。
简单来说就是套娃!是一种非常反人类的操作,So Sick!
但是。现在的就要一次性写完两个个步骤(套娃,那上一个查询的结果,来做下一次的筛选条件)
这种套娃是真的恶心啊,此时你都还不觉得,到套个七八蹭的时候呢?????
合并查询,就是把多个查询语句的结果给合并到一起了
合并多个select的执行结果.
可以使用集合操作符 union,union all。
【union 在 c中,表示一种叫做联合体。即:用一块内存表示不同内存的含义】
通过 union 把两个 sql 的查询结果合并到一起。
合并的前提是:两个 sql 查询的列 是 对应的。
【你可以理解为同一个表,或者 两个表的每一列的类型都是相对应的】
union 操作会自动的进行去重
union all是不会去重的
这种操作也可以用 or 来写,使用or的时候必须是针对同一个表