mysql练习(重)

本文展示了SQL的各种操作,包括创建表、添加外键、删除约束、创建索引、删除索引、查询、分组、聚合函数、日期时间操作等。还给出了两个具体场景:一是创建并填充student和course表,查询不同学生考试成绩中优和良的分数;二是建立student和teacher表,插入记录,并新增和查询数据。
摘要由CSDN通过智能技术生成

重要语句

CREATE TABLE student2
(
	s_no int(6) not NULL PRIMARY KEY auto_increment,
	s_name VARCHAR(12),
	s_sex VARCHAR(4),
	s_score DOUBLE(6,1)
);
#外部添加外键的方法  CONSTRAINT取外键名
ALTER TABLE student2 ADD CONSTRAINT fk_tids FOREIGN KEY (t_id) REFERENCES teacher(t_no);
#撤销 FOREIGN KEY 约束,请使用下面的 SQL:
ALTER TABLE student2 DROP FOREIGN KEY fk_tids
#创建唯一索引 如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
CREATE UNIQUE INDEX index_s_name ON student2 (s_name DESC)
#删除唯一索引
DROP INDEX index_s_name ON student2
select * from student2
#创建表
CREATE table teacher(
t_no int(4) not null PRIMARY KEY auto_increment,
t_name VARCHAR(12),
t_sex VARCHAR(4),
t_age VARCHAR(4),
t_tel VARCHAR(11)
);

#笛卡尔积  第一个表的全部语句从第二个表的第一条开始乘
select s.s_name,t.t_name from student2 s,teacher t;  
#返回两张表符合条件的记录
select s.s_name,t.t_name from student2 s,teacher t WHERE s.t_id=t.t_no;  
# 左连接(根据学生查老师)
select * from student2 s left JOIN teacher t on s.t_id =t.t_no;
#右连接(根据老师查学生)
select * from student2 s RIGHT JOIN teacher t on s.t_id =t.t_no;
#内连接
select * from student2 s INNER JOIN teacher t on s.t_id =t.t_no;
#全连接 UNION:去重  UNION all:不去重
select * from student2 s left JOIN teacher t on s.t_id =t.t_no
UNION all
select * from student2 s RIGHT JOIN teacher t on s.t_id =t.t_no;
#SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束:
CREATE TABLE Persons
(
Id_P int NOT NULL ,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
#在表内创建外键的方法:FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
);
#性别分组
select * from student2 GROUP BY s_sex;
#平均分 最高分 最低分 分组
SELECT avg(s_score) as '平均分',max(s_score) as '最高分',MIN(s_score) as '最低分',s_sex as '性别' from student2 GROUP BY s_sex;

select ABS(-123) from dual;
SELECT DATE("2021-9-7") FROM dual;
SELECT NOW() from dual;
SELECT ADDDATE("2021-9-7",3);
SELECT CONCAT("hello","world");
SELECT DATE(now()) from dual;
SELECT DATE_ADD('2018-05-12',INTERVAL 3 MINUTE);
SELECT DATE_SUB('2018-05-12',INTERVAL 2 DAY);
SELECT DATEDIFF('2018-09-07','2018-09-05');
alter table student2 add column birthday date;

#查询和当前事件相差30天的日期
SELECT * FROM student2 where birthday > DATE_SUB(now(),INTERVAL 30 DAY);
SELECT * from student2 WHERE DATEDIFF(birthday,now()) < 30;

#HAVING和 GROUP BY不能连用是版本冲突
SELECT * from student2 where s_score > 80 GROUP BY s_sex HAVING avg(s_score) >=80;

#创建视图

#查询视图
select * from student2_view;

一题

1、用sql建表student:
学号 姓名 性别 生日 专业
1 张三 男 1980-12-03 1
2 王武 女 1980-09-22 3
3 李四 女 1981-03-04 2
4 赵六 女 1981-05-24 1
5 张建国 男 1980-06-02 4
6 赵娟 女 1980-08-30 2

2、用sql建表course:
学号 学期 课程编号 分数
1 1 2 92.0
1 2 2 76.0
2 1 3 60.0
2 2 3 90.0
3 4 1 66.0
3 4 2 NULL
3 4 4 81.0
3 4 6 95.0
5 1 2 67.0
6 1 2 50.0
6 2 2 87.0
6 2 3 86.0

要求:不考虑考试科目和学期,列出不同学生所有考试成绩中,成绩为优的分数的累加值,和成绩为良的分数的平均值。优和良的界线是90分和80分。

CREATE TABLE student3 (
id  int not NULL PRIMARY KEY auto_increment,
s_name VARCHAR(12),
s_sex VARCHAR(8),
s_birthday date ,
s_major int
);
insert into student3(s_name,s_sex,s_birthday,s_major) 
VALUES
('张三','男','1980-12-03',1),
('王武','女','1980-09-22',3),
('李四','女','1981-03-04',2),
('赵六','女','1981-05-24',1),
('张建国','男','1980-06-02',4),
('赵娟','女','1980-08-30',2);


CREATE TABLE course(
sid  int not NULL,
term int,
cid int,
score DOUBLE(6,2)
);
INSERT INTO course(sid,term,cid,score) VALUES
(1,1,2,92.0),
(1,2,2,76.0),
(2,1,3,60.0),
(2,2,3,90.0),
(3,4,1,66.0),
(3,4,2,NULL),
(3,4,4,81.0),
(3,4,6,95.0),
(5,1,2,67.0),
(6,1,2,50.0),
(6,2,2,87.0),
(6,2,3,86.0);
ALTER TABLE course ADD CONSTRAINT fk_sid FOREIGN KEY (sid) REFERENCES student3(id);
SELECT * from course;
#要求不考虑考试科目和学期,列出不同学生所有考试成绩中,成绩为优的分数的累加值,和成绩为良的分数的平均值。优和良的界线是90分和80分
select sum(score) as '累加值' from course c,student3 s WHERE c.sid = s.id and score>=90;
select avg(score) as '平均值' from course c,student3 s WHERE c.sid = s.id and 80<score<90;

二题
1.建表:
Student(
学号:s_id 整型 主键 ,
姓名:name 字符型 ,
电话:Tel 字符型,
学历:Content 字符型,
毕业日期:Date 日期型,
教师编号:teacher_id 整型,外键)

2.插入记录:

s_id Name Tel Content Date teacher_id

1 张三 13333663366 大专毕业 2006-10-11 1
2 张三 13612312331 本科毕业 2006-10-15 2
3 张四 021-55665566 中专毕业 2006-10-16 3
4 张五 021-55665566 大专毕业 2006-10-16 2
5 张六 021-55665566 大专毕业 2006-10-18 3
6 张七 021-55665566 中专毕业 2006-10-12 1

3.建表:
Teacher(
教师编号:t_id 整型 主键 ,
姓名:name 字符型 ,
年龄:age 整型,
地址:address 字符型)

2.插入记录:
t_id name age address

1 张老师 38 成都
2 李老师 42 北京
3 王老师 35 上海

要求:

(a) 有一新记录(小王 13254748547 高中毕业 2007-05-06 1)请用SQL语句新增至表student中;

(b)请统计不同教师所教授学生的总数以及学历为大专以上的学生总数,并按照教师姓名进行分组显示;

create table student4(
	s_id int not null primary key auto_increment,
	s_name varchar(5),
	s_tel varchar(11),
	s_content varchar(20),
	s_date date,
	t_id int
);
ALTER table student4 ADD CONSTRAINT fk_tid FOREIGN key(t_id) REFERENCES teacher2(tid);

insert into student4(s_name,s_tel,s_content,s_date,t_id) values
('张三',13333663366,'大专毕业','2006-10-11',1),
('张三',13612312331,'本科毕业','2006-10-15',2),
('张四',021-55665566,'中专毕业','2006-10-16',3),
('张五',021-55665566,'大专毕业','2006-10-16',2),
('张六',021-55665566,'大专毕业','2006-10-18',3),
('张七',021-55665566,'中专毕业','2006-10-12',1);

CREATE table teacher2 (
tid int PRIMARY KEY auto_increment,
t_name VARCHAR(20),
t_age int,
t_address VARCHAR(20)
)
INSERT into teacher2(t_name,t_age,t_address) VALUES
('张老师',38,'成都'),
('李老师',42,'北京'),
('王老师',35,'上海');

#有一新记录(小王 13254748547 高中毕业 2007-05-06  1)请用SQL语句新增至表student中;
insert into student4(s_name,s_tel,s_content,s_date,t_id) 
values
('小王','13254748547','高中毕业','2007-05-06',1);

#请统计不同教师所教授学生的总数以及学历为大专以上的学生总数,并按照教师姓名进行分组显示;
select count(*) as '学生总数',t.t_name from student4 s left join teacher2 t on s.t_id = t.tid where s.s_content like '本科%'  group by t.t_name;

select t.t_name as '教师姓名',COUNT(s.t_id) as '大专以上人数' from student4 s,teacher2 t where s.t_id = t.tid and (s.s_content <> '大专毕业' and s.s_content <> '高中毕业' and s.s_content <> '中专毕业')   GROUP BY t.t_name HAVING COUNT(s.s_name);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值