保姆级别mysql 基础练习题

Student建表语句
CREATE TABLE `student`(
	`studentno` INT(4) NOT NULL COMMENT '学号',
    `loginpwd` VARCHAR(20) DEFAULT NULL,
    `studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
    `sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',
    `gradeid` INT(11) DEFAULT NULL COMMENT '年级编号',
    `phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空',
    `address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空',
    `borndate` DATETIME DEFAULT NULL COMMENT '出生时间',
    `email` VARCHAR (50) NOT NULL COMMENT '邮箱账号允许为空',
    `identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
    PRIMARY KEY (`studentno`),
    UNIQUE KEY `identitycard`(`identitycard`),
    KEY `email` (`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;
数据插入:
INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1000,'15656','张龙',0,2,'13800001234','北京朝阳','1980-1-1','[email protected]','235656198001011234'),
(1001,'123456','赵虎',0,2,'13800004562','北京房山','1982-2-1','[email protected]','452456198001011234'),
(1002,'122456','王朝',0,2,'13800001458','湖南湘潭','1452-3-1','[email protected]','123586198001011234'),
(1003,'123456','马汉',0,2,'13800003551','江西九江','1982-8-1','[email protected]','123126198001011234'),
(1004,'178456','狄仁杰',0,2,'13800005425','湖南长沙','1580-3-1','[email protected]','121456198001011234'),
(1005,'121356','李元芳',0,2,'13800005123','四川绵阳','1680-5-1','[email protected]','189456198001011234'),
(1007,'163454','德玛西',0,2,'13800004452','北京西单','1780-4-1','[email protected]','223456198001011234'),
(1008,'123586','桥本菜',0,2,'13800007851','日本东京','1680-9-1','[email protected]','125556198001521234'),
(1009,'123126','王撕葱',0,2,'13800001241','贵州贵阳','1988-1-5','[email protected]','123454198045661234'),
(1010,'123474','林更新',0,2,'13800008795','贵州毕节','1981-1-4','[email protected]','123456198001247234'),
(1011,'123698','王羲之',0,2,'13800001241','云南大理','1945-1-7','[email protected]','123456198001451234'),
(1012,'123321','李清照',0,2,'13800002541','甘肃兰州','1969-1-4','[email protected]','123456198001041234'),
(1013,'123785','鲁讯迅',0,2,'13800008965','四川成都','1978-1-6','[email protected]','123456198001011234'),
(1014,'123146','赵强',1,3,'13800001235','广东深圳','1990-1-7','[email protected]','123456199001011233');
grade表建表语句
CREATE TABLE `grade`(
	`gradeid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
    PRIMARY KEY (`gradeid`)
) ENGINE=INNODB AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;

grade表数据插入语句
INSERT INTO `grade` (`gradeid`,`gradename`) VALUES(0,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'预科班');
Subject建表语句
CREATE TABLE `subject`(
	`subjectno`INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
    `subjectname` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
    `classhour` INT(4) DEFAULT NULL COMMENT '学时',
    `gradeid` INT(4) DEFAULT NULL COMMENT '年级编号',
    PRIMARY KEY (`subjectno`)
)ENGINE = INNODB AUTO_INCREMENT = 19 DEFAULT CHARSET = utf8;
Subject数据插入语句
INSERT INTO `subject`(`subjectno`,`subjectname`,`classhour`,`gradeid`)VALUES
(1,'高等数学-1',110,1),
(2,'高等数学-2',110,2),
(3,'高等数学-3',100,3),
(4,'高等数学-4',130,4),
(5,'C语言-1',110,1),
(6,'C语言-2',110,2),
(7,'C语言-3',100,3),
(8,'C语言-4',130,4),
(9,'Java程序设计-1',110,1),
(10,'Java程序设计-2',110,2),
(11,'Java程序设计-3',100,3),
(12,'Java程序设计-4',130,4),
(13,'数据库结构-1',110,1),
(14,'数据库结构-2',110,2),
(15,'数据库结构-3',100,3),
(16,'数据库结构-4',130,4),
(17,'C#基础',130,1);
result建表语句
CREATE TABLE `result`(
	`studentno` INT(4) NOT NULL COMMENT '学号',
    `subjectno` INT(4) NOT NULL COMMENT '课程编号',
    `examdate` DATETIME NOT NULL COMMENT '考试日期',
    `studentresult` INT (4) NOT NULL COMMENT '考试成绩',
    KEY `subjectno` (`subjectno`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;
数据插入语句
INSERT INTO `result`(`studentno`,`subjectno`,`examdate`,`studentresult`)
VALUES
(1000,1,'2013-11-11 16:00:00',85),
(1000,2,'2013-11-12 16:00:00',70),
(1000,3,'2013-11-11 09:00:00',68),
(1000,4,'2013-11-13 16:00:00',98),
(1000,5,'2013-11-14 16:00:00',58);
一、查询指定字段
1、-- 查询全部学生 select 字段 from 表名
SELECT * FROM student;
2、-- 查询指定字段
SELECT `studentno`,`studentname` FROM student;
3、-- 别名,给结果起一个名字
SELECT `studentno` AS 学号,`studentname` AS 姓名 FROM student;
4、-- 别名,给结果起一个名字,也可以给表起别名
SELECT `studentno` AS 学号,`studentname` AS 姓名 FROM student AS s;
5、-- 函数 concat(a,b)
SELECT CONCAT('姓名:',studentName) AS 新名字 FROM student;

二、去重
1、-- 查询一下那些同学参加了考试,成绩
SELECT DISTINCT `studentno` FROM result;
2、 -- 自增步长
SELECT @@auto_increment_increment
3、-- 查询mysql版本
SELECT  VERSION()
4、-- 学生考试成绩+1查看
SELECT `studentno`,`studentresult`+1 AS '加分后' FROM result;

三、where字句
1、-- 查询考试成绩在95-100分之间
SELECT `studentno`,`studentresult`FROM result WHERE `studentresult`>=95 AND `studentresult`<=100;
2、-- 模糊查询(区间)
SELECT `studentno`,`studentresult` FROM result WHERE `studentresult` BETWEEN 95 AND 100;
3、-- 除了1000号学生之外的同学的成绩
SELECT `studentno`,`studentresult` FROM result WHERE `studentno`!=1000;
4、--!=  not
SELECT `studentno`,`studentresult` FROM result WHERE NOT `studentresult`=1000;

四、模糊查询
1、-- 查询姓李的同学
SELECT `studentno`,`studentname` FROM student WHERE `studentname` LIKE '李%'; 
2、-- 查询1001,1002,1003号学生
SELECT `studentno`,`studentname` FROM student
WHERE `studentno` IN (1001,1002,1003);
3、-- 查询在北京朝阳的学生
SELECT `studentno`,`studentname` FROM student
WHERE `address` IN ('北京朝阳');

五、连表查询  join
-- join(连接的表) on(判断条件) 连接查询
--where on 等值查询
1、-- 查询参加了考试的同学(学号,姓名,科目编号,分数)
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM student AS s 
INNER JOIN result AS r;
WHERE s.`studentno`=r.`studentno`;
2、-- right join
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM student AS s
RIGHT JOIN result AS r
ON s.`studentno`=r.`studentno`;
3、--left join
SELECT s.`studentno`,`studentname`,`subjectno`,`studentresult`
FROM student AS s
LEFT JOIN result AS r
ON s.`studentno`=r.`studentno`;

操作	描述
Inner join	如果表中至少有一个匹配,就返回没有匹配
Left join	会从左表中返回所有的值,即使右边没有匹配
Right join	会从右表中返回所有的值,即使左表中没有匹配


4、-- 查询参加了考试的同学的信息,学号,学生姓名,科目名,分数
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM student AS s
RIGHT JOIN result AS r
ON r.`studentno`=s.`studentno`
INNER JOIN `subject` AS sub
ON r.`subjectno`=sub.`subjectno`;

category表创建语句
CREATE TABLE `category` (
	`categoryid` INT(10) NOT NULL COMMENT '主题ID',
	`pid` INT(10) NOT NULL COMMENT '父ID',
	`categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
	PRIMARY KEY(categoryid)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET = utf8;
数据插入语句
INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) VALUES (2, 1, '信息技术');
INSERT INTO `CATEGOrY` (`categoryid`, `pid`, `categoryname`) VALUES (3, 1, '软件开发');
INSERT INTO `category` (`categoryid`, `PId`, `categoryname`) VALUES (5, 1, '美术设计');
INSERT INTO `category` (`categoryid`, `pid`, `categorynamE`) VALUES (4, 3, '数据库'); 
INSERT INTO `category` (`CATEgoryid`, `pid`, `categoryname`) VALUES (8, 2, '办公信息');
INSERT INTO `category` (`categoryid`, `pid`, `CAtegoryname`) VALUES (6, 3, 'web开发'); 
INSERT INTO `category` (`categoryid`, `pid`, `categoryname`) VALUES (7, 5, 'ps技术');


六、自连接
自己的表和自己的表连接,即一张表拆为两张一样的表即可

1、-- 查询父子信息(把两张表看成一模一样的表)
SELECT a.`categoryName` AS  '父栏目',b.`categoryName` AS '子栏目'
FROM `category` AS a,`category` AS b
WHERE a.`categoryid`=b.`pid`;

2、-- 查询学员所属的年级(学号,学生的姓名,年级名称)
SELECT `studentno`,`studentname`,`gradename`
FROM student AS s
INNER JOIN `grade` AS g
WHERE s.`gradeid`=g.`gradeid`;

3、-- 查询科目所属的年级
SELECT `subjectname`,`gradename`
FROM `subject` AS sub
INNER JOIN `grade` AS g
WHERE sub.`gradeid`=g.`gradeid`;
4、-- 查询参加了高等数学考试的学生信息:学号,学生姓名,科目名,分数
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM student AS s
INNER JOIN `result` AS r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` AS sub
ON r.`subjectno`=sub.`subjectno`
WHERE `subjectname`='高等数学-1';

--  ========分页limit 和排序 order by
1、-- 查询参加了高等数学考试的学生信息:学号,学生姓名,科目名,分数 并进行降序排序
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM student AS s
INNER JOIN `result` AS r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` AS sub
ON r.`subjectno`=sub.`subjectno`
WHERE `subjectname`='高等数学-1'
ORDER BY `studentresult` ASC;

2、-- 查询java第一学年 课程成绩排名前十的学生, 并且分数要大于80的学生信息(学号,姓名,课程名称,分数)
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM student AS s
INNER JOIN result AS r
ON s.`studentno`=r.`studentno`
INNER JOIN `subject` AS sub
ON r.`subjectno`=sub.`subjectno`
ORDER BY `studentresult` DESC
LIMIT 0,10;

七、子查询
-- 1、查询高等数学-1的所有考试结果(学号,科目编号,成绩),降序排列
SELECT `studentno`,r.`subjectno`,`studentresult`
FROM `result` AS r
INNER JOIN `subject` AS sub
ON r.`subjectno`=sub.`subjectno`
WHERE `subjectname` = '高等数学-1'
ORDER BY `studentresult` DESC;

 2、查询高等数学-1的所有考试结果(学号,科目编号,成绩),降序排列(方式二)
SELECT `studentno`,`subjectno`,`studentresult`
FROM result 
WHERE `subjectno` =ANY(
	SELECT `subjectno` FROM `subject`
	WHERE `subjectname`='高等数学-1'
)

3、-- 分数不小于80分的学生的学号和姓名
SELECT s.`studentno`,s.`studentname`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`studentno`=r.`studentno`
WHERE r.`studentresult`>=80;

4、-- 高等数学-2,分数不小于80分的学生的学号和姓名
SELECT s.`studentno`,s.`studentname`
FROM `student` AS s
INNER JOIN `result` AS r
ON s.`studentno`=r.`studentno`
INNER JOIN`subject` AS sub
ON r.`subjectno`=sub.`subjectno`
WHERE r.`studentresult`>=80 
AND `subjectname`='高等数学-3';

5、-- 查询课程为 高等数学-2 
-- 且分数不小于80的同学的学号和姓名
SELECT `studentno`,`studentname` FROM student 
WHERE `studentno` IN(
	SELECT `studentno` FROM `result` WHERE `studentresult` >80 AND `subjectno`=ANY(
	SELECT `subjectno` FROM `subject` WHERE `subjectname`='高等数学-2'
	)
)

八、常用函数
-- 数学运算
SELECT ABS(-8);  -- 绝对值
SELECT CEILING(6.5); -- 向上取整
SELECT FLOOR(6.5);   -- 向下取整
SELECT RAND(); -- 返回0-1的随机数
SELECT SIGN(-5); -- 判断一个数的符号,正数返回1,负数返回-1


-- 字符串
SELECT CHAR_LENGTH('众里寻他千百度,那人却在灯火阑珊处'); -- 返回字符串长度
SELECT CONCAT('我','爱','你'); -- 字符串拼接
SELECT INSERT('我喜欢你',2,2,'讨厌'); -- 字符串替换,从那个位置开始,替换几个字符
SELECT LOWER('TANKE'); -- 大写转小写
SELECT UPPER('tanke'); -- 小写转大写
SELECT REPLACE('失败是成功之母','之母','他妈'); -- 字符串替换

-- 时间日期函数
SELECT CURRENT_DATE(); -- 获取当前日期
SELECT CURDATE(); -- 获取当前日期
SELECT NOW(); -- 获取当前时间
SELECT LOCALTIME(); -- 本地时间
SELECT SYSDATE(); -- 系统时间

1、-- 查询不同课程课程的平均分,最高分,最低分
SELECT `subjectname`, AVG(`studentresult`),MAX(`studentresult`),MIN(`studentresult`)
FROM `subject` AS s
INNER JOIN `result` AS r
ON s.`subjectno`=r.`subjectno`
GROUP BY s.`subjectname`;
2、-- 查询不同课程课程的平均分,最高分,最低分,平均分大于80
SELECT `subjectname`, AVG(`studentresult`) AS 平均分,MAX(`studentresult`) AS 最高分,MIN(`studentresult`) AS 最低分
FROM `subject` AS s
INNER JOIN `result` AS r
ON s.`subjectno`=r.`subjectno`
GROUP BY s.`subjectname`
HAVING 平均分>80;


猜你喜欢

转载自blog.csdn.net/weixin_46457946/article/details/119644073