做婚姻介绍网站赚钱吗,成都装修公司排名前十强有哪些,wordpress aj提交评论,健康咨询类网站模板目录 多表查询为什么要用多表查询#xff1f;笛卡尔积和内连接消除笛卡尔积外键数据库内连接练习左连接查询和右连接查询等值连接out join自连接子查询 数据操作(DML)数据的插入数据的删除数据的修改 数据库的备份与恢复Dos命令行窗口导出Dos命令行窗口导入Navicat导出Navicat… 目录 多表查询为什么要用多表查询笛卡尔积和内连接消除笛卡尔积外键数据库内连接练习左连接查询和右连接查询等值连接out join自连接子查询 数据操作(DML)数据的插入数据的删除数据的修改 数据库的备份与恢复Dos命令行窗口导出Dos命令行窗口导入Navicat导出Navicat导入 函数查漏补缺数据库访问控制视图三范式 多表查询
为什么要用多表查询
可以减少单表里面的字段 可以很灵活的查询相要的数据。
笛卡尔积和内连接消除笛卡尔积
-- 迪卡尔积就是两张表组合查询时一张表的一行数据会和另一张表的每一行都组合一下
-- 示例 SELECT * from product,productdir;
-- 消除迪卡尔积
-- 内链接SELECT * from product,productdir where product.dir_id productdir.id -- 隐式内链接SELECT * from product INNER JOIN productdir ON product.dir_id productdir.id -- 显示内链接SELECT * from product JOIN productdir ON product.dir_id productdir.id -- 显示内链接 写法2外键
含义A表中的某一列参考B表中的某一列(id)
外键在程序中的体现 CASCADE父表delete、update的时候子表会delete、update掉关联记录 SET NULL父表delete、update的时候子表会将关联记录的外键字段所在列设为null所以注意在设计子表时外键不能设为not null RESTRICT如果想要删除父表的记录时而在子表中有关联该父表的记录则不允许删除父表中的记录 NO ACTION同 RESTRICT也是首先检查外键
tipsMyISAM不支持外键InnoDB才支持外键
数据库内连接练习 -- 查询货品id货品名称货品所属分类名称SELECT product.*,productdir.dirName FROM product INNER JOIN productdir ON product.dir_idproductdir.id-- 查询零售价大于200的无线鼠标SELECT * FROM product AS p INNER JOIN productdir AS pd ON p.dir_idpd.id AND p.salePrice200 AND pd.dirName无线鼠标-- 查询零售价大于200的无线鼠标(使用表的别名)SELECT * FROM product AS p INNER JOIN productdir AS pd ON p.dir_idpd.id AND p.salePrice200 AND pd.dirName无线鼠标-- 查询每个货品对应的分类以及对应的库存SELECT p.*, pd.dirName, ps.store_num FROM product p INNER JOIN productdir pd INNER JOIN product_stock ps ON p.dir_idpd.id AND p.idps.product_id-- 如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类三张表.SELECTp.productName,p.salePrice,pd.dirName,(p.salePrice - p.costPrice) * ps.store_num AS lrFROMproduct pINNER JOIN productdir pdINNER JOIN product_stock ps ON p.dir_id pd.idAND p.id ps.product_id ORDER BY lr DESC左连接查询和右连接查询 -- 外链接-- 左连接 LEFT JOINSELECT * FROM employee INNER JOIN department ON employee.deptiddepartment.id; -- 内连接SELECT * FROM employee LEFT JOIN department ON employee.deptiddepartment.id; -- 左连接-- 右连接 RIGHT JOIN SELECT * FROM employee right JOIN department ON employee.deptiddepartment.id; -- 右链接-- 总结 内连接 左连接 外连接 的区别内连接 多表连表查询时, 只显示他们数据有关联的部分左连接 多表左连接查询时, 按照左表为标准,显示左边所有的数据和右表中与左表有关系的数据右连接 多表右连接查询时, 按照右表为标准,显示右边所有的数据和左表中与右表有关系的数据等值连接 -- 等值连接 (A表的外键名 和B表的外键名一致) USINGSELECT * FROM employee JOIN department ON employee.deptiddepartment.deptid; -- 原来的写法SELECT * FROM employee JOIN department USING (deptid)out join 自连接
业务场景 -- 自连接SELECT p2.*, p.dirName FROM productdir AS p JOIN productdir AS p2 ON p.idp2.parent_id ;子查询 -- 查询零售价比罗技MX1100更高的所有商品信息。SELECT * from product where salePrice (SELECT salePrice FROM product WHERE productName罗技MX1100)-- 单行多列子查询需求: 查询分类编号和折扣与罗技M100相同的所有商品信息。SELECT * FROM productWHERE (dir_id,cutoff)(SELECT dir_id,cutoff FROM product WHERE productName 罗技M100)-- 我们真实开发中要避免过多连表查询数据操作(DML)
数据的插入
-- 增加 INSERT into 表名(列名1列名2...) values(值1,值2,.....) -- 写法一INSERT INTO employee(id,name,deptid) VALUES(6,明锋,3); INSERT INTO employee VALUES(7,明锋,3); -- 写法二 如果我里面每一个字段都有值表后面可以省略字段 INSERT INTO employee(name,deptid) VALUES(明锋,3); -- 写法三 如果列满可以省略前面的列名
-- 批量增加 INSERT INTO employee(name,deptid) VALUES(明锋,3),(xxx,4),(xxx2,5); INSERT INTO employee (SELECT * FROM employee) -- 把当前表的数据查询出来再插入进当前表INSERT INTO employee(name,deptid) (SELECT name,deptid FROM employee) -- 把当前表的数据查询出来再插入进当前表数据的删除
-- 删除数据DELETE FROM 表名 WHERE id ? -- 删除一条数据DELETE FROM 表名 -- 删除全部数据-- 删除多条数据DELETE from employee WHERE id in(2,3); -- 这种写法DELETE from employee where id BETWEEN 4 AND 9DELETE from employee where id 12数据的修改 UPDATE 表名 SET 列名值 , 列名2值 -- 修改全部UPDATE 表名 SET 列名值 , 列名2值 where id -- 按id来修改UPDATE employee SET name小困困,deptid3 WHERE id8180UPDATE employee SET name阮经天,deptid3-- 指定id批量修改 -- 自己去研究难UPDATE employee SET name小困困,deptid3 WHERE id in (8180,8181,8182) -- 修改指定的id的内容-- 这里你们要求研究一下 扩展 -- 特难 数据库的备份与恢复
Dos命令行窗口导出
在dos命令行窗口进行若操作系统版本高则使用管理员模式 -- 检索栏输入cmd - 右键以管理员身份运行
mysqldump -u账户 -p密码 数据库名称脚本文件存储地
mysqldump -uroot -proot test1 D:\data\test.sqlDos命令行窗口导入
速度最快(用的批量插入)导入前可先清空数据库中的表
mysql -u账户 -p密码 数据库名称 脚本文件存储地址
mysql -uroot -proot test1 D:\data\test.sqlNavicat导出
Navicat中右键数据库 - 转储sql文件
Navicat导入
拖拽SQL文件到navicat数据库里速度慢(一行一行插入)
函数 -- castSELECT CAST(1234.8678 AS SIGNED) --转 整型不会四舍五入SELECT CAST(deptid AS SIGNED) AS id,deptName FROM department -- 把字符串转成整形(deptid在这里的数据库中类型定义为varchar)SELECT CAST(1234.8678 AS decimal) -- 装decimal会四舍五入SELECT CAST(1234.8678 AS decimal(6,2)) -- 装decimal 第一个数字:保留数字长度第二个数字:保留小数长度-- ifnullSELECT id,productName,dir_id,IFNULL(salePrice,0) AS salePrice FROM product -- 如果salePrice为null赋值0 防止部分不能接受null值得类型收到null报错查漏补缺
数据库访问控制 视图
即由sql构成的临时表用sql来创建视图
SELECT salePrice FROM product WHERE productName罗技MX1100
SELECT * from product where salePrice (SELECT * from haha)三范式
1.列的原子性列不可分割 数据库表中的所有字段值都应该是不可分解的原子值 2.主键相关表中的每列都和主键相关
如订单商品用联合主键做一张表应该换成分开的两张表
3.主键直接相关不是间接相关
我的表不应该有别的表的数据别的表的数据应该通过外键来关联 A表里面的字段不能拥有B表里面的数据数据不能够重复 如下面右表虽然希望展示deptName信息但不该有deptName字段数据应该通过关联查询推导出来。