




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章MySQL多表操作《PHP+MySQL动态网站开发》学习目标/Target理解数据库设计范式和表关系掌握对数据的分组、排序等操作掌握多表之间的连接查询、联合查询的使用掌握子查询的使用掌握外键的添加、使用以及删除等操作章节概述/Summary在前面的章节中,已学习了MySQL的基本知识和查询语法,然而在实际开发中,业务逻辑较为复杂,通常都需要进行多张表的关联操作,才能满足需求。本章将学习数据库的设计范式、数据的分组和排序、多表联合查询,以及子查询和外键的使用。目录/Contents01020304数据库设计范式表关系数据查询联合查询目录/Contents050607连接查询子查询外键数据库设计范式7.17.1.1第一范式
先定一个小目标!熟悉第一范式,能够说出第一范式的具体要求,能够分析数据表是否符合第一范式7.1.1第一范式第一范式(1NF):遵从原子性,属性不可再分,数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。7.1.1第一范式不满足第一范式的数据表示例编号联系方式1张三邮箱:zhangsan@,手机号:189000000002李四邮箱:lisi@,手机号17300000000编号用户名邮箱手机号手机号1张三zhangsan/p>
2李四
lisi@1590000000017300000000用户联系方式表:7.1.1第一范式满足第一范式的数据表示例用户编号用户名1张三2李四编号用户编号联系方式具体值11邮箱zhangsan@21手机号1890000000032邮箱lisi@42手机号1590000000052手机户表:联系方式表:7.1.2第二范式
先定一个小目标!熟悉第二范式,能够说出第二范式的具体要求,能够分析数据表是否符合第二范式7.1.2第二范式第二范式(2NF):遵从唯一性,非主键字段需完全依赖主键,在第一范式的基础上建立的,满足第二范式必须先满足第一范式。7.1.2第二范式不满足第二范式的数据表示例订单表:订单编号订单商品购买件数下单时间1铅笔32020-01-2008:30:152钢笔22020-01-2109:00:153圆珠笔12020-01-2209:30:15用户编号订单编号用户名付款状态11张三已支付12张三未支付23李四已支付用户表:7.1.2第二范式使用上述方式设计的用户表存在的问题:插入异常:如果用户没有下过订单,则该用户无法插入。删除异常:删除用户所有的订单,该用户也会被删除。更新异常:由于用户名冗余,修改用户时需要修改多条记录。如果漏改某些记录,会出现更新异常。7.1.2第二范式满足第二范式的数据表示例用户编号用户名1张三2李四订单编号用户编号订单商品购买件数下单时间付款状态11铅笔32020-01-2008:30:15已支付21钢笔22020-01-2109:00:15未支付32圆珠笔12020-01-2209:30:15已支付用户表:订单表:7.1.3第三范式
先定一个小目标!熟悉第三范式,能够说出第三范式的具体要求,能够分析数据表是否符合第三范式7.1.3第三范式第三范式(3NF):非主键字段不能相互依赖,在第二范式的基础上建立起来的,数据表中每一列数据都和主键直接相关,不能间接相关。7.1.3第三范式不满足第三范式的数据表示例用户编号用户名用户等级享受折扣1张三10.952李四10.953王五20.85用户表:使用上述方式设计的用户表存在的问题:插入异常:新插入用户的等级如果在1、2之外,其享受的折扣无处参考。删除异常:如果删除某个等级下所有的用户,该等级对应的折扣也被删除。更新异常:如果修改某个用户的等级,折扣也必须随之修改;如果修改某个等级的折扣,又因为折扣存在冗余,容易发生漏改。7.1.3第三范式满足第三范式的数据表示例用户编号用户名用户等级1张三12李四13王五2用户等级享受折扣10.9520.85用户表:折扣表:7.1.4逆规范化
先定一个小目标!熟悉逆规范化,能够说出范式的局限性,能够说出什么情况下需要逆规范化7.1.4逆规范化逆规范化:反范式的设计,主要目的是提高查询效率。使用范式导致的问题:表数量增加,连接查询时性能降低。例如,查询订单表统计商品销量,数据量很大时需要很多时间计算。解决方法:在表中适当添加冗余字段,解决连接查询问题。例如,在商品表增加销量字段,商品被购买时就更新销量。7.1.4逆规范化逆规范化数据表示例商品编号商品名称商品价格商品销量1铅笔252钢笔8913圆珠笔101订单编号商品编号购买件数下单时间1132020-01-2008:30:152122020-01-2109:00:153212020-01-2209:30:154312020-01-2309:59:15商品表:订单表:表关系7.27.2.1一对一
先定一个小目标!熟悉一对一的表关系,能够将数据表拆分成一对一关系7.2.1一对一一对一:表中的一条记录与另外一张表中有且仅有一条记录有关系。实现一对一表关系:一张表拆分成两个表,将频繁使用的字段和生僻字段进行垂直分割,使用相同的主键对应。拆分前数据表示例学号姓名性别年龄身高体重籍贯政治面貌1张三男20165140河北团员2李四女21168100山东团员3小明男22170130陕西团员姓名、性别和年龄为频繁使用字段7.2.1一对一一对一设计数据表示例学号姓名性别年龄1张三男202李四女213小明男22学号身高体重籍贯政治面貌1165140河北团员2168100山东团员3170130陕西团员学生表:学生信息表:7.2.2一对多
先定一个小目标!熟悉一对多的表关系,能够举例说明哪些表符合一对多关系7.2.2一对多一对多:表中的一条记录与另外一张表中多条记录对应,也叫多对一。一对多设计数据表示例班级编号班级名班主任1软件班张老师2设计班王老师学号姓名性别班级号1张三男12李四女13小明男2班级表:学生表:7.2.3多对多
先定一个小目标!熟悉多对多的表关系,能够举例说明哪些表符合多对多关系7.2.3多对多多对多:表中的多条记录与另外一张表中多条记录对应,需要借助第三张表,将多对多关系变成多个多对一的关系。多对多设计数据表示例课程编号课程名1计算机2数据库课程表:7.2.3多对多多对多设计数据表示例学号姓名性别班级号1张三男12李四女13小明男2编号学号课程编号111221312432学生表:学生选课表:7.3数据查询7.3.1查询选项
先定一个小目标!掌握查询选项,能够在查询时指定返回的字段,并去除重复记录7.3.1查询选项去除重复记录:使用SELECT语句的选项进行筛选。SELECTselect选项字段列表FROM数据表;语法格式select选项默认值为ALL,表示保存所有查询到的记录select选项值为DISTINCT,表示去除重复记录,只保留一条7.3.1查询选项查询全部记录代码示例去除重复项代码示例7.3.2运算符
先定一个小目标!掌握运算符的使用,能够利用比较运算符、逻辑运算符对数据进行运算7.3.2运算符比较运算符比较运算符:在条件表达式中对结果进行限定。比较运算符的结果值:1(TRUE,表示为真)、0(FALSE,表示为假)或NULL。7.3.2运算符比较运算符运算符描述=用于相等比较<=>可以进行NULL值比较的相等运算符>
表示大于比较<
表示小于比较>=表示大于等于比较<=表示小于等于比较<>、!=表示不等于比较BRTWEEN…AND…比较数据是否在闭区间范围内,若在返回1,不在返回0(1/2)7.3.2运算符比较运算符运算符描述NOTBRTWEEN…AND…比较数据是否不在闭区间范围内,若不在返回1,若在返回0IS比较数据是否是TRUE、FALSE或UNKNOWN,若是返回1,若不是返回0ISNOT比较数据是否不是TRUE、FALSE或UNKNOWN,若不是返回1,若是返回0ISNULL比较数据是否是NULL,若是返回1,若不是返回0ISNOTNULL比较数据是否不是NULL,若不是返回1,若是返回0LIKE'匹配模式'获取匹配到的数据NOTLIKE'匹配模式'获取匹配不到的数据(2/2)7.3.2运算符案例:比较运算符的使用代码示例#查询my_goods表中价格在2000到6000的商品,商品信息包括id、name和pricemysql>SELECT`id`,`name`,`price`FROM`my_goods`->WHERE`price`BETWEEN2000AND6000;+----+------------+---------+|id|name|price|+----+------------+---------+|4|液晶显示器|5999.00||8|办公计算机|2000.00|+----+------------+---------+7.3.2运算符逻辑运算符逻辑运算符:在条件表达式中用于逻辑判断、可与比较运算符结合使用。逻辑运算符的结果值:1(TRUE,表示为真)、0(FALSE,表示为假)或NULL。运算符描述AND或&&逻辑与,若操作数全部为真,则结果为1,否则为0OR或||逻辑或,若操作数中只要有一个为真,则结果为1,否则为0NOT或!逻辑非,若操作数为0,则结果为1,否则为0XOR逻辑异或,若操作数一个为真,一个为假,则结果为1;若操作数全部为真或全部为假,则结果为07.3.2运算符案例:逻辑运算符的使用代码示例#查询my_goods表中关键词为电子产品的5星商品,商品信息包括id、name和pricemysql>SELECT`id`,`name`,`price`FROM`my_goods`
->WHERE`keyword`='电子产品'&&`score`=5;+----+---------+---------+|id|name|price|+----+---------+---------+|5|智能手机|1999.00|+----+---------+---------+7.3.3分组
先定一个小目标!掌握分组操作,能够在查询时利用聚合函数进行分组、分组并排序、回溯统计、数据筛选7.3.3分组分组分组:在WHERE条件后面添加GROUPBY。SELECT字段列表FROM数据表名[WHERE条件表达式]GROUPBY字段名;语法格式注意:对数据分组后,SELECT获取的字段列表只能是GROUPBY分组的字段或使用了聚合函数的非分组字段。7.3.3分组分组常用聚合函数:函数名描述COUNT()返回参数字段的数量,不统计为NULL的记录SUM()返回参数字段之和AVG()返回参数字段的平均值MAX()返回参数字段的最大值MIN()返回参数字段的最小值GROUP_CONCAT()返回复合条件的参数字段值的连接字符串7.3.3分组分组使用聚合函数:使用MAX()获取每个分类下商品的最高价格。mysql>SELECT`category_id`,MAX(`price`)FROM`my_goods`GROUPBY`category_id`;+-------------+------------+|category_id|MAX(price)|+-------------+------------+|3|15.00||6|1999.00||8|69.00||9|109.00||10|2000.00||12|5999.00||15|299.00||16|48.00|+-------------+------------+7.3.3分组回溯统计回溯统计:系统自动对分组字段向上进行一次新的统计并产生一个新的统计数据,该数据对应的分组字段值为NULL。SELECT字段列表FROM数据表名[WHERE条件表达式]GROUPBY字段名1[,字段名2…]WITHROLLUP;语法格式7.3.3分组案例:单字段回溯统计代码示例mysql>SELECT`category_id`,COUNT(*)FROM`my_goods`GROUPBY`category_id`WITHROLLUP;+-------------+----------+|category_id|COUNT(*)|+-------------+----------+|3|3||6|1||8|1||9|1||10|1||12|1||15|1||16|1||NULL|10|对分组的回溯统计+-------------+----------+7.3.3分组案例:多分组回溯统计代码示例mysql>SELECT`score`,`comment_count`,COUNT(*)FROM`my_goods`GROUPBY`score`,`comment_count`WITHROLLUP;+-------+-------------------+-----------+|score|comment_count|COUNT(*)|+-------+-------------------+-----------+|2.50|200|1||2.50|NULL|1||3.90|500|2||3.90|NULL|2||4.50|1000|1||4.50|NULL|1||4.80|6000|1||4.80|98000|1||4.80|NULL|2||4.90|40000|2||4.90|NULL|2||5.00|98000|2||5.00|NULL|2||NULL|NULL|10|+-------+-------------------+-----------+7.3.3分组排序分组排序:为指定字段进行升序或降序排序的功能,默认为升序。SELECT字段列表FROM数据表名[WHERE条件表达式]GROUPBY字段名[ASC|DESC];语法格式7.3.3分组案例:分组排序代码示例STEP01mysql>SELECT`category_id`,GROUP_CONCAT(`id`),GROUP_CONCAT(`name`)->FROM`my_goods`GROUPBY`category_id`DESC;+-------------+-----------------------+---------------------------+|category_id|GROUP_CONCAT(id)|GROUP_CONCAT(name)|+-------------+-----------------------+---------------------------+|16|10|薄毛衣||15|9|收腰风衣||12|4|液晶显示器||10|8|办公计算机||9|7|头戴耳机||8|6|桌面音箱||6|5|智能手机||3|1,2,3|2B铅笔,钢笔,碳素笔|+-------------+------------------------+---------------------------+7.3.3分组HAVING子句筛选分组结果:对查询的数据执行分组操作时,可以利用HAVING根据条件进行数据筛选。SELECT字段列表FROM数据表名[WHERE条件表达式]GROUPBY字段名HAVING条件表达式;语法格式7.3.3分组HAVING子句HAVING和WHERE区别:WHERE操作是从数据表中获取数据,将数据从磁盘存储到内存中,HAVING是对已存放到内存中的数据进行操作。HAVING位于GROUPBY子句后,WHERE位于GROUPBY子句之前。HAVING关键字后可以使用聚合函数,WHERE不可以。7.3.3分组案例:分组筛选代码示例STEP01mysql>SELECT`score`,`comment_count`,GROUP_CONCAT(`id`)->FROM`my_goods`GROUPBY`score`,`comment_count`->HAVINGCOUNT(*)=2;+-------+-------------------+----------------------+|score|comment_count|GROUP_CONCAT(id)|+-------+-------------------+----------------------+|3.90|500|2,7||4.90|40000|1,9||5.00|98000|3,5|+-------+-------------------+----------------------+7.3.4排序
先定一个小目标!掌握排序操作,能够将查询结果按照升序或降序进行排列7.3.4排序STEP02SELECT字段列表FROM数据表名[WHERE条件表达式]ORDERBY字段名1[,字段名2…][ASC|DESC];语法格式两种排序方式:单字段排序和多字段排序。7.3.4排序案例:单字段排序代码示例STEP02mysql>SELECT`id`,`name,`price`FROM`my_goods`ORDERBY`price`DESC;+----+------------+---------+|id|name|price|+----+------------+---------+|4|液晶显示器|5999.00||8|办公计算机|2000.00||5|智能手机|1999.00||9|收腰风衣|299.00||7|头戴耳机|109.00||6|桌面音箱|69.00||10|薄毛衣|48.00||2|钢笔|15.00||3|碳素笔|1.00||1|2B铅笔|0.50|+----+-----------+---------+7.3.4排序案例:多字段排序代码示例STEP02mysql>SELECT`category_id`,`id`,`name`,`price`FROM`my_goods`ORDERBY`category_id`,`price`DESC;+-------------+----+----------+---------+|category_id|id|name|price|+-------------+----+----------+---------+|3|2|钢笔|15.00||3|3|碳素笔|1.00||3|1|2B铅笔|0.50||6|5|智能手机|1999.00||8|6|桌面音箱|69.00||9|7|头戴耳机|109.00||10|8|办公计算机|2000.00||12|4|液晶显示器|5999.00||15|9|收腰风衣|299.00||16|10|薄毛衣|48.00|+-------------+----+----------+---------+7.3.4排序STEP02中文排序使用“CONVERT(字段名USINGgbk)”函数强制让指定的字段按中文拼音顺序排序。案例:代码示例mysql>mysql>SELECT`id`,`name`FROM`my_goods`ORDERBYCONVERT(`name`USINGgbk)ASC;+----+------------+|id|name|+----+------------+|1|2B铅笔||8|办公计算机||10|薄毛衣||4|液晶显示器|+----+------------+7.3.5限量
先定一个小目标!掌握限量操作,能够通过LIMIT子句限制查询结果返回的条数7.3.5限量限定记录的数量:使用LIMIT关键字限定记录的数量,也可以指定从哪一条记录开始查询。SELECT字段列表FROM数据表名[WHERE条件表达式]LIMIT[OFFSET,]记录数;语法格式记录数:表示限定获取的最大记录数量可选项OFFSET:表示偏移量,设置从哪条记录开始,默认第1条记录的偏移量值为0,第2条值为1,以此类推。7.3.5限量案例:限量查询代码示例STEP01mysql>SELECT`id`,`name`,`price`FROM`my_goods`->ORDERBY`price`DESCLIMIT1;+----+------------+---------+|id|name|price|+----+------------+---------+|4|液晶显示器|5999.00|+----+------------+---------+7.3.5限量案例:指定区间代码示例STEP01mysql>SELECT`id`,`name`,`price`FROM`my_goods`LIMIT0,5;+----+-----------+---------+|id|name|price|+----+-----------+---------+|1|2B铅笔|0.50||2|钢笔|15.00||3|碳素笔|1.00||4|液晶显示器|5999.00||5|智能手机|1999.00|+----+------------+---------+7.4联合查询7.4.1什么是联合查询
先定一个小目标!熟悉什么是联合查询,能够将多个SELECT查询结果合并到一起返回7.4.1什么是联合查询联合查询:多表查询的一种方式,在多个SELECT语句的查询字段数相同时,合并多个查询结果。语法格式SELECT…UNION[ALL|DISTINCT]SELECT…[UNION[ALL|DISTINCT]SELECT…];UNION:实现联合查询的关键字联合查询的选项:ALL表示保留所有查询结果;DISTINCT默认值表示去除完全重复的记录7.4.1什么是联合查询案例:联合查询的使用代码示例mysql>SELECT`id`,`name`,`price`FROM`my_goods`WHERE`category_id`=9->UNION->SELECT`id`,`name`,`keyword`FROM`my_goods`WHERE`category_id`=6;+----+---------+----------+|id|name|price|+----+---------+----------+|7|头戴耳机|109.00||5|智能手机|电子产品|+----+---------+----------+7.4.2联合查询并排序
先定一个小目标!掌握联合查询并排序,能够将联合查询后的结果按照升序或降序返回7.4.2联合查询并排序实现方式:使用圆括号()包裹SELECT语句,在SELECT语句内或在联合查询的最后添加ORDERBY语句,在ORDERBY后添加LIMIT限定联合查询排序的数量,推荐使用大于表记录数的任意值。代码示例mysql>(SELECT`id`,`name`,`price`FROM`my_goods`WHERE`category_id`<>3->ORDERBY`price`DESCLIMIT7)->UNION->(SELECT`id`,`name`,`price`FROM`my_goods`WHERE`category_id`=3->ORDERBY`price`ASCLIMIT3);7.5连接查询7.5.1交叉连接
先定一个小目标!掌握交叉连接查询,能够对两张表进行交叉连接,返回查询结果7.5.1交叉连接交叉连接:返回被连接的两个表中所有数据行的乘积。表13个字段、4条记录表25个字段、10条记录交叉连接结果:3+5个字段、4×10条记录7.5.1交叉连接语法格式SELECT查询字段FROM表1CROSSJOIN表2;代码示例mysql>SELECTc.`id`cid,c.`name`cname,g.`id`gid,g.`name`gname->FROM`my_goods_category`ASc->CROSSJOIN`my_goods`ASg;7.5.2内连接
先定一个小目标!掌握内连接查询,能够对两张表进行内连接,返回查询结果7.5.2内连接内连接:根据匹配条件返回第1个表与第2个表所有匹配成功的记录。结果:3条记录7.5.2内连接语法格式SELECT查询字段FROM表1[INNER]JOIN表2ON匹配条件;代码示例mysql>SELECTg.`id`gid,g.`name`gname,c.`id`cid,c.`name`cname->FROM`my_goods`gJOIN`my_goods_category`c->ONg.`category_id`=c.`id`;7.5.3外连接
先定一个小目标!掌握外连接查询,能够对两张表进行左外连接或右外连接查询,返回查询结果7.5.3外连接结果:左表中的记录和交集部分左外连接左外连接:也称左连接,返回连接关键字(LEFTJOIN)左表的所有记录和右表符合连接条件的记录。左表右表7.5.3外连接语法格式SELECT查询字段FROM表1LEFT[OUTER]JOIN表2ON匹配条件;代码示例mysql>SELECTg.`id`gid,g.`name`gname,c.`id`cid,c.`name`cname->FROM`my_goods`gLEFTJOIN`my_goods_category`c->ONg.`category_id`=c.`id`ANDg.`score`=5;7.5.3外连接结果:右表中的记录和交集部分右外连接右外连接:也称右连接,返回连接关键字(RIGHTJOIN)右表所有的记录和左表符合连接条件的记录。右表左表7.5.3外连接语法格式SELECT查询字段FROM表1RIGHT[OUTER]JOIN表2ON匹配条件;代码示例mysql>SELECTg.`id`gid,g.`name`gname,c.`id`cid,c.`name`cname->FROM`my_goods`gRIGHTJOIN`my_goods_category`c->ONc.`id`=g.`category_id`ANDg.`score`=5;7.5.4自然连接
先定一个小目标!掌握自然连接查询,能够对两张表进行自然连接查询,返回查询结果7.5.4自然连接语法格式SELECT查询字段FROM表1NATURALJOIN表2;自然连接(NATURALJOIN)可以自动寻找连接条件。7.5.4自然连接案例:自然连接代码示例mysql>CREATETABLE`my_student`(->`id`int(11)NOTNULLAUTO_INCREMENT,->`name`varchar(50)NOTNULL,->`c_id`int(11)DEFAULTNULLCOMMENT'课程id',->PRIMARYKEY(`id`)->)ENGINE=InnoDBDEFAULTCHARSET=utf8;mysql>INSERTINTO`my_student`VALUES('1','小明','1');mysql>INSERTINTO`my_student`VALUES('2','张三','1');mysql>INSERTINTO`my_student`VALUES('3','李四','2');STEP01创建my_student数据表并插入数据。7.5.4自然连接案例:自然连接代码示例mysql>CREATETABLE`my_course`(->`c_id`int(11)NOTNULL,->`c_name`varchar(50)NOTNULL->)ENGINE=InnoDBDEFAULTCHARSET=utf8;mysql>INSERTINTO`my_course`VALUES('1','软件工程');mysql>INSERTINTO`my_course`VALUES('2','页面设计');创建my_course数据表并插入数据。STEP027.5.4自然连接案例:自然连接代码示例SELECT*FROM`my_student`NATURALJOIN`my_course`;+------+----+------+----------+|c_id|id|name|c_name|+------+----+------+----------+|1|1|小明|软件工程||1|2|张三|软件工程||2|3|李四|页面设计|+------+----+------+----------+使用自然连接查询。STEP037.5.5USING关键字
先定一个小目标!掌握USING关键字的使用,能够使用USING关键字代替ON来设置连接使用的字段7.5.5USING关键字语法格式SELECT查询字段FROM表1[CROSS|INNER|LEFT|RIGHT]JOIN表2USING(同名的连接字段列表);USING关键字的使用场景:使用连接查询时如果数据表的字段同名,匹配条件可以使用USING代替ON。7.5.5USING关键字案例:USING关键字使用代码示例mysql>SELECTDISTINCTg1.`id`,g1.`name`FROM`my_goods`g1->JOIN`my_goods`g2->USING(`category_id`)WHEREg2.`name`='钢笔';+----+--------+|id|name|+----+--------+|1|2B铅笔||3|碳素笔||2|钢笔|+----+--------+STEP037.6子查询7.6.1子查询分类
先定一个小目标!熟悉子查询分类,能够说出子查询的分类方式和类型7.6.1子查询分类按功能划分:标量子查询列子查询行子查询表子查询按出现位置划分:WHERE子查询FROM子查询7.6.2标量子查询
先定一个小目标!掌握标量子查询,能够通过标量子查询的方式查询数据7.6.2标量子查询标量子查询:返回的结果是一个数据,即一行一列。语法格式WHERE条件判断{=|<>}(SELECT字段名FROM数据源[WHERE][GROUPBY][HAVING][ORDERBY][LIMIT]);利用比较运算符=或<>判断子查询语句返回的数据是否与指定的条件相等或不等7.6.2标量子查询案例:标量子查询使用代码示例mysql>SELECTnameFROM`my_goods_category`->WHERE`id`=(SELECT`category_id`FROM`my_goods`->WHERE`name`='智能手机');+------+|name|+------+|手机|+------+7.6.3列子查询
先定一个小目标!掌握列子查询,能够通过列子查询的方式查询数据7.6.3列子查询列子查询:返回的结果是一个字段符合条件的所有数据,即一列多行。语法格式WHERE条件判断{IN|NOTIN}(SELECT字段名FROM数据源[WHERE][GROUPBY][HAVING][ORDERBY][LIMIT]);利用比较运算函数IN()或NOTIN()判断指定的条件是否在子查询语句返回的结果集中7.6.3列子查询案例:列子查询使用代码示例mysql>SELECT`name`FROM`my_goods_category`->WHERE`id`IN(SELECTDISTINCT`category_id`FROM`my_goods`);+-------+|name|+-------+|文具||显示器||手机||音箱|+-------+7.6.4行子查询
先定一个小目标!掌握行子查询,能够通过行子查询的方式查询数据7.6.4行子查询行子查询:返回的结果是一条包含多个字段的记录时,即一行多列。语法格式WHERE(指定字段名1,指定字段名2,…)=(SELECT字段列表FROM数据源);利用比较运算函数=表示行子查询返回的一条记录与指定的条件进行比较7.6.4行子查询不同运算符的行比较含义:不同运算符的行比较描述(a,b)=(x,y)表达的含义等价于(a=x)AND(b=y)(a,b)<=>(x,y)表达的含义等价于(a<=>x)AND(b<=>y)(a,b)<>(x,y)或(a,b)!=(x,y)表达的含义等价于(a<>x)OR(b<>y)(a,b)>(x,y)表达的含义等价于(a>x)OR((a=x)AND(b>y))(a,b)>=(x,y)表达的含义等价于(a>x)OR((a=x)AND(b>=y))(a,b)<(x,y)表达的含义等价于(a<x)OR((a=x)AND(b<y))(a,b)<=(x,y)表达的含义等价于(a<x)OR((a=x)AND(b<=y))7.6.4行子查询案例:行子查询使用代码示例mysql>SELECT`id`,`name`,`price`,`score`,`content`FROM`my_goods`->WHERE(`price`,`score`)=(SELECTMAX(`price`),MIN(`score`)->FROM`my_goods`);+----+----------+---------+-------+---------+|id|name|price|score|content|+----+----------+---------+-------+---------+|4|液晶显示器|5999.00|2.50|画质清晰|+----+----------+---------+-------+---------+7.6.5表子查询
先定一个小目标!掌握表子查询,能够通过表子查询的方式查询数据7.6.5表子查询表子查询:子查询的返回结果用于FROM数据源,它是一个符合二维表结构的数据,可以是一行一列、一列多行、一行多列或多行多列。语法格式SELECT字段列表FROM(SELECT语句)[AS]别名[WHERE][GROUPBY][HAVING][ORDERBY][LIMIT]);7.6.5表子查询案例:表子查询使用代码示例mysql>SELECTa.`id`,a.`name`,a.`price`,a.`category_id`->FROM`my_goods`a,->(SELECT`category_id`,MAX(`price`)max_priceFROM`my_goods`->GROUPBY`category_id`)b->WHEREa.`category_id`=b.`category_id`ANDa.`price`=b.`max_price`;7.6.6子查询关键字
先定一个小目标!掌握子查询关键字,能够利用EXISTS关键字判断子查询语句是否有返回结果7.6.6子查询关键字EXISTS关键字:判断子查询的结果,返回两个结果值:0表示不成立,1表示成立。语法格式WHEREEXISTS(子查询语句);7.6.6子查询关键字案例:子查询关键字使用代码示例mysql>UPDATE`my_goods`SET`name`='电饭煲',`price`='599',->`category_id`=(SELECT`id`FROM`my_goods_category`->WHERE`name`='厨具')->WHEREEXISTS(SELECT`id`FROM`my_goods_category`->WHERE`name`='厨具')->AND`id`=5;QueryOK,0rowsaffected(0.01sec)Rowmatched:0Changed:0Warnings:0子查询无结果,则EXIST()的返回结果为0。UPDATE语句的更新条件不满足,不会进行更新。7.7外键7.7.1什么是外键
先定一个小目标!熟悉什么是外键,能够利用外键为多个数据表建立表关系7.7.1什么是外键外键:在一个表中引用另一个表中的一列或多列,被引用的列应具有主键约束或唯一性约束,从而保证数据的一致性和完整性。被引用的表称为主表;引用外键的表称为从表。语法格式[CONSTRAINT外键名]FOREIGNKEY[索引名](当前表字段名)REFERENCES
外部表(主键字段)7.7.1什么是外键案例:创建外键代码示例mysql>CREATETABLE`majors`(->`id`INTPRIMARYKEYAUTO_INCREMENT,->`name`VARCHAR(32)NOTNULLUNIQUE->)DEFAULTCHARSET=utf8;创建主表。STEP017.7.1什么是外键案例:创建外键代码示例mysql>CREATETABLE`student`(->`id`INTPRIMARYKEYAUTO_INCREMENT,->`name`VARCHAR(32)NOTNULL,->`mid`INTNOTNULL,->CONSTRAINT`m_id`FOREIGNKEY(`mid`)REFERENCESmajors(`id`)->)DEFAULTCHARSET=utf8;创建从表,添加外键约束。STEP027.7.1什么是外键案例:创建外键代码示例mysql>DESC`student`;+-------+------------------+------+-----+---------+-----------------+|Field|Type|Null|Key|Default|Extra|+-------+------------------+------+-----+---------+-----------------+|id|int(10)unsigned|NO|PRI|NULL|auto_increment||name|varchar(32)|NO||NULL|||mid|int(10)unsigned|NO|MUL|NULL||+-------+------------------+------+-----+---------+-----------------+查看外键信息。STEP037.7.2添加外键约束
先定一个小目标!掌握外键约束的添加,能够利用外键约束确保数据表的完整性,能够在更新数据和删除数据时对外键进行限制7.7.2添加外键约束外键约束:外键对主表(外键指向的表)和从表(外键所在的表)里的数据产生约束效果,主要针对数据的插入、更新和删除操作。语法格式[CONSTRAINT外键名]FOREIGNKEY[索引名](当前表字段名)REFERENCES外部表(主键字段)[ONDELETE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}][ONUPDATE{RESTRICT|CASCADE|SETNULL|NOACTION|SETDEFAULT}]注意:只有InnoDB存储引擎支持外键约束,建立外键关系的两个数据表的字段数据类型必须相似。如INT和TINYINT类型的字段可以建立外键关系,INT和CHAR类型的字段不可以建立外键关系。7.7.2添加外键约束外键约束参数说明:参数名称功能描述RESTRICT默认值,拒绝主表删除或修改外键关联字段CASCADE主表中删除或更新记录时,同时自动删除或更新从表中对应的记录SETNULL主表中删除或更新记录时,使用NULL值替换从表中对应的记录(不适用与NOUNULL字段)NOACTION与默认值RESTRICT相同,拒绝主表删除或修改外键关联字段SETDEFAULT设默认值,但InnoDB目前不支持7.7.2添加外键约束案例:外键约束代码示例mysql>CREATETABLE`student`(->`id`INTPRIMARYKEYAUTO_INCREMENT,->`name`VARCHAR(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肉类购货协议书
- 现金补偿协议书
- 罢访息诉协议书
- 脱欧后备协议书
- 样板间软装销售协议书
- 和好朋友做生意协议书
- 房屋过度费补偿协议书
- 送养子女协议书
- 环境建设协议书
- 幼儿放学后托管协议书
- 2024年人工智能训练师(初级)职业鉴定理论考试题库及答案
- 山东省青岛市崂山区2023-2024学年七年级下学期期末数学试题
- 某银行培训管理手册
- 氧气吸入操作评分标准(中心供氧)
- php设备管理系统论文
- 2019年压力性损伤预防治疗临床实践指南
- (高清版)JTGT 3360-01-2018 公路桥梁抗风设计规范
- MT-T 1199-2023 煤矿用防爆柴油机无轨胶轮运输车辆安全技术条件
- 【美的集团企业应收账款现状、问题及对策(论文6200字)】
- 老年护理职业前景课件
- 老年人陪同就医服务规范
评论
0/150
提交评论