MySQL

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年之后的二年级的学生姓名和年级信息

 

--参加了日期为年月日的“HTMLCSS网页技术科目考试的成绩信息

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 = 'HTMLCSS网页技术'  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 = 'HTMLCSS网页技术'  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';

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值