面试前必看基础sql语句

面试前必看基础sql语句

面试常用4表

学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)

建表

begin;
DROP TABLE IF EXISTS `Teacher`;

CREATE TABLE `Teacher`
(
    `Tno`       varchar(3)  NOT NULL comment '教师编号',
    `Tname`     varchar(4)  NOT NULL comment '老师姓名',
    `Tsex`      varchar(2)  NOT NULL comment '老师性别',
    `Tbirthday` date       DEFAULT NULL comment '老师生日',
    `Tprof`     varchar(6) DEFAULT NULL comment '老师职称',
    `Depart`    varchar(10) NOT NULL comment '老师专业',
    PRIMARY KEY (`Tno`)
) ENGINE = InnoDB
  CHARSET = utf8;


INSERT INTO `Teacher` ( `Tno`, `Tname`, `Tsex`, `Tbirthday`, `Tprof`
                      , `Depart`)
VALUES ('804', '李诚', '男', '1958-12-02', '副教授', '计算机系'),
       ('825', '王萍', '女', '1972-05-05', '助教', '计算机系'),
       ('831', '刘冰', '女', '1977-08-14', '助教', '电子工程系'),
       ('856', '张旭', '男', '1969-03-12', '讲师', '电子工程系');


DROP TABLE IF EXISTS `Course`;

CREATE TABLE `Course`
(
    `Cno`   varchar(5)  NOT NULL comment '课程号',
    `Cname` varchar(10) NOT NULL comment '查看名',
    `Tno`   varchar(3)  NOT NULL comment '授课教师编号',
    PRIMARY KEY (`Cno`),
    KEY `Tno` (`Tno`),
    CONSTRAINT `Course_ibfk_1` FOREIGN KEY (`Tno`) REFERENCES `Teacher` (`Tno`)
) ENGINE = InnoDB
  CHARSET = utf8;

INSERT INTO `Course` (`Cno`, `Cname`, `Tno`)
VALUES ('3-105', '计算机导论', '825'),
       ('3-245', '操作系统', '804'),
       ('6-166', '数字电路', '856'),
       ('9-888', '高等数学', '831');

/*Table structure for table `Score` */
DROP TABLE IF EXISTS `Score`;

/*Table structure for table `Student` */
DROP TABLE IF EXISTS `Student`;

CREATE TABLE `Student`
(
    `Sno`       varchar(3) NOT NULL comment '学生学号',
    `Sname`     varchar(8) NOT NULL comment '学生姓名',
    `Ssex`      varchar(2) NOT NULL comment '学生性别',
    `Sbirthday` date       DEFAULT NULL comment '学生出生年月',
    `Sclass`    varchar(5) DEFAULT NULL comment '学生所在班级',
    PRIMARY KEY (`Sno`)
) ENGINE = InnoDB
  CHARSET = utf8;

INSERT INTO `Student` (`Sno`, `Sname`, `Ssex`, `Sbirthday`, `Sclass`)
VALUES ('101', '李军', '男', '1976-02-20', '95033'),
       ('103', '陆君', '男', '1974-06-03', '95031'),
       ('105', '匡明', '男', '1975-10-02', '95031'),
       ('107', '王丽', '女', '1976-01-23', '95033'),
       ('108', '曾华', '男', '1977-09-01', '95033'),
       ('109', '王芳', '女', '1975-02-10', '95031');

/*Table structure for table `Teacher` */

CREATE TABLE `Score`
(
    `Sno`    varchar(3) NOT NULL comment '学号',
    `Cno`    varchar(5) NOT NULL comment '课程号',
    `Degree` decimal(4, 1) DEFAULT NULL comment '成绩',
    PRIMARY KEY (`Sno`, `Cno`),
    KEY `Cno` (`Cno`),
    CONSTRAINT `Score_ibfk_1` FOREIGN KEY (`Sno`) REFERENCES `Student` (`Sno`),
    CONSTRAINT `Score_ibfk_2` FOREIGN KEY (`Cno`) REFERENCES `Course` (`Cno`)
) ENGINE = InnoDB
  CHARSET = utf8;

INSERT INTO `Score` (`Sno`, `Cno`, `Degree`)
VALUES ('101', '3-105', '64.0'),
       ('101', '6-166', '85.0'),
       ('103', '3-105', '92.0'),
       ('103', '3-245', '86.0'),
       ('105', '3-105', '88.0'),
       ('105', '3-245', '75.0'),
       ('107', '3-105', '91.0'),
       ('107', '6-166', '79.0'),
       ('108', '3-105', '78.0'),
       ('108', '6-166', '81.0'),
       ('109', '3-105', '76.0'),
       ('109', '3-245', '68.0');

commit;

表内容

学生表图片.png

sql语句练习

1.查询与李军选至少一门相同课的所有学生姓名

select distinct Sname
from Student join Score on Student.Sno = Score.Sno
where Cno in (select distinct Cno from Student, Score where Student.Sno = Score.Sno and Sname = '李军');

2.查询与李军选至少2门相同课的所有学生姓名

select Sname
from score join Student on score.Sno = Student.Sno
where Cno IN (select distinct Cno from Student, Score where Student.Sno = Score.Sno and Sname = '李军') and Sname!='李军'
group by Score.Sno having count(*)>1;

3.查询与学号为101的同学选至少2门相同课的所有学生姓名

SELECT Sname
FROM student JOIN score s1 ON s1.Sno = student.Sno
WHERE EXISTS (
              SELECT Sno
              FROM score s2
              WHERE s1.Sno != 101 and
                      s2.Sno = 101 and
                      s1.Cno = s2.Cno
          )
GROUP BY s1.Sno
HAVING COUNT(Cno) > 1;







3张表

学生表(Student)、课程表(Course)、成绩表(Score)

建表

begin;
-- (1)创建Student表
CREATE TABLE Student
(
    Sno   CHAR(8) PRIMARY KEY,
    Sname CHAR(8),
    Ssex  CHAR(2) NOT NULL,
    Sage  INT,
    Sdept CHAR(20)
);
-- (2)创建Course表
CREATE TABLE Course
(
    Cno     CHAR(4) PRIMARY KEY,
    Cname   CHAR(40) NOT NULL,
    Cpno    CHAR(4),
    Ccredit SMALLINT
);
-- (3)创建SC表
CREATE TABLE SC
(
    Sno   CHAR(8),
    Cno   CHAR(4),
    Grade SMALLINT,
    CONSTRAINT `SC_ibfk_1` FOREIGN KEY (Sno) REFERENCES Student (Sno),
    CONSTRAINT `SC_ibfk_2` FOREIGN KEY (Cno) REFERENCES Course (Cno)

);



-- (6)修改表结构及约束
--  增加班级列
ALTER TABLE Student
    ADD Sclass char(4);
--  修改年龄列
ALTER TABLE Student
    MODIFY Sage smallint;
--  增加约束
ALTER TABLE Course
    ADD UNIQUE (Cname);
-- (7)删除表


-- (1)为Course表按课程名称创建索引
CREATE INDEX cname_index On Course (Cname);
-- (2)为Student表按学生姓名创建唯一索引
CREATE UNIQUE INDEX sname_index ON Student (Sname);
-- (3)为SC表按学号和课程号创建聚集索引
CREATE INDEX sno_cno_index On SC (Sno, Cno desc);

-- (4)为Course表按课程号创建唯一索引
CREATE UNIQUE INDEX iSCno ON Course (Cno);


-- 3.创建视图
-- 建立信息系学生的视图:

CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept = 'IS';


-- (1)插入到Student表

INSERT INTO Student
VALUES ('20100001', '李勇', '男', 20, 'CS', '1001'),
       ('20100002', '刘晨', '女', 19, 'CS', '1001');

INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept, Sclass)
VALUES ('20100021', '王敏', '女', 18, 'MA', '1002'),
       ('20100031', '张立', '男', 19, 'IS', '1003');

INSERT INTO Student(Sno, Sname, Ssex, sclass)
VALUES ('20100003', '刘洋', '女', '1001');


INSERT INTO Student(Sno, Sname, Ssex, Sage, Sdept, sclass)
VALUES ('20100010', '赵斌', '男', '19', 'IS', '1005');

INSERT INTO Student
VALUES ('20100022', '张明明', '男', 19, 'CS', '1002');


-- (2)插入到Course表

INSERT INTO Course(Cno, Cname, Cpno, Ccredit)
VALUES ('1', '数据库系统原理', '5', 4);
INSERT INTO Course(Cno, Cname, Cpno, Ccredit)
VALUES ('2', '高等数学', null, 2);
INSERT INTO Course(Cno, Cname, Cpno, Ccredit)
VALUES ('3', '管理信息系统', '1', 4);

-- 请写出插入其余行的插入语句,并插入数据。
INSERT INTO Course(Cno, Cname, Cpno, Ccredit)
VALUES ('6', '数据处理', null, '2');
INSERT INTO Course(cno, cname, cpno, ccredit)
values ('7', 'c语言', null, '4');

-- (3)插入到SC表
INSERT INTO SC
VALUES ('20100001', '1', 92);
INSERT INTO SC
VALUES ('20100002', '2', 80);
INSERT INTO SC(Sno, Cno)
VALUES ('20100003', '1');
INSERT INTO SC(Sno, Cno, Grade)
VALUES ('20100010', '3', null);

-- 请写出插入其余行的插入语句,并插入数据。
INSERT INTO SC
VALUES ('20100002', '2', 85);
INSERT INTO SC
VALUES ('20100002', '3', 88);
INSERT INTO SC
VALUES ('20100002', '1', 90);


commit ;

表内容

学校数据库实验student表.png

sql语句练习

1.为SC表按学号和课程号创建聚集索引

CREATE CLUSTERED INDEX iSnoCno On SC(Sno,Cno desc)

3.为Course表按课程号创建唯一索引

CREATE UNIQUE INDEX iSCno ON Course(Cno)

4.填写赵斌同学的管理信息系统课程的成绩

UPDATE SC SET Grade = 85
 WHERE Sno='20100010' AND Cno='3'

5.将计算机科学系全体学生的成绩加5分

UPDATE sc SET Grade=Grade + 5
 WHERE 'CS'=(select Sdept from student where student.Sno=sc.Sno)

删除计算机科学系所有学生的选课记录

DELETE FROM SC WHERE 'CS'=(select Sdept from student where student.Sno=SC.Sno );

查询全体学生的姓名、出生年份和所有系,要求用小写字母表示所有系名。

SELECT Sname, 'Year of Birth:' as BIRTH, 2000-Sage BIRTHDAY, DEPARTMENT = LOWER(Sdept)
FROM Student;

查询选修了课程的学生学号:比较ALL和DISTINCT的区别

SELECT Sno FROM SC;
SELECT DISTINCT Sno FROM SC;

按范围查询
查询年龄在20~23岁之间的学生的姓名、系别和年龄

SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23

查询属性值属于指定集合的行
查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别

SELECT Sname,Ssex FROM Student WHERE Sdept IN ('IS','MA','CS');

模糊查询
查询所有姓刘学生的姓名、学号和性别

SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%'

查询空值
查询缺少成绩的学生的学号和相应的课程号

SELECT Sno,Cno FROM sc WHERE Grade is null;


系别和年龄

SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23

查询属性值属于指定集合的行
查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别

SELECT Sname,Ssex FROM Student WHERE Sdept IN ('IS','MA','CS');

模糊查询
查询所有姓刘学生的姓名、学号和性别

SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE '刘%'

查询空值
查询缺少成绩的学生的学号和相应的课程号

SELECT Sno,Cno FROM sc WHERE Grade is null;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值