MySQL的连接查询
MySQL的连接查询
-
建表
1.一对一关系
2.一对多、多对一关系
3.多对多关系(需要建立一张关联表,进行二者的关联)
4.例:订单管理,用户下订单,一个用户可以下一个或多个订单,一个订单可能包含一个或多个商品。 -
例:以下 sql 语句都依据此数据库
/*
Navicat MySQL Data TransferSource Server : localhost_3306
Source Server Version : 50528
Source Host : localhost:3306
Source Database : moretableTarget Server Type : MYSQL
Target Server Version : 50528
File Encoding : 65001Date: 2018-12-09 10:54:25
*/SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for cla
-- ----------------------------
DROP TABLE IF EXISTScla;
CREATE TABLEcla(
classidint(11) NOT NULL,
classnamevarchar(255) DEFAULT NULL,
classtimeint(11) DEFAULT NULL,
PRIMARY KEY (classid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of cla
-- ----------------------------
INSERT INTOclaVALUES ('1', '数学', '10');
INSERT INTOclaVALUES ('2', '语文', '18');
INSERT INTOclaVALUES ('3', '音乐', '12');
INSERT INTOclaVALUES ('4', '美术', '18');
INSERT INTOclaVALUES ('5', '体育', '15');
INSERT INTOclaVALUES ('6', '计算机', '32');
INSERT INTOclaVALUES ('7', '英语', '36');
INSERT INTOclaVALUES ('8', 'Java', '20');
INSERT INTOclaVALUES ('9', '数据库', '40');
INSERT INTOclaVALUES ('10', '建筑', '20');-- ----------------------------
-- Table structure for stu
-- ----------------------------
DROP TABLE IF EXISTSstu;
CREATE TABLEstu(
stuidint(11) NOT NULL,
stunamevarchar(255) DEFAULT NULL,
stuagevarchar(255) DEFAULT NULL,
stusexvarchar(255) DEFAULT NULL,
PRIMARY KEY (stuid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT INTOstuVALUES ('1', '小明', '20', '男');
INSERT INTOstuVALUES ('2', '小华', '21', '男');
INSERT INTOstuVALUES ('3', '小红', '19', '男');
INSERT INTOstuVALUES ('4', '小美', '19', '女');
INSERT INTOstuVALUES ('5', '小爱', '20', '女');
INSERT INTOstuVALUES ('6', '小风', '19', '男');
INSERT INTOstuVALUES ('7', '小太', '22', '女');
INSERT INTOstuVALUES ('8', '小齐', '25', '男');
INSERT INTOstuVALUES ('9', '小镇', '24', '女');
INSERT INTOstuVALUES ('10', '小星', '23', '女');
INSERT INTOstuVALUES ('11', '小刚', '25', '男');
INSERT INTOstuVALUES ('12', '小哈', '22', '女');
INSERT INTOstuVALUES ('13', '文华', '26', '男');
INSERT INTOstuVALUES ('14', '小易', '22', '女');
INSERT INTOstuVALUES ('15', '小改', '22', '女');
INSERT INTOstuVALUES ('16', '小星', '23', '男');
INSERT INTOstuVALUES ('17', '小文', '15', '未知');
INSERT INTOstuVALUES ('18', '小文', '20', '女');-- ----------------------------
-- Table structure for stu_cla
-- ----------------------------
DROP TABLE IF EXISTSstu_cla;
CREATE TABLEstu_cla(
idint(11) NOT NULL,
stuidint(11) DEFAULT NULL,
claidint(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of stu_cla
-- ----------------------------
INSERT INTOstu_claVALUES ('1', '1', '1');
INSERT INTOstu_claVALUES ('2', '2', '4');
INSERT INTOstu_claVALUES ('3', '3', '3');
INSERT INTOstu_claVALUES ('4', '4', '4');
INSERT INTOstu_claVALUES ('5', '5', '2');
INSERT INTOstu_claVALUES ('6', '6', '6');
INSERT INTOstu_claVALUES ('7', '7', '9');
INSERT INTOstu_claVALUES ('8', '8', '6');
INSERT INTOstu_claVALUES ('9', '10', '8');
INSERT INTOstu_claVALUES ('10', '16', '9'); -
sql 中什么时候用内连接查询,什么时候用外连接查询?
需要查找两张表同时存在的数据,使用 内连接 ;需要查找两张表中一张表存在,另一张表不存在的时候使用左外链接 或 右外链接。
例:内连接的查询结果都是满足连接条件的元组。
但有时我们也希望输出那些不满足连接条件的元组信息。
比如,我们想知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是满足连接条件的),也包括没有选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足连接条件),这时就需要使用外连接。外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式。 -
内连接
查询已经选过课的学生的选课情况
SELECT
s.stuid,s.stuname,s.stuage,sc.claid
FROM
stu_cla AS sc
INNER JOIN
stu AS s
ON
sc.stuid = s.stuid查询已经选过课的学生以及所选择课程的信息
SELECT
s.stuid,s.stuname,s.stuage,c.classname,c.classtime
FROM
stu_cla AS sc
INNER JOIN
stu AS s
ON
sc.stuid = s.stuid
INNER JOIN
cla AS c
ON
sc.claid = c.classid -
左连接
查询所有学生的选课情况
select
s.stuid,s.stuname,s.stuage,s.stusex,sc.claid
FROM
stu as s
LEFT JOIN
stu_cla AS sc
ON
sc.stuid = s.stuid查询所有学生选课情况及课程信息
select
s.stuid,s.stuname,s.stuage,s.stusex,c.classname,c.classtime
FROM
stu as s
LEFT JOIN
stu_cla AS sc
ON
sc.stuid = s.stuid
LEFT JOIN
cla AS c
ON
sc.claid = c.classid查询 stuid=1 的学生选课情况
select
s.stuid,s.stuname,s.stuage,s.stusex,c.classname,c.classtime
FROM
stu as s
LEFT JOIN
stu_cla AS sc
ON
sc.stuid = s.stuid
LEFT JOIN
cla AS c
ON
sc.claid = c.classid
WHERE
s.stuid = 1 -
模糊查询
SELECT * FROM stu WHERE stuname LIKE '%三%'
-
concat 函数(连接字符串)
select concat (stuid, stuname, stuage) as info from stu;
在mybatis中的应用,用来拼接模糊查询字符串
select * from stu where stuname like concat('%',#{stuname},'%')
-
分组查询
按性别分组查年龄最大值
select stuname,max(stuage),stusex from stu group by stusex;
-
去重查询
1.distinct必须放在最开头
2.distinct只能使用需要去重的字段进行操作。也就是说我sidtinct了name,age两个字段,我后面想根据id进行排序,是不可以的,因为只能name,age两个字段进行操作.
3.distinct去重多个字段时,含义是:几个字段 同时重复 时才会被 过滤。查询名字不相同的学生;
select distinct stuname from stu;
#查询名字和年龄同时不同的学生
select distinct stuname,stusex from stu; -
count 函数
Count(1)和Count( * )实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。
因此当你指定Count( * ) 或者Count(1)或者无论 Count(‘anything’) 时结果都会一样,因为这些值都不为NULL。select count(1) from stu;
select count(*) from stu;
select count('hgjkyh') from stu;
#起别名 (as)
select count('hgjkyh') as 总数 from stu;分组计数
select stusex as 性别,count(1)as 总数 from stu GROUP BY stusex;

浙公网安备 33010602011771号