MySQL 多表查询--笛卡尔积--外键约束--内连接查询--自连接查询--外连接查询--DML操作--数据备份和恢复

MySQL 多表查询--笛卡尔积--外键约束--内连接查询--自连接查询--外连接查询--DML操作--数据备份和恢复

1.多表查询

通过一条SQL语句得到两张表不同的信息。这里就需要用到多表查询
####单表查询语法:

SELECT<selectList>
FROM table_name

####多表查询语法:

SELECT<selectList>
FROM table_nameA,table_nameB(表名A,表名B)

以下为三张表测试数据

1: 商品分类表,dir_id:是分类的编号

2: dirName:分类的名称,parent_id:分类所属的父分类

3: 商品的库存表:product_id(商品id)storeNum(库存数量),lastIncomeDate(最后的入库时间),lastOutcomeDate(最后的出库时间),warningNum(警戒值,当商品达到一定值的时候需要进货)

2.笛卡尔积

需求:查询分类为2的商品总数

SELECT count(*)FROM product WHERE dir_id=2

查询所有的的货品信息+对应的货品分类信息

笛卡尔积现象(有84条数据)

SELECT *FROM product,productdir

需求:查询所有的货品信息+ 对应的货品分类信息(20条数据)

SELECT *FROM product,productdir WHERE product.dir_id=productdir.id

笛卡尔积:两张表,A表和B表当中,所有数据它的组合关系就称之为笛卡尔积现象。

解决方案:在WHERE加入有效的连接条件----->等值连接
注意了:如果是n张表该如何处理,n张表 至少需要 n-1个连接条件。

3.外键约束

外键约束:FOREIGN KEY,A表中的外键列。A表中的外键列的值必须参照于B表中的某一列(B表主键)。

CONSTRAINT 'product_ibfk_1' FOREIGN KEY('dir_id')REFERENCES 'productdir'('id')

注意了:在MySQL中,InnoDB中支持事务和外键。修改表的存储引擎为InnoDB;ALTER TABLE 表蒙 ENGINE='InnoDB';

4.内连接查询

需求:查询所有商品的名称和分类名称:

SELECT p.productName,pd.dirName from produce p,productdir pd WHERE p.dir_id=pd.id
内连接查询:不满足条件的都查不出来。

内连接查询:是相对于外连接。
内连接分为:隐是内连接,显示内连接(推荐),其查询效果相同,仅仅只是语法不同而已:

隐式内连接:
SELECT <selectList>
FROM A,B WHERE A.列=B.列
显示内连接(推荐写法):[INNER] JOIN ON
SELECT <selectList>
FROM A[INNER] JOIN B ON A.列=B.列

需求:查询所有商品的名称和分类名称:

隐式:

SELECT p.productName,pd.dirName from product p,productdir pd where p.dir_id=pd.id

显示:

SELECT p.productName,pd.dirName from product p INNER JOIN productdir pd ON p.dir_id=pd.id

在做等值连接的时候,若A表中和B表中的列名相同。则可以简写:

SELECT <selectList>
FROM A[INNER]JOIN B USING(同名的列)
前提:在emp和dept表中都有deptno列。并且是外键关系。
SELECT *FROM emp JOIN dept USING(deptno)

需求:查询零售界大于200的无线鼠标
隐式:
SELECT *
FROM product p,prodctdir pd
WHERE p.dir_id=pd.id AND p.sa;ePrice>200 AND pd.dirName='无线鼠标'

显示:
SELECT *
FROM product p join productdir pd ON p.dir_id=pd.id
WHERE p.salePrice>200 AND pd.dirName='无线鼠标'
需求:查询零售价大于200的无线鼠标(使用表的别名)
需求:查询每个货品对应的分类以及对应的库存
SELECT *FROM product p,productdir pd,productstock ps
WHERE P.dir_id=pd.id AND p.id=ps.product_id

需求:如果库存货品都销售完成,按照利润从高到低查询货品名称,零售价,货品分类(三张表)
SELECT *,(p.salePrice-p.costPprice)*ps.storeNum lr FROM product p
join productdir pd ON p.dir_id=pd. id
JOIN productstock ps ON p.id=ps.product_id
ORDER BY lr DESC

不带别名出现的异常,不清楚id来自那张表。id重复 了就会报ambiguous

SELECT *,(p.salePrice-p.costPprice)*ps.storeNum lr FROM product p
join productdir pd ON p.dir_id=id
JOIN productstock ps ON p.id=ps.product_id
ORDER BY lr DESC

SELECT productName,(p.salePrice-p.costPprice)*ps.storeNum lr FROM product p
join productdir pd ON p.dir_id=id
JOIN productstock ps ON p.id=ps.product_id
ORDER BY lr DESC

5.自连接查询

自连接的用处在于,你需要的数据在一张表里面。当是又不能通过一张表中得到数据,此时就可以把它看出两张表来。

需求:查询商品分类的名称和父分类的名称

SELECT * FROM productdir child,productdir parent
WHERE child.parent_id=parent.id

6.外连接查询

左 外连接:查询出JOIN左边表的全部数据查询出啦,JOIN右边的表不匹配的数据使用NULL来填充数据。

右 外连接:查询出JOIN右边表的全部数据查询出啦,JOIN左边的表不匹配的数据使用NULL来填充数据。

语法格式:
SELECT <selectList>
FROM A LEFT/RIGHT[OUTER]JOIN B
ON (A.column_name=B.column_name)

查询所有的商品信息和对应的分类信息。

左外连接:
select *from product p LEFT OUTER JOIN productdir pd ON p.dir_id=pd.id

右外连接:
select *from product p right OUTER JOIN productdir pd ON p.dir_id=pd.id

7.DML操作(增删改)

插入语句:一次插入操作只插入一行。

INSERT INTO table_name(column1,column2, column3....) VALUES (value1,value2,value3);

>在商品分类表中插入一条数据
>INSERT INTO productdir(id,dirName,parent_id)VALUES(5,'机械鼠标',1)  //插入的值的顺序不能变
>INSERT INTO productdir(id,dirName)VALUES(null,'机械鼠标')
>一条SQL插入多条语句
>INSERT INTO productdir(id,dirName)VALUES(null,'机械鼠标'),
>                                        (null,'机械鼠标'),
>                                        (null,'机械鼠标'),
>                                        (null,'机械鼠标'),
>                                        (null,'机械鼠标')

更新语句:

UPDATE  table_name
SET   columnName1=value1,columnName2=value2,...
[WHERE  condition];
如果省略了where子句,则全表的数据都会被修改。注意:没有FROM
//修改单列
UPDATE product SET productName='罗技001' WHERE id=23

修改多列

UPDATE product SET productName='罗技001',dir_id WHERE id=23

需求:将零售价大于300的货品零售价上调0.2倍

UPDATE product SET salePrice=salePrice*1.2 WHERE salePrice>300

需求:将零售价大于300的有线鼠标的货品零售价上调0.1倍

UPDATE produce p,productdir pd
SET salePrice=salePrice*1.1
WHERE p.dir_id=pd.id AND p.salePrice>300 AND pd.dirName='有线鼠标'

删除语句:

DELETE FROM table_name
[WHERE  condition];
如果省略了where子句,则全部的数据都会被修改

8.数据备份和恢复

8.1:MySQL自身的数据库的维护:

MySQL自带的命 令


猜你喜欢

转载自www.cnblogs.com/SteveDZC/p/9863557.html