- 使用My’SQL数据库中的数据进行减法运算时,
- 不是不可以,要注意: 比如说我当前两张表是这样的:
一个是theorder用来存放订单,一个是product用来存放产品,想求库存量,需要用product表中的amount减去theorder表中对应产品的被订购的数量总和。
我开始写成了这样:
select (product.amount-select sum(theorder.amount) from theorder where productID=3) as inventory where
-> product.ID=3 from product;
看着蛮正常的,人就是说这语句有毛病:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select sum(theorder.amount) from theorder where productID=3) as inventory where ’ at line 1
然后我改,分步写:
反正分开好着整一起就不行了。
后来网上搜了一下,分别select出来,然后再把减完的结果select出来,就成了:
select(
(select product.amount as s2)
- (select sum(theorder.amount) as s1 from theorder where productID=3)
)
as inventory from product where I
(然鹅乘法我想用这套路,搞不了。)
- 和小明学的,为了不重复建表:
create table if not exists ohh
(......);
- 还可以在建表时设置字符集,这样就可以正常显示汉字而不是???了:
create table if not exists theOrder(ID int primary key auto_increment,clientID int,number int,orderDate date,productID int,amount int)default charset=utf8
- 数据库SQL实战之 查找最晚入职员工的所有信息
思路:
首先需要找到入职日期最大的那个员工信息:
select max(hire_date) from employees;
这只是找到了“最大入职日期”,接下来需要找到“最大入职日期对应的员工”:
select * from employees
where hire_date =
(select max(hire_date) from employees);
(注意括号。)
- 数据库SQL实战之 查找入职员工时间排名倒数第三的员工所有信息。
思路:先将员工入职时间降序排列,再生成一个从“1”开始自增1的列,然后选出“1”,“2”,“3”对应的员工信息。
有个函数“ROW_NUMBER”支持这样的功能:为结果集的每一行增加一个行号,但是这是8.0版本以后才支持的:
应该使用limit子句约束要返回的最大行数"1",配合offset指定偏移量(从"0"开始)“2”:
select * from employees
order by hire_date desc
limit 1 offset 2;
- 联结🔗:
“相同的数据出现多次绝不是一件好事。
这是关系数据库设计的基础。关系表的设计就是把信息分解开来,一类数据一个表,各表通过某些共同的值相互关联。”
联结的语句是指定要联结的所有表,及关联它们的方式。
有以下联结:
(1)where子句建立联结。
(2)内联结/等值联结。
A inner join B
on A.c=B.c;
(3)联结多个表。
不要联结没有必要的表,联结的表越多,性能下降得越厉害。
(4)自联结。
(5)自然联结。
排除多次出现,使每一列只返回一次。
(6)外联结。
许多联结将一个表中的行与另一个表中的行相关联,但有时候需要包含关联行的那些行。例如:
对每个顾客下的单计数,包括那些至今未下单的顾客。
列出所有产品和订购数量,包括没有人订购的产品。
计算平均销售规模,包括那些至今尚未下单的顾客。
数据库实战之 查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
这种情况就应该用外联结。
必须用 left
或 right
关键字指定包括其所有行的表。( 牛客网编辑器不支持右连接哦! )比如本题中“包含所有行的表”是employees
表,而另一个表dept_emp
中的属性dept_no
可以为null。
(
LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
RIGHT JOIN 会读取右边数据表的全部数据,即便左边表无对应数据。
“即便无对应数据” 也就可以得到"null"了。
)
from LEFTTABLE as l left/right (outer) join RIGHTTABLE as r
on l.a=r.b;
- 数据库SQL实战之 查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数.
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date`
date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY
(`emp_no`,`from_date`));
牛客网的这道题认为同一个员工,有多少条工资记录就是涨薪多少次,所以只需要对员工先按员工号emp_no
分组,再统计每个组的emp_no的个数,即可得到对应的涨薪次数,要注意的是,与group by 搭配使用的是having子句,而不是where 。
select emp_no,count(emp_no) as t
from salaries
group by emp_no
having t>15;
group by必须出现在where子句之后,order by 子句之前。
where 过滤指定的是行,而不是分组。having 过滤才是基于分组聚集值。
事实上,目前所学的所有类型的where子句都可以用having 子句代替。
来源:CSDN
作者:小洪小洪/遇见彩虹。
链接:https://blog.csdn.net/weixin_41750142/article/details/103879635