看完上一个章节,相信你已经掌握了JSP\JSTL\SERVLET相关技术的基础知识和用法,已经初步具备了制作动态网页的实力,今天我们来开启一门新的知识——数据库。
猿进化是一个原创系列文章,帮助你从一只小白快速进化为一个猿人,更多精彩内容,敬请大家关注公主号猿人工厂,点击猿人养成获取!
and 表示同时满足,如果有一个条件不满足,则找不到记录!
SELECT * FROM student WHERE id=2 OR sex=1 OR age=19 (注意空格)
OR 表示或许的意思 只要一个条件满足就好
where语句后可以出现的条件符号:
> 、< 、= 、= 、(含义同数学中的含义)
例子:查询年龄大于18岁的同学。
SELECT * FROM student WHERE age>18(其余符号,大家可以自主在SQLYog中练习)
BETWEEN...AND (表示一个数值范围)
例子:查询年龄18到20岁之间的同学。
SELECT * FROM student WHERE age BETWEEN 18 AND 20
IN( 集合)
例子:查询编号为2,3,4的同学
SELECT * FROM student WHERE ID IN(2,3,4)
图片里故意写了一个1,1的记录不存在,则不会查询出来,同样,如果2,3,4不存在也不会展示出来。
LIKE:模糊查询
例子:
查询姓李的同学
SELECT * FROM student WHERE NAME LIKE'李%'
%表示通配符,李%表示‘李’开头的数据
查询备注中有“个子的同学”
SELECT * FROM student WHERE remark LIKE'%个子%'
两个%%中间表示只要包含某个特定字符就满足条件。
DISTINCT
查询年龄,按年龄去重
SELECT DISTINCT age FROM student
DISTINCT是按某个列名去重,如果加了其他数据不同的列名,达不到效果
GROUP BY 分组条件:
查询性别和名字,按性别分组:
SELECT sex,name FROM student GROUP BY sex
如果有多个分组条件用逗号分隔,查询性别和姓名,按性别和姓名分组
SELECT sex,name FROM student GROUP BY sex,name
HAVING:
对数据做过滤条件,如果语句中有group by 出现,则必须跟在group by后面,否则会有语法错误。
当语句里没有 group by时,和where 含义差不多,只是很少这样写。
查询性别和姓名,按性别和姓名分组后,并且要求sex=1(男性)的数据
SELECT sex,name from student group by sex , name having sex=1
ORDER BY
排序的意思,默认是升序(ASC),也可以指明是降序(DESC)
例子:
查询性别和姓名,按性别和姓名分组后,并且要求sex=1(男性)的数据,按姓名升序排列
SELECT sex,NAME FROM student GROUP BY sex,NAME HAVING sex=1 ORDER BY NAME
或者
SELECT sex,NAME FROM student GROUP BY sex,NAME HAVING sex=1 ORDER BY NAME ASC
查询性别和姓名,按性别和姓名分组后,并且要求sex=1(男性)的数据,按姓名降序排列
SELECT sex,NAME FROM student GROUP BY sex,NAME HAVING sex=1 ORDER BY NAME DESC
Limit
限制条件:
表示需要多少条数据
注意:当limit条件后跟随1个数字时,表示最多返回满足条件的多少条数据。
当limit条件后跟随2个数字(数字间用逗号分隔),表示从满足条件的第几条数据开始,一共最多返回多少条数据。
特别注意:满足条件的记录条数0,代表第一条记录。
例子:
查询性别和姓名,按性别和姓名分组后,并且要求sex=1(男性)的数据,按姓名降序排列,只返回第一条数据
SELECT sex,NAME FROM student GROUP BY sex,NAME HAVING sex=1 ORDER BY NAME DESC LIMIT 1
查询性别和姓名,按性别和姓名分组后,并且要求sex=1(男性)的数据,按姓名降序排列,从第一条数据开始,返回两条数据
接下来我们讲解多表查询
准备工作
我们先建立两张表课程表
CREATE TABLE `test01`.`CLASS`(
`ID` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
`C_NAME` VARCHAR(50) NOT NULL COMMENT '课程名称',
PRIMARY KEY (`ID`)
) ENGINE=INNODB CHARSET=utf8;
给课程表增加记录
INSERT INTO CLASS (C_NAME) VALUES('MYSQL基础');
INSERT INTO CLASS (C_NAME) VALUES('JAVA基础');
INSERT INTO CLASS (C_NAME) VALUES('HTML基础');
学生选课表 用于表示学生和课程之间的选学关系
CREATE TABLE `student_class` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '学生课程表ID,主键',
`S_ID` bigint(20) DEFAULT NULL COMMENT '学生编号',
`C_ID` bigint(20) DEFAULT NULL COMMENT '课程编号',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:STUDENT_CLASS 表中的C_ID的值和CLASS表的ID对应
STUDENT_CLASS 表中的S_ID的值student表的ID对应
增加记录
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(2,1);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(2,2);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(2,3);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(3,2);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(3,3);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(4,3);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(5,1);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(5,2);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(5,3);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(6,2);
多表连接查询:当某次查询结果需要用到多个表的数据的时候,就需要用到多表连接查询。
最简单的表连接查询为内连接查询。
内连接语法 :
select 需要查询的字段名 from 表1 INNER JOIN 表2 ON 表1.字段名=表2.字段名 INNER JOIN 表三 ON
表1.字段名=表3.字段名(或者是表2.字段名=表3.字段名)
[
WHERE 约束条件
GROUP BY 分组依据
HAVING 过滤条件
ORDER BY 排序的字段
LIMIT 限制显示的条数
];
注意:按需求去做表连接查询,有几个连接就写几个连接,内连接会返回连接两边都同时满足的记录。
下面就是使用内连接查询的例子:
1. 查询每个学生的基本信息和选课情况。
例子:
SELECT s.*,c.* FROM student s INNER JOIN student_class cs ON s.id =cs.s_id INNER JOIN class c ON cs.c_id=c.id
内连接也可以用=号代替推荐第二中写法,较为简洁。
SELECT s.*,c.* FROM student s, class c, student_class cs WHERE s.ID=CS.S_ID AND CS.C_ID= c.ID
2. 查询编号为2的学生的基本信息和选课情况
SELECT s.*,c.* FROM student s, class c, student_class cs WHERE s.ID=CS.S_ID AND CS.C_ID= c.ID AND s.id= 2
LEFT JOIN (左外连接)
数据准备:往学生选课表中插入三条学生表中不存在的记录
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(7,1);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(7,2);
INSERT INTO STUDENT_CLASS (S_ID,C_ID) VALUES(7,3);
使用左外连接查询学生的选课情况:
SELECT c.* ,s.*,cs.* FROM student_class cs LEFT JOIN student s ON s.id =cs.s_id LEFT JOIN class c ON cs.c_id=c.id
左外连接:以写在JOIN关键字左边的表为基准,和JOIN关键字右边的表做关联,如果JOIN关键字左边表里的数据存在,则会作为一条记录存在,如果右边的表里不存在相关联的数据,则用NULL值补充。
右外连接
使用右外连接查询学生的选课情况:
SELECT c.* ,s.*,cs.* FROM student s RIGHT JOIN student_class cs ON s.id =cs.s_id RIGHT JOIN class c ON cs.c_id=c.id
右外连接:以写在JOIN关键字右边的表为基准,和JOIN关键字左边的表做关联,如果JOIN关键字右边表里的数据存在,则会作为一条记录存在,如果左边的表里不存在相关联的数据,则用NULL值补充。
注意:LEFT JOIN 和RIGHT JOIN的写法是看顺序的,大家看例子的时候要注意语句的例子的写法。
子查询
IN 子查询
SELECT 字段名 FROM 表名 where 字段名 IN(SELECT 字段名 FROM 表名)
例子:
查询已经选课的学生基本信息
SELECT * FROM student WHERE id IN(SELECT s_id FROM STUDENT_CLASS)
小作业1. 查询编号为2的学生基本信息。
2. 查询姓王的学生基本信息。
3. 统计每个学生的名字和选择了几门课程。(小提示:内连接,分组)
4. 统计选择了两门课以上的学生姓名和选择的课程数量。(小提示:内连接,分组,having)
5. 统计选择了两门课以上的学生姓名和选择的课程数量,按选课数量倒排返回2条记录。(小提示:内连接,分组,having,limit)
6. 统计选择了两门课以上的学生姓名和选择的课程数量,按选课数量倒排从第一条记录开始返回2条记录。(小提示:内连接,分组,having,limit)