猿进化系列11——一文快速学会MYSQL

Hazel ·
更新时间:2024-11-13
· 747 次阅读

看完上一个章节,相信你已经掌握了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)


作者:猿人工厂的小号



进化 Mysql

需要 登录 后方可回复, 如果你还没有账号请 注册新账号