声明一下,下面的内容仅代表个人的理解,有问题可以提出,谢谢
1.运行程序时遇到的问题
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your My
此时可以看到product_name下出现波浪线,说明出错是在这个位置,主要问题是因为没有使用空格,而是使用了Tab进行缩进
2.在代码写入后发现列表里面没有更新
在上图圈出来的地方进行刷新就会出现了(注:如果刷新了,create就会出错,所以需要drop掉之前创建的)
3.
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE tha
(1)在代码里面加入
SET SQL_SAFE_UPDATES = 0;
(2)有些时候是因为数据没有初始化造成,所以初始化后,也可以避免报错
4.在workbench里面可视化生成表
方法1:
点击圈起来的部分就可以看见了
方法2:
SELECT * FROM (表名)
5.视图与表的区别
两者就好比excel里面一些文件仅可读,无法写入,一些文件即可以写入又可以进行读取。视图就是类似于只可读文件,而表就是类似于可读可写文件。
子查询也是建立在视图的基础上,如果想要使用子查询,就需要先建立一个视图,然后进行子查询
6.主键约束
在创建表TABLE的时候,总是会存在一行专门定义为priamry key。这个就表示这一列的内容不能重复,每一个元素代表对应的行。可以通过主键约束行找到某一行
7.查找表中的一部分数据
可以使用where (列名) in(数据)
8.行转列
1.当待转换列为数字时,可以使用SUM AVG MAX MIN等聚合函数+(case when then)
sum表示和,avg表示平均
2.当待转换列为文本时,可以使用MAX MIN等聚合函数+(case when then)
9.外连接中的左右连接区分
左右连接取决与select中的哪些元素,前几列来自那个表。左即对应着前几列对应的表,为主表,左连接就是使得左边几列的数据保持一致,右边列的数据可以不一致。右即对应着后几列对应的表,右连接就是使得右边几列的数据保持一致,左边列的数据可以不一致。
SP.shop_id
,SP.shop_name
,SP.product_id
,P.product_name
,P.sale_price
上面就是当为左连接时,sp为主表;当为右连接时,p为主表
10.表与表的增加:列增加与行增加
列增加通常使用union
行则使用inner join、left outer join、cross join
SELECT SP.*, P.*
FROM ShopProduct AS SP
inner JOIN Product AS P;
-- colunms add
select *
from product as p1
where p1.sale_price > 500
union
select *
from product2 as p2
where p2.sale_price > 500;
-- rows add
select *
from product as p1
inner join(select * from product2
where sale_price>500)as p2
on p2.product_id=p1.product_id;
11.当聚合函数在窗口函数中使用
sum() / avg() over (order by)按照从上到下进行加减乘除
sum(sale_price) over(order by product_id) as sum_price
sum列 1000+500+4000+3000
当加入移动函数时,则加减乘除也是在限定的行数内
分为proceding,between,following
sum(sale_price) over(order by product_id rows 2 preceding) as sum_price
由上图知,加的范围是前两行与当前行,如果前面没有,则默认为0
1000+0+0
500+1000+0
4000+500+1000
12.select的执行是在group by之后执行的,如果想要显示某一列的最大值,同时将该行指出。即在显示某一行在某个数据最大或最小时,无法直接使用max或者min结合group by来执行得到,需要结合其他的才能够得到正确结果
错误示范
上图本来打算显示每个部门中最高的薪资对应的人,但是由于max控制的只有salary列,无法控制name列,该列的数据属于随机分配
正确示例
SELECT name, salary
from employee
where salary in (select MAX(salary) AS max_salary
From Employee
GROUP BY departmentID);
13.当想要查看表格某一列(平均值或者最大值),并且增加一列来显示该数据,可以使用关联子查询
create view sale_price_al(product_id,product_name,product_type,sale_price,sale_price_all)
as
SELECT product_id,
product_name,product_type,
sale_price,
(SELECT AVG(sale_price) FROM product) AS avg_price-- 这部分就是增加的列
FROM product;