目录
3.SELECT * FROM 表名 WHERE 列名= '条件';
4.SELECT 列名1,列名2 FROM 表名 WHERE 列名= '条件';
5.1.1 INNER JOIN 可简写为JOIN ,在没有条件约束的情况下(ON 条件)代表表1和表2 笛卡尔积
5.2 LEFT JOIN 在有约束条件(ON '条件')时,两个表中符合条件的一一对应起来 ,同时左边的表所有的记录都保留,哪怕是与右表条件不符合的记录,而右表中只有符合条件的保留
5.3 RIGHT JOIN 在有约束条件(ON '条件')时,两个表中符合条件的一一对应起来 ,同时右边的表所有的记录都保留,哪怕是与左表条件不符合的记录,而左表中只有符合条件的保留
前言:
本文操作环境:MySQL Workbench
在MySQL中建一个test项目
test项目下面建三个表,一个是course,一个是user,一个是select_course
可以填上一些数据:
1.user表:学生用户表:学生id,姓名,年龄,国家
2.course表:课程表:课程id,课程名称,老师,地点
3.select_course表:选课表:选课行为id,学生id(user表的主键,select_course表的外键),课程id(课程表的主键,select_course表的外键)
再介绍下查询语义下:基础的关键字和特殊符
SELECT | 后面接列名,或者 *,或者其它 ,表示查询后返回的结果有哪些列 |
FROM | 后面接表名,表示从哪个表里选择 |
WHERE | 后面接条件,表示要符合什么样子的条件才会被选出来 |
正文 :
1.SELECT * FROM 表名;
代表从某个表中查询所有列的数据
举例:course是test下面的一个表名
SELECT * FROM course;
执行语句:点击黄色的闪电按钮
结果:
2.SELECT 列名1,列名2,列名3 FROM 表名;
查询某个表中的某一列数据
SELECT NAME FROM course;
执行后结果:只显示course表中的NAME一列的所有数据
查询course表中某两列数据,用英文输入下的逗号隔开,其他的依次类推
SELECT NAME,TEACHER FROM course;
执行结果:显示course表中NAME,TEACHER两列数据
3.SELECT * FROM 表名 WHERE 列名= '条件';
查询某个 表 中某 列数据 符合 某个条件 的所有列数据
SELECT * FROM course WHERE NAME='JAVA';
执行后结果:显示NAME为‘JAVA’的这一条数据,包括JAVA的所有其他属性(列)值
4.SELECT 列名1,列名2 FROM 表名 WHERE 列名= '条件';
查询某个 表 中某 列数据 符合 某个条件 的列1数据,列2数据
SELECT NAME FROM course WHERE NAME='JAVA';
执行后结果:显示NAME为‘JAVA’的这一条数据,包括JAVA的NAME属性值
5.JOIN的使用
JOIN 是关键字,有三种JOIN:INNER JOIN, LEFT JOIN , RIGHT JOIN
5.1.1 INNER JOIN 可简写为JOIN ,在没有条件约束的情况下(ON 条件)代表表1和表2 笛卡尔积
代码:
SELECT * FROM user JOIN course;
结果:用户红红对应四个课程,每个用户都对应4个课程
5.1.2 INNER JOIN可简写为JOIN,在有约束条件(ON '条件')时,两个表中符合条件的一一对应起来(如果一个表中一条数据有这个元素,另一个表中没有这个元素,那么就这条数据不显示---5.1.3验证)
代码:表select_course 与表 user通过相同的idUSER连接起来,由于SELECT后面接的是 *,所以显示两个表中的所有列。
SELECT * FROM select_course JOIN user ON user.idUSER = select_course.idUSER;
结果:select_course表中的idUSER对应user表中的idUSER,即红红的idUSER是1,通过select_course表可以看出,idUSER是1的人选了两门课,课程id分别是2和3
本来这些表里的信息是独立的,但是现在我们知道红红选了两门课,课程id分别是2和3,那么我们怎么找出红红选的两门课的课程名称呢
接下来,我们来找出红红选的两门课的课程名称,课程名称在course表中,我们需要在刚刚查找的基础上,连接course表,通过idCOURSE来连接
代码:由于select_course表和user表join后都有idUSER,会报重复idUSER的错误,所以之前的表中select后的数据进行了筛选,选择了select_course的所有列,以及user表的NAME列
接着把这张表重命名为A表,与course表通过相同的idCOURSE相连
SELECT * FROM
(SELECT select_course.*,user.NAME FROM select_course JOIN user ON user.idUSER = select_course.idUSER) A
JOIN
course
ON A.idCOURSE = course.idCOURSE;
结果:显示了A表和course表的所有列的数据,我们可以成功地看到,idUSER为1的红红,选了idCOURSE为2和3的两门课,分别是计算机组成原理和软件工程,老师都是WANG,上课地点都在202
由于我们不想看到很多重复列数据,为了提高看的效率,我们只要学生姓名,选择的课程名称,教师名称,上课地点
代码:在上面的基础上,把SELECT 后面的*(所有列数据)改为 A.NAME,course.NAME,course.TEACHER,course.LOCATION,即可
SELECT A.NAME,course.NAME,course.TEACHER,course.LOCATION FROM
(SELECT select_course.*,user.NAME FROM select_course JOIN user ON user.idUSER = select_course.idUSER) A
JOIN
course
ON A.idCOURSE = course.idCOURSE;
结果:
5.2 LEFT JOIN 在有约束条件(ON '条件')时,两个表中符合条件的一一对应起来 ,同时左边的表所有的记录都保留,哪怕是与右表条件不符合的记录,而右表中只有符合条件的保留
要给大家讲清楚这种情况,还需要在user表中新增一条数据,现在多了一个珍珍,这个珍珍并没有在select_course中选课。
INSERT INTO `user` (`idUSER`, `NAME`, `AGE`, `NATION`) VALUES ('6', '珍珍', '18', 'CHINA');
结果:
接着我们看看通过相同的idUser连user表和select_course表,这个时候,我们把user表放在 LEFT JOIN 左边,select_course表放在LEFT JOIN右边,这样的左连接查询应该可以查出所有人选了哪些课,如果这个入没有选课,也会显示出来,后面选课记录为空
代码:
SELECT user.idUSER,user.NAME,select_course.idCOURSE FROM user LEFT JOIN select_course ON user.idUSER = select_course.idUSER;
结果:我们显示user表中的idUSER和 NAME,以及select_course表的idCOURSE,我们可以看出,完全符合代码预期,红红选了课程2和课程3,艾艾选了课程1和课程3,珍珍什么都没选,课程id那里为null
因为说到要与INNER JOIN对比,那么我们用INNER JOIN 试一试,预期结果应该是不显示珍珍,因为珍珍没有选课,不符合连接条件,其他的都和上面一样
代码:
SELECT user.idUSER,user.NAME,select_course.idCOURSE FROM user INNER JOIN select_course ON user.idUSER = select_course.idUSER;
结果:
由此可见INNER JOIN 与 LEFT JOIN的区别:
INNER JOIN:符合条件的记录连接到一起,如果不符合,则记录不显示,两表皆是
LEFT JOIN: 符合条件的记录连接到一起,如果左表不符合,左表的记录仍然保留,但是连接的右表那一条记录为null,但是如果右表某条记录不符合,则不显示
RIGHT JOIN:符合条件的记录连接到一起,如果右表不符合,左表的记录仍然保留,但是连接的左表那一条记录为null,但是如果左表某条记录不符合,则不显示
5.3 RIGHT JOIN 在有约束条件(ON '条件')时,两个表中符合条件的一一对应起来 ,同时右边的表所有的记录都保留,哪怕是与左表条件不符合的记录,而左表中只有符合条件的保留
代码:由于user表中的珍珍没有选课,其他的都选了两门课,所以这次把user表作为右表,select_course表作为左表,预期结果应该是虽然珍珍没有选课,所以不符合user.idUSER = select_course.idUSER的条件,但是在RIGHT JOIN中,右表无论是否符合条件都会进行连接,保留所有行记录。
SELECT user.idUSER,user.NAME,select_course.idCOURSE FROM select_course RIGHT JOIN user ON user.idUSER = select_course.idUSER;
结果:如预期所示,保留了珍珍的idUSER,NAME,在select_course.idUSER一列数值为空(null)
如果把user作为左表的话,应该效果和INNER JOIN一样
代码: select_course作为右表,user作为左表,左表只有符合条件的记录才会显示,所以珍珍应该不会显示
SELECT user.idUSER,user.NAME,select_course.idCOURSE FROM user RIGHT JOIN select_course ON user.idUSER = select_course.idUSER;
结果:如期
6.UNION的使用
7.COUNT() 求和的使用
COUNT()是SQL中的函数方法,计算总和,()里可以填*,也可以填某个列名,一般不推荐COUNT(*)的写法,会降低效率,主要是计算某一列出现的个数
代码:先看看COUNT(*)这种不推荐的写法,它用来计算表中一共有多少条记录
SELECT COUNT(*) FROM user;
结果:列名就是COUNT(*) ,user表共有六个人,是对的,前面我们加上了珍珍,总共六个人。当然我们也可以对它进行重命名(重命名下面讲)
代码:计算user表中有多少个idUSER,同时将计算的结果命名为 TOTAL_NUM
SELECT COUNT(idUSER) AS TOTAL_NUM FROM user;
结果:
8.ORDER BY 排序的使用
9.CASE WHEN ELSE END的使用
10.GROUP BY的使用
11.SUBSTR和CONCAT的使用
12.CAST和CONCAT的使用
13.LIMIT的使用