一、查询的稳固和学习
下方所有的代码的查询语句,[ ]表示可选择的语句,{ }表示必须写的 | 表示或者的意思
1.查询的先后顺序:
select
[all默认 | distanct 去重]
{* | table_name.* | field | table_name.filed as 别名…}
from
table_name as 别名
[inner | right | left join table_name2 as 别名…]
[on 关联的条件]
[where 添加的条件]
[group by 根据字段名进行分组]
[having 分组的筛选条件]
[order by 排序的字段 ,asc是升序,默认的是升序,desc 是降序]
[limit 起始索引,每页显示的数据条数]
二、新的SQL语句
首先创建几个表
#1.创建学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`studentNo` int(11) NOT NULL COMMENT '学生编号',
`studentName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学生姓名',
`sex` tinyint(255) NULL DEFAULT NULL COMMENT '学生性别',
`gradeid` int(11) NULL DEFAULT NULL COMMENT '年级编号',
`phone` int(255) NULL DEFAULT NULL COMMENT '手机号',
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学生地址',
`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学生邮箱',
`bornDate` datetime NULL DEFAULT NULL COMMENT '出生日期',
PRIMARY KEY (`studentNo`) USING BTREE,
INDEX `student_studentname_index`(`studentName`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '小猪佩奇', 0, 1, 4561324, '山上', '[email protected]', '2019-03-08 23:18:17');
INSERT INTO `student` VALUES (2, '小猪乔治', 1, 2, 4561324, '山上', '[email protected]', '2019-04-02 23:19:56');
INSERT INTO `student` VALUES (3, '苏溪', 0, 2, 132456, '斜坡下', '[email protected]', '2019-03-08 23:21:36');
INSERT INTO `student` VALUES (4, '姆巴佩', 1, 4, NULL, '斜坡下', NULL, NULL);
SET FOREIGN_KEY_CHECKS = 1;
#2.创建结果表
DROP TABLE IF EXISTS `result`;
CREATE TABLE `result` (
`studentNo` int(11) NULL DEFAULT NULL COMMENT '学生编号',
`subjectNo` int(11) NULL DEFAULT NULL COMMENT '课程编号',
`examDate` datetime NULL DEFAULT NULL COMMENT '考试时间',
`studentResult` double(10, 0) NULL DEFAULT NULL COMMENT ' '
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of result
-- ----------------------------
INSERT INTO `result` VALUES (1, 3, '2019-03-20 23:29:49', 50);
INSERT INTO `result` VALUES (3, 3, '2019-03-19 23:30:30', 70);
INSERT INTO `result` VALUES (2, 1, '2019-03-29 23:31:06', 100);
INSERT INTO `result` VALUES (4, 1, '2019-03-13 12:12:30', 30);
INSERT INTO `result` VALUES (5, 1, '2019-03-05 12:12:45', 90);
#3.创建科目表
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject` (
`subjectNo` int(11) NOT NULL COMMENT '课程编号',
`subjectName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '课程名称',
`classHour` int(255) NULL DEFAULT NULL COMMENT '课时',
`gradeID` int(255) NULL DEFAULT NULL COMMENT '年级编号',
PRIMARY KEY (`subjectNo`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of subject
-- ----------------------------
INSERT INTO `subject` VALUES (1, 'java基础语法', 120, 1);
INSERT INTO `subject` VALUES (2, 'java面向对象', 180, 2);
INSERT INTO `subject` VALUES (3, 'MySQL数据库', 200, 2);
INSERT INTO `subject` VALUES (4, 'Web前段', 180, 2);
INSERT INTO `subject` VALUES (5, '人工智能', 130, 3);
#4.创建category表
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
`id` int(11) NOT NULL COMMENT '栏目id',
`categoryName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '栏目名称',
`pid` int(11) NULL DEFAULT NULL COMMENT '栏目父id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of category
-- ----------------------------
INSERT INTO `category` VALUES (1, '射击游戏', NULL);
INSERT INTO `category` VALUES (2, '角色扮演', NULL);
INSERT INTO `category` VALUES (3, '益智游戏', NULL);
INSERT INTO `category` VALUES (4, '穿越火线', 1);
INSERT INTO `category` VALUES (5, '吃鸡', 1);
INSERT INTO `category` VALUES (6, '连连看', 3);
INSERT INTO `category` VALUES (7, '2048', 3);
1.掌握排序order by 的使用
#练习1:将学生信息以成绩的升序展示 asc表示升序 desc表示降序
select
*
from
result
order by
studentResult DESC;
#练习2:将学生信息通过链表查询查询出来,并且按照降序展示
select
stu.studentName '姓名' ,sub.subjectName '科目',
r.studentResult '成绩', r.examDate '考试时间'
from
result r , student stu, subject sub
where
r.studentNo = stu.studentNo and
r.subjectNo = sub.subjectNo
order by
r.studentResult desc;
#练习3:将学生信息以成绩的升序展示 asc表示升序 desc表示降序
然后再添加时间降序
#注意,如果涉及多个字段,每个字段都必须进行排序的指定,多个字段的排序会按照字段的优先顺序,进行相应的排序
SELECT
stu.studentName '姓名',sub.subjectName '科目',
r.studentResult '成绩',r.examDate '考试时间'
FROM
result r,student stu,`subject` sub
WHERE
r.studentNo = stu.studentNo
AND r.subjectNo = sub.subjectNo
order by
r.studentResult DESC, r.examDate asc;
2.掌握Limit的分页使用,仅仅在MySQLzhong 存在
#Limit 数据的起始索引,数据显示的条数
#查询第一页的数据,每一页显示2条信息
#limit 0,2
#练习1:
select
*
from
category
limit 0,2;
#查询第三页的数据,每一页的显示的数据条数为2条
#起始索引和页的数的公式:(当前页-1)*每页显示条数
#练习2
select
*
from
category
limit 4,2;
#练习3查询学生学号,姓名,成绩,时间,按照成绩和时间进行排序降序,分页进行查询,每页显示一条信息
SELECT
r.studentNo '学号',stu.studentName '姓名',
sub.subjectName '科目',r.studentResult '成绩',
r.examDate '时间'
FROM
result r,student stu,`subject` sub
WHERE
r.studentNo = stu.studentNo
AND
r.subjectNo = sub.subjectNo
order by r.studentResult desc, r.examDate desc
limit 2,1
#采用子查询进行连接查询,子查询可以放在查询语句的任何地方
select
sub.subjectName '科目',
(select g.gradeName from frade g where g.gradeId = sub.gradeId)'年级'
from
subject sub;
#采用子查询作为多查询语句的联合
#练习:查询高等数学成绩比贾斯文高的学生信息
#1.查询高等数学对应的编号
SELECT
sub.subjectNo
FROM
`subject` sub
WHERE
sub.subjectName = '高等数学';
#2.查询贾斯文对应的学生编号
SELECT
stu.studentNo
FROM
student stu
WHERE
stu.studentName = '贾斯文';
#3.查询贾斯文的成绩
SELECT
r.studentResult
FROM
result r
WHERE r.studentNo = 1003;
#4.``组合信息进行(子查询的使用)
#查询高等数学成绩比贾斯文高的学生信息
select
(SELECT stu.studentName FROM student stu WHERE r1.studentNo = stu.studentNo) '姓名'
from
result r1
where
r1.studentResult>(
select
r.studentResult
from
result r
where
r.studentNo =(select stu.studentNo from student stu where stu.studentName='贾斯文')
)
and r1.subjectNo = (select sub.subject from subject sub where sub.subjectName = '高等数学');
4.掌握MySQL的常用的常用函数
##字符串函数
#1.替换字符串 replace(str,from_str,to_str)
select replace ('MySQL数据库','MySQL','Oracle');
#2.拼接字符串
#concact(str1,str2…)
select concat ('MySQL','数据库');
#3.截取字符串
#substr(str,pos)位置是1开始
#substr(str,pos,len)从pos开始截取指定len的长度
select substr('这是MySQL数据库',3);
select substr('这是MySQL数据库',3,5);
#4.去空格
#LTRIM();去除左边的空格
#RTRIM();去除右边的空格
select ltrim(' yiyang ');
select RTRIM('kmmmm ');
#5.首字母大写
select concat(upper(substr('hehe',1,1)),substr('hehe',2))
#6.全部字母大写
select upper('hhee');
#7.全部小写
select lower('HH');
#8.时间函数
select now();#获取当前系统的时间
select dayofweek(now());#获取当前时间的星期数
select dayofmonth(now());#获取当前时间的月份数
select dayofyear(now ());获取当前时间的年份数
select hour(now());#获取当前的小时数
#9.四舍五入
select round (3.1);
SELECT ROUND(3.14,2);#对小数点后的第二位进行四舍五
#10.向上取整和想下取整
select ceil(3.2);#向上取整
select floor(3.6);#向下取整
#11.获取随机整数
#公式(int)(math.random()(max-min))+min
#floor(rand()(max-min))+min
#[2,6)
select floor(rand()*(6-2))+2
#12.掌握统计函数
select max(studentResult) from result;#求最大值
select min(studentResult) from result#求最小值
select sum(studentResult) from result#求和
select avg(studentRsult) from result#求平均值
select count(studentNo) from result#求某个字段的个数
#13.掌握MySQL的分组查询 group by
#计算各个科目的考试成绩的平均成绩,并且求出大于60分的科目名称和编号
select
subjectNo '科目编号',(select sub.subjectName from subject sub where sub.subjectNo = r.subjectNo) '科目名称'
avg(studentResult) '平均分',
from
result r
group by
subjectNo
having
avg(studentResult)>60;