1. MySQL
1.1. DDL、DML和DCL的理解
DDL数据定义语言 只操作对象,不会操作具体数据。
Create:可以创建数据库和数据库的一些对象。
Drop:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等。
Alter:修改数据表定义及属性。
DML数据操作语言 操作数据库对象中包含的数据,操作记录。
Insert:向表插入一条记录。
Delete:删除表中的一条或多条记录。
Update:用于修改已存在表中的记录的内容。
DCL 数据控制语句 操作数据库对象的权限
Grant:给用户分配权限。
Revoke语句:删除分配的权限
1.2. 用户操作
1.2.1. 创建一个用户,指定密码。
格式:
create user 用户名@IP地址 identified by '密码';
如:创建一个用户,用户名为ming,密码为123456
create user ming@'%' identified by '123456'; @’%’ 表示可以在任意ip地址上,用ming登录数据库
create use ming identified by ‘123456’ ; 在本地创建小明用户
A.创建1个小明用户,可以登录数据库 ,这个用户建立好后,在mysql数据库下,use mysq; select * from user; 查看小明用户是否以创建
B.根用户退出,用小明用户登录,观察一下现在小明可以访问哪些数据库 ,发现小明用户只能访问系统的information-schema
C.这样的用户创建出来,没有意义, root用户给小明分配权限,让小明可以查看,新增,修改表结构,对于njwangbo1下面的t_student02这张表
(给小明分配的是操作单张表的权限)
grant select ,insert, alter on njwangbo1.t_student02 to xiaoming;
(给小明分配的是操作单张表的所有权限 rename,alter,insert,select,delete,update,drop)
grant all on njwangbo1.t_student02 to xiaoming;
(给小明分配的是操作某个数据库下所有表的权限 ,create,rename,alter,insert,select,delete,update,drop)
grant all on njwangbo1.* to xiaoming;
(给小明分配操作所有数据库所有表的权限 create,drop,alter,rename,delete,select,update,insert)
grant all on *.* to xiaoming;
D.查看小明拥有哪些权限
show grants for xiaoming;
E.发现xiaoming用户对t_student02这张表,只有新增,查询,修改表结构3个权限,如果做update操作,比方说 update t_student02 set t_name=’bob’ where t_stuNo=111;
发现更新失败
给小明分配更新的权限,再次用xiaoming登录,查看是否可以进行update操作
F.假设现在回收小明的新增,修改表数据(update)权限 ,退出后,用小明登录,再次尝试,发现新增,修改都无效了
revoke insert , update on njwangbo1.t_student02 from xiaoming;
(回收单张表的所有权限)
revoke all on njwangbo1.t_student02 from xiaoming;
(回收某个数据库下的所有表的权限)
revoke all on njwangbo1.* from xiaoming;
(回收所有数据库的所有权限)
revoke all on *.* from xiaoming;
G. 修改小明用户的密码 ,所有用户的信息 存储 mysql数据库 ---user表中
use mysql;
update user set password=password('654321' ) where user='xiaoming';
flush privileges;
1.2.2. 为用户赋予操作权限
格式:
grant create,alter, drop, insert, update, delete, select on 数据库名字.表名 to 用户名@IP地址;
如:
赋予ming用户 create, alter, drop, insert, update, delete权限在njwangbo中的t_studnet表上
grant create,alter, drop, insert, update, delete on njwangbo.t_studnet to ming@'%';
1.2.3. 回收权限
格式:
revoke 权限 on 数据库.*|表 from 用户名@IP地址;
如
回收ming用户在t_studnet表上的select权限
revoke select on njwangbo.t_studnet from ming@'%';
回收ming在njwangbo数据库所有数据对象上的所有权限
revoke all on *.* from ming@'%';
1.2.4. 查看用户的权限
show grants for 用户名@IP地址
1.2.5. 删除某个用户
drop user 用户名@IP地址;
drop user xiaoming@’%’; //删除以任意ip地址登录的用户
drop user xiaoming; //删除本地的
1.2.6. 修改密码
使用create user创建用户时,相当于在mysql数据库的user表中插入一行数据。如果修改某个用户的信息(权限,密码),则可以直接修改user表中的列即可。
修改某用户的密码
use mysql;
update user set password=password('root') where user = 'root';
flush privileges;
1.3. 函数
1.3.1. 字符类函数
连接字符串 concat(,)
select concat('hello','world'); //helloworld
插入字符串 insert(str,pos,len,newStr) 下标从1开始 // 要插入的字符串,起始位置,取代的字符的个数,准备插入的新字符串
select insert('helloworld',1,2,'abcd'); //abcdlloworld
select insert('helloworld',3,3,'****'); // he****world
转小写 lower(str)
select lower('AbCd'); //abcd
转大写upper(str)
select lower('AbCd'); //ABCD
计算长度length(str)
select length('hello') //5
去前后空格trim(str)
select length(trim(' aa ')) // 2
全部替换replace(一段字符串,把这里的值,替换成这里的值)
select replace('xx And xx','xx','pp'); // pp And pp
取子串substring(str,pos,len) 索引从1开始 pos索引的起始位置 len 截取的字符的个数
select substring('helloworld',2,4); // ello
select substring('helloworld',3,4); //llow
select substring(substring('helloworld',2,6),3,4); //lowo
select substring(substring(substring('helloworld',2,6),1,5),3,2); //lo
1.3.2. 数学函数
向上取整ceil(8.1); // 9
向下取整floor(8.9); //8
取余数mod(10,3); //1
四舍五入round(10.572,1); //10.6 浮点数 ,保留的小数位数
截断 truncate(7.123456,2); //7.12
truncate(7.1582345,2); // 7.15 注意:截断没有四舍五入 要截断的浮点数, 保留的小数位数
1.3.3. 日期函数
(mysql专用)
当前日期 年月日 curdate() 2017-05-19
当前的时间 时分秒 curtime() 11:45:23
当前时间日期 年月日时分秒 now() 2017-05-19 11:45:23
1.3.4. 流程函数
(mysql专用)
if(表达式,结果1,结果2)
表达式成立,取结果1;不成立,取结果2。
if(5>3,10,12); // 10 if(5!=3,10,12) //10 if(5<3,10,12); //12
ifnull(结果1,结果2)
如果结果1为null,取结果2;不为null,取结果1自己。
ifnull(null,10); // 10 ifnull(5,10); //5
1.3.5. 系统函数
返回当前正在使用的数据库名称 select database();
1.3.6. 聚合函数
max
min
sum
avg
count
distinct
1.4. 单表查询
准备数据
创建学生表,包含字段 :学号,姓名,年龄,性别,生日(需用date类存储),工资,奖金,并且插入至少5条数据。
查询表中所有字段
select * from 表名; *表示表中所有的列,且按默认列顺序排列。
查询部分字段,列顺序可以自定义
select 列名1, 列名2…列名n from 表名;
mysql的运算符+ - * /
查看每个学生工资增长1000以后的信息(只要显示编号 + 姓名 + 工资)
select t_stuNo, t_name,t_salary+1000 from t_student05;
给t_salary + 1000 起别名
select t_stuNo, t_name,t_salary+1000 from t_student05;
select t_stuNo, t_name,t_salary+1000 as '工资' from t_student05;
select t_stuNo, t_name,t_salary+1000 '工资' from t_student05;
select t_stuNo '学号', t_name '姓名', t_salary+1000 '工资' from t_student05;
select t_stuNo as '学号', t_name as '姓名', t_salary+1000 as '工资' from t_student05;
姓名是ming且t_salary > 6000
select * from t_student05 where t_name='kate' and t_salary>6000;
姓名中带有‘ming’字样的,而且t_salary>6000;
select * from t_student05 where t_name like '%kate%' and t_salary>6000;
查找工资t_salary在3500到6000之间所有学生的信息
select * from t_student05 where t_salary between 3500 and 6000;
select * from t_student05 where t_salary>= 3500 and t_salary<= 6000;
查询1996年出生的学生信息
select * from t_student05 where year(t_birthday)=1996;
查找学生编号为 03 04 07 的信息
select * from t_student05 where t_stuNo in(03,04,07);
select * from t_student05 where t_stuNo=03 or t_stuNo=04 or t_stuNo=07;
查询t_award为null的学生信息
select * from t_student05 where t_award is null;
查询t_award不为null的学生信息
select * from t_student05 where t_award is not null;
查看每个人姓名,年龄,如果null,用0表示
select t_name,ifnull(t_age,0) from t_student05;
select t_name '姓名',ifnull(t_age,0) '年龄' from t_student05;
任何值与null做算术运算时结果都为null,想办法将null转换成0再计算。查询年薪,姓名
查看每个学生的年薪
select t_stuNo '学号',t_name '姓名' , ( t_salary+t_award)*12 '年薪' from t_student05;
发现问题 ,有的奖金为null的学生,出现年薪null
如果t_award 为null,取0
select t_stuNo '学号',t_name '姓名' , ( t_salary+ifnull(t_award,0))*12 '年薪' from t_student05;
查询年薪超过10万的同学(学号,姓名,年薪)
//如果你的mysql安装的字符集和汉字的不匹配,会出错
select t_stuNo '学号',t_name '姓名' , ( t_salary+ifnull(t_award,0))*12 '年薪' from t_student05 having 年薪>100000; 有的系统不支持汉字
//ok
select t_stuNo '学号',t_name '姓名' , ( t_salary+ifnull(t_award,0))*12 as nianxin from t_student05 having nianxin>100000;
为何下句出错,提示未知的列名 nianxin 因为 where 后跟的已有列名
select t_stuNo '学号',t_name '姓名' , ( t_salary+ifnull(t_award,0))*12 as 'nianxin' from t_student05 where nianxin>100000;
子查询 , select t_stuNo '学号',t_name '姓名', ( t_salary+ifnull(t_award,0))*12 as nianxin from t_student05 查询出来的值作为子表,起了别名 叫t ,外层的数据是来源于内层的子表
//ok
select * from
(select t_stuNo '学号',t_name '姓名', ( t_salary+ifnull(t_award,0))*12 as nianxin from t_student05 ) t
where t.nianxin>100000;
月工资前显示货币符号
select t_stuNo,t_name , concat('¥',t_salary+ifnull(t_award,0)) from t_student05;
select t_stuNo '学号',t_name '姓名' , concat('¥',t_salary+ifnull(t_award,0)) '月工资' from t_student05;
合并字符串列输出(字符串相加为0连接用concat)
select '¥’+'afa' 查询的是0
查询所有的姓名且去除重复的名字
select distinct(t_name) from t_student05;
查询总共有多少名同学
select count(*) from t_student05;
select count(0) from t_student05;
select count(1) from t_student05;
select count('a') from t_student05;
like子句:查找姓名中包含Gang的所有学生信息
select * from t_student05 where t_name like '%gang%';
显示所有的学生信息,结果按照t_salary 降序排列
select * from t_student05 order by t_salary desc;
显示所有的学生信息,结果按照t_salary 升序排列
2句等价,order by 默认排序就是升序排列 ,asc可以省略
select * from t_student05 order by t_salary asc;
select * from t_student05 order by t_salary ;
显示所有的学生信息,结果按照t_salary 升序排列 ,如果t_salary相同,则按照t_name降序排列
select * from t_student05 order by t_salary asc,t_name desc;
查询基本工资最大值
select max(t_salary) from t_student05;
查询基本工资最小值
select min(t_salary) from t_student05;
查询基本工资总和
select sum(t_salary) from t_student05;
查询基本平均工资(2种方式)
select avg(t_salary) from t_student05;
select sum(t_salary)/count(0) from t_student05;
查询平均工资(2种方式)
select avg(t_salary+ifnull(t_award,0)) from t_student05;
select sum(t_salary+ifnull(t_award,0))/count(0) from t_student05;
按照性别计算最大工资 男生:最大工资 女生:最大工资
//查询2个人群的最大工资
select max(t_salary+ifnull(t_award,0)) from t_student05 group by t_sex;
//查看了女生Female中的最大工资
select max(t_salary+ifnull(t_award,0)) from t_student05 where t_sex='F' group by t_sex;
//查看了男生male 中的最大工资
select max(t_salary+ifnull(t_award,0)) from t_student05 where t_sex='M' group by t_sex;
1.4.1. 分组查询
如果按照某列或多列进行分组,则会按照表中指定的分组列,列值相同的看作一组信息。在分组中,如果使用聚合函数
则每个函数不是对整个表进行统计分析了,而是对每个组进行统计分析。
分组之后,所有的操作是对一组进行操作的。不是对一行进行操作。一组包含1行或多行数据。
在分组中,只有分组的列,或与分组列结构相同的列才能在SELECT之后出现。
1.4.2. select查询语句的语法
select 列1,列2,...
from 表
where 条件
group by 分组条件
having 分组过滤条件
order by 列 asc[默认] desc[降序]
-----查询男生中年薪大于3万的学生姓名,学号,年薪,按年薪的降序排列,如果年薪相同按学号升序排列
select t_stuNo,t_name, (t_salary+ifnull(t_award,0))*12 as nianxin from t_student05 where t_sex='M'
having nianxin>30000 order by nianxin desc, t_stuNo asc;
-----查询男生中年薪最高的男生的学生姓名,学号,年薪
select t_stuNo,t_name, max( (t_salary+ifnull(t_award,0))*12 ) from t_student05 where t_sex='M' (group by t_sex 可省略) ;
注意:select查询的后面,没有使用聚合函数的列,那么该列列名必须出现在select的后面
select 列A,列B,…. from 表1 group by 列A;
--按基本工资的降序排列,取基本工资最高的前3人 的姓名,学号,基本工资。
2种等价
select t_stuNo,t_name,t_salary from t_student05 order by t_salary desc limit 3;
select t_stuNo,t_name,t_salary from t_student05 order by t_salary desc limit 0,3;
---工资第2高的,往下数3个人
select t_stuNo,t_name,t_salary from t_student05 order by t_salary desc limit 1,3;
1.5. NOT NULL 约束
保证数据是否必填,非空限定。
create table t_student1(
t_id int not null,
t_name varchar(30) not null,
t_age int,
t_sex char(2),
t_birthday date)engine=InnoDB;
1.6. UNIQUE 约束
保证列中的值必须唯一,(值不能重复)
create table t_student2(
t_id int unique not null,
t_name varchar(30) not null,
t_age int,
t_sex char(2),
t_birthday date)engine=InnoDB;
1.7. PRIMARY KEY主键约束
什么是主键?
主键是列的约束,主键约束同时满足NOT NULL和UNIQUE,既不能重复,也不能为空。
列被定义为主键后,主键列的值不能重复,也不能为null,就像QQ的用户名、学号、身份证号。主键是表中的标识列,能够唯一标识表中的一行数据,我们可以根据主键查询表中的数据。当创建表时可通过定义PRIMARY KEY约束来创建主键,一个表只能有一个主键。
2种
方式1:
create table t_student3(
t_id int primary key,
t_name varchar(30) not null,
t_age int,
t_sex char(2),
t_birthday date)engine=InnoDB;
方式2
create table t_student4(
t_id int ,
t_name varchar(30) not null,
t_age int,
t_sex char(2),
t_birthday date,
primary key(t_id)
)engine=InnoDB;
1.8. AUTO_INCREMENT
把Null插入到AUTO_INCREMENT列中时,MySQL会自动生成下一个序列编号。
没有为AUTO_INCREMENT列插入值时,也会自动生成序列编号(默认从1开始自增)。
create table t_student5(
t_id int auto_increment primary key,
t_name varchar(30) not null,
t_age int,
t_sex char(2),
t_birthday date
)engine=InnoDB;
insert into t_student5(t_name,t_age,t_sex,t_birthday)
values('jack',10,'F','2013-4-5'),
('jack2',10,'F','2013-4-5');
发现编号从1开始 ,1,2 ,如果此时指定编号,那么按指定编号插入 ,这个时候编号是10
insert into t_student5(t_id,t_name,t_age,t_sex,t_birthday)
values(10,'jack',10,'F','2013-4-5');
接下来如果不指定编号,插入 ,编号从上一条数据截止的编号开始,是11
insert into t_student5(t_name,t_age,t_sex,t_birthday)
values('jack',10,'F','2013-4-5');
接下来,如果再次指定编号
insert into t_student5(t_id,t_name,t_age,t_sex,t_birthday)
values(8,'jack',10,'F','2013-4-5');
1.9. FOREIGN KEY 外键约束
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
班级表(编号,名称,主修科目)
create table t_class(
t_classId int auto_increment primary key,
t_className varchar(30),
t_subject varchar(30)
)engine=InnoDB;
学生表(学号,班级编号,姓名,年龄,性别,生日,工资,奖金)
--添加外键的方式1,在创建表的时候直接指定
create table t_student6(
t_id int auto_increment primary key,
t_classId int not null,
t_name varchar(30) not null,
t_age int,
t_sex char(2),
t_birthday date,
t_salary double,
t_award double,
foreign key(t_classId) references t_class(t_classId)
)engine=InnoDB;
--添加外键的方式2
create table t_student7(
t_id int auto_increment primary key,
t_classId int not null,
t_name varchar(30) not null,
t_age int,
t_sex char(2),
t_birthday date,
t_salary double,
t_award double
)engine=InnoDB;
alter table t_student7 add foreign key(t_classId) references t_class(t_classId);
向班级表中插入数据
insert into t_class(t_className,t_subject)
values('wb17041','java'),
('wb17021','php'),
('wb17031','ios'),
('wb17051','web');
向学生表中插入数据
--此时会有外键约束错误,因为班级编号只能在1,2,3,4里选择
insert into t_student6(t_classId, t_name,t_age,t_sex,t_birthday,t_salary,t_award)
values(6,'jack',10,'F','2013-4-5',4500,200);
insert into t_student6(t_classId, t_name,t_age,t_sex,t_birthday,t_salary,t_award)
values(1,'jack',10,'F','2013-4-5',4500,200),
(2,'tom',10,'F','2013-4-5',5500,200),
(3,'bob',10,'F','2013-4-5',1500,null),
(4,'kate',10,'F','2013-4-5',2500,200),
(1,'jack3',10,'F','2013-4-5',3500,200);
外键的作用
预防插入错误的数据破坏两张表之间的连接关系;
1.10. 多张表连接查询
现在有 A表 ,B表
内连接 :
左连接:
以左表为主表(左表全部显示),右表来匹配左表,如果没有和左表相匹配的数据,以null代替
select …… from 左表 left join 右表 on 条件
右连接:
以 右表为主表(右表全部显示),左表来匹配右表,如果没有和右表相匹配的数据,以null代替
select …… from 左表 right join 右表 on 条件
注意:左连接和右连接可以相互转换 (left—>right, 表的位置互换)
内连接 学生表和班级表中都有数据时才显示 查询学生姓名,以及学生所在的班级名称
select t_student6.t_id, t_student6.t_name, t_class.t_className ,t_class.t_classId
from t_student6 inner join t_class on t_student6.t_classId=t_class.t_classId;
--给表起别名
select s.t_id, s.t_name, c.t_className ,c.t_classId
from t_student6 s inner join t_class c on s.t_classId=c.t_classId;
--给列起别名
select s.t_id '学号', s.t_name '姓名', c.t_className '班级名称' ,c.t_classId '班级编号'
from t_student6 s inner join t_class c on s.t_classId=c.t_classId;
左连接:获取左表所有记录,即使右表没有对应匹配的记录。
select c.t_classId '班级编号', c.t_className '班级名称' , s.t_id '学号', s.t_name '姓名'
from t_class c left join t_student6 s on s.t_classId=c.t_classId;
右连接:获取右表所有记录,即使左表没有对应匹配的记录。
select c.t_classId '班级编号', c.t_className '班级名称' , s.t_id '学号', s.t_name '姓名'
from t_student6 s right join t_class c on s.t_classId=c.t_classId;
作业:
创建数据库 MySchool ,创建学生表Student
,包含(学生学号stuNo(主键),登录密码LoginPwd,姓名stuName,家庭住址Address允许为空,电话号码:Phone,
电子邮箱Email允许为空,年级编号GradeId,出生日期BornDate允许为空,性别 Sex
创建年级表Grade: 年级编号GradeId(主键),年级名称GradeName,不为空
创建科目表Subject:科目编号SubjectId(主键), 科目名称SubjectName,学时ClassHour, 年级编号GradeId,都不为空
成绩表Result: 考试编号Id(主键,自增), 学生学号,stuNo,科目编号SubjectId,考试分数StudentScore,
考试日期 ExamDate ,都不为空
建立主外键关系:
成绩表中:学生学号stuNo 是外键,学生表中:stuNo 是主键
成绩表中:科目编号SubjectId是外键,科目表中 :SubejctId是主键
学生表中: 年级编号GradeId是外键,年级表中:GradeId是主键
科目表中:年级编号GradeId是外键, 年级表中:GradeId是主键
操作:
--学生表中,至少插入5条测试数据
--插入Grade数据,至少3条
--科目表中插入至少4条测试数据
--成绩表中插入至少4条测试数据
--更新 学生表,把Email为空的所有学生Email设置为:'master@School.com'
--在2009-09-13 号考试的所有学生,分数加20分
---删除1991-07-01之后的学生信息
--阶段一:
--查询全部一年级的学生信息
--查询全部二年级的学生的姓名和电话
--查询全部一年级的女同学的信息
--查询课时超过60的科目信息
--阶段二:
--二年级的科目名称
--二年级男同学的姓名和住址
--无电子邮件或为未知的学生姓名和年级信息
select s.t_stuName,s.t_gradeId,g.t_gradeName
from t_Student s
inner join t_grade g
on s.t_gradeId = g.t_gradeId
where s.t_Email = null or s.t_Email = '' or s.t_Email = '未知';
select s.t_stuName,s.t_gradeId,g.t_gradeName
from t_Student s ,t_grade g where s.t_gradeId = g.t_gradeId and
(s.t_Email = null or s.t_Email = '' or s.t_Email = '未知');
--出生日期在1990年之后的二年级的学生姓名和年级信息
--参加了日期为年月日的“HTML和CSS网页技术”科目考试的成绩信息
t_subject 主键表 t_result 外建表 t_subjectId
2表内连接
学号,考试日期,学生分数,科目编号,科目名称
select r. t_stuNo,r.t_ExamDate,r.t_StudentScore, r.t_SubjectId, j.t_subjectName
from t_result r inner join t_subject j
on r.t_SubjectId = j.t_subjectId
where j.t_subjectName = 'HTML和CSS网页技术' and r.t_ExamDate ='2009-7-12';
3表内连接
学号,姓名,考试日期,学生分数,科目编号,科目名称
select r. t_stuNo,s.t_stuName, r.t_ExamDate,r.t_StudentScore, r.t_SubjectId, j.t_subjectName
from t_result r
inner join t_subject j on r.t_SubjectId = j.t_subjectId
inner join t_student s on s.t_stuNo = r.t_stuNo
where j.t_subjectName = 'HTML和CSS网页技术' and r.t_ExamDate ='2009-7-12';
--阶段三:
--查询学生相关信息
--按照出生日期查询S1的学生信息
select * from t_Student
where t_gradeId = (select t_gradeId from t_grade where t_gradeName='S1')
order by t_bornDate;
--查询年龄最小的学生所在的年级及姓名
select s.t_stuName ,s.t_gradeId,g.t_gradeName
from t_student s inner join t_grade g
on s.t_gradeId = g.t_gradeId
order by s.t_bornDate desc limit 1;
--查询科目相关信息
--查询年月日参加“面向对象程序设计”考试的前5名学员成绩信息
select r.t_studentScore from t_result r
inner join t_subject j on r.t_SubjectId = j.t_subjectId
where r.t_ExamDate = '2017-3-12' and j.t_subjectName = '面向对象的程序设计'
order by r.t_studentScore desc
limit 5;
--查询年月日参加考试的最低分出现在哪个科目
select j.t_subjectName from t_result r
inner join t_subject j on r.t_subjectId = j.t_subjectId
where r.t_ExamDate ='2007-7-12'
order by r.t_StudentScore asc
limit 1;
--查询3年级的课时最多的科目名称及课时
select j.t_subjectName,j.t_classHour from t_subject j
inner join t_grade g on j.t_gradeId = g.t_gradeId
where g.t_gradeName = 'Y2'
order by j.t_classHour desc
limit 1;
--查询成绩相关信息
--按日期由前到后、成绩由高到低的次序查询参加编号为的科目考试信息
select r.t_stuNo,r.t_StudentScore,r.t_ExamDate ,j.t_SubjectId,j.t_subjectName
from t_result r
inner join t_subject j on r.t_subjectId = j.t_subjectId
where r.t_subjectid = 8
order by r. t_ExamDate asc,t_StudentScore desc;
--查询学号为“S1101003”的学生参加过的所有考试信息,并按照时间前后次序显示
--查询学号为“S1101003”的学生参加过的所有考试中最高分及时间、科目编号
分数 ,考试日期,科目代号
select max(t_StudentScore),t_ExamDate,t_SubjectId from t_Result where t_stuNo='S1101003';
最高分分数,考试日期,科目代号 ,科目名称, 学号,姓名(3表)
select max(r.t_StudentScore),r.t_ExamDate,r.t_SubjectId , j.t_subjectName,
r.t_stuNo,s.t_stuName
from t_Result r
inner join t_subject j on r.t_subjectId = j.t_subjectId
inner join t_student s on r.t_stuNo = s.t_stuNo
where r.t_stuNo = 'S1101003';