我是一个新的编写SQL,我有一个关于连接的问题.这是一个选择示例:
select bb.name from big_box bb, middle_box mb, little_box lb
where lb.color = 'green' and lb.parent_box = mb and mb.parent_box = bb;
Run Code Online (Sandbox Code Playgroud)
所以我要说的是,我正在寻找所有大盒子的名字,这些盒子里面嵌套着一个绿色的小盒子.如果我理解正确,上面的语法是通过使用'join'关键字获得相同结果的另一种方法.
问题:上面的select语句是否对它正在进行的任务有效?如果没有,有什么更好的方法呢?是连接的语句语法糖还是实际上正在做其他事情?
如果你有关于这个主题的任何好材料的链接,我很乐意阅读它,但由于我不知道究竟是什么称这种技术,我在谷歌上搜索它有困难.
我正在查看由不熟悉SQL的开发人员维护的代码.我在他的代码中经常看到以下代码片段:
SELECT *
FROM person, status
WHERE person.status_id = status.id
Run Code Online (Sandbox Code Playgroud)
我已向他建议他使用以下代码:
SELECT *
FROM person
INNER JOIN status ON status.id = person.status_id
Run Code Online (Sandbox Code Playgroud)
他指出,在这种特殊情况下,两个查询在相同的时间范围内返回相同的结果(67毫秒中的34k行).我的新查询在这种情况下没有改变任何事实这一事实证明了这种方法没有任何问题.我曾尝试向他解释笛卡尔等产品,但他坚持认为这种方法没有任何问题.有人可以帮助提供负面的例子,说明依赖于此的方法会失败,和/或为什么从实施的角度来看这种查询行是危险的?
假设我有这样的查询:
SELECT
s.staffID as staffID,
CONCAT_WS(", ", lname, fname) AS name,
GROUP_CONCAT(unit SEPARATOR ", ") AS units
FROM
staff s,
units u,
staff_units r
WHERE
s.staffID = r.staffID
AND u.unitID = r.unitID
GROUP BY s.staffID
ORDER BY lname
Run Code Online (Sandbox Code Playgroud)
这得到一个这样的列表:
Alice Accounting
Bob Systems
Charlie Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)
好的,到目前为止.现在假设我删除了staff_units记录Alice作为Accounting成员的条目.然后,运行此查询将生成一个列表,从中排除Alice,即使她仍然存在于staff表中:
Bob Systems
Charlie Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)
我可以调整这个SQL,以便它继续返回Alice,结果显示她未分配给一个单元吗?
我当然可以运行一个查询来获取人员列表,并为每个人员查询另一个查询以获取当前分配.但这意味着要运行n + 1个查询来构建列表,其中n是人员数量,这只是让我错了.
我试图找出在同一类别的另一个表中找到的时间戳的阈值时间内发生的事件数.改变delta的最快方法是什么(在下面给出的情况下,delta是5分钟)?我刚刚使用游标测试了一种方法(将变量设置为5,然后继续递增并执行相同的查询),但每次迭代需要10秒.在我的实际数据中,#EVENTS中的行数大约等于100K,而#CHANGES大约是500K.
我的表格如下:
CREATE TABLE #EVENTS(Category varchar(20), Timestamp datetime)
GO
INSERT INTO #EVENTS VALUES('A', '2013-01-23 05:02:00.000')
INSERT INTO #EVENTS VALUES('A', '2013-01-23 05:04:00.000')
INSERT INTO #EVENTS VALUES('B', '2013-01-23 05:03:00.000')
INSERT INTO #EVENTS VALUES('B', '2013-01-21 05:02:00.000')
GO
CREATE TABLE #CHANGES(Category varchar(10), Timestamp datetime)
GO
INSERT INTO #CHANGES VALUES('A', '2013-01-23 05:00:00.000')
INSERT INTO #CHANGES VALUES('B', '2013-01-21 05:05:00.000')
SELECT *
FROM
(
SELECT X.Category, X.Timestamp, Y.Timestamp BeforeT, DATEADD(MINUTE, 5, Y.Timestamp) AfterT
FROM #EVENTS X, #CHANGES Y
WHERE X.Category = Y.Category
) X
WHERE X.Timestamp BETWEEN …Run Code Online (Sandbox Code Playgroud) 我有一个工作的SQL语句,当我在MAMP上检查它时返回了正确的结果.
SELECT `questions`.`questionID` AS question, `questions`.`questionText`,
`questions`.`categoryID`,`answers`.`answerID`,`answers`.`answerText`,
`answers`.`isTrue`
FROM `questions`,`answers`
WHERE `questions`.`questionID` = `answers`.`questionID`
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何用PHP打印输出.请帮忙.这是代码:
<html>
<body>
<?php
header('Content-Type: text/html; charset=utf-8');
$con=mysqli_connect("localhost","root","root","Theory");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT `questions`.`questionID` AS question, `questions`.`questionText`, `questions` .`categoryID`, `answers`.`answerID`,`answers`.`answerText`,`answers`.`isTrue`
FROM `questions`,`answers`
WHERE `questions`.`questionID` = `answers`.`questionID`");
if (!$result)
{
die('Error: ' . mysqli_error($con));
}
while($row = mysqli_fetch_array($result))
{
echo "{";
echo "{" . $row['questions'.'questionID'] . "}"; //this is not the full print …Run Code Online (Sandbox Code Playgroud) 我需要交叉引用2个表.
在tb1内是booking_ref,投资者
在tb2内是booking_ref,投资者,成本
问题是如果没有成本,表2中没有创建记录
所以我有以下查询......
SELECT
tb1.booking_ref, tb1.investor, tb2.cost
FROM
tb1, tb2
WHERE
tb1.booking_ref = tb2.booking_ref
AND
tb1.investor = tb2.investor
AND
tb1.investor = ''12345''
Run Code Online (Sandbox Code Playgroud)
这显示了tb2中匹配的booking_ref的所有预订,但我还需要显示没有匹配的booking_ref的预订
有任何想法吗??
可能重复:
显式vs隐式SQL连接
我知道现在很多人会对我大喊大叫.但是从我的理解
说我有两张桌子
学生们
student_id
firstname
surname
Run Code Online (Sandbox Code Playgroud)
课程
course_id
name
student_id
Run Code Online (Sandbox Code Playgroud)
所以课程表有一个外键STUDENT_ID意味着一个学生可以拥有多个课程吗?
好的.
根据我的理解,如果我想选择与一名学生相关的所有课程,我可以做以下任何一项:
SELECT *
FROM courses AS c, students AS s
WHERE c.student_id = s.student_id
AND s.student_id = 1;
Run Code Online (Sandbox Code Playgroud)
要么
SELECT *
FROM courses AS c
JOIN students AS s ON c.student_id = s.student_id AND s.student_id = 1;
Run Code Online (Sandbox Code Playgroud)
那么当它与WHERE基本上完全相同时,JOIN的重点是什么?
我知道我的理解是错的,但我找不到简单的答案.
请赐教!
我想知道为什么条件交叉联接必须具有WHERE子句中指定的条件,以及为什么它在'ON'子句中不起作用。请参阅编译示例的链接:http : //rextester.com/IKY8693
业务环境:我需要生成一个开始日期和结束日期之间的日期列表,以填补空白,以便与第三张表保持连接,以便在特定月份返回零/空值。
我是如何做到的:让我们以一个带有YYYYMM开始和结束日期的用户表为例。
| user_id | start_yearmonth | end_yearmonth |
|---------|-----------------|---------------|
| u9876 | 201504 | 201610 |
| u5564 | 201602 | 201612 |
| u4435 | 201606 | NULL |
Run Code Online (Sandbox Code Playgroud)
要交叉连接的表是所需的YYYYMM日期的表。
| yearmonth |
|-----------|
| 201601 |
| 201602 |
| 201603 |
| 201604 |
| 201605 |
| 201606 |
| 201607 |
| 201608 |
| 201609 |
| 201610 |
| 201611 |
| 201612 |
| 201701 | …Run Code Online (Sandbox Code Playgroud) 我对我的一项家庭作业有一定的要求.我需要列出学生名单,并打印所有学生,学分为12或以上.学分小时存储在一个单独的表中,基本上通过第三个表引用,学生表,带小时的班级表,以及将学生ID与课程ID匹配的登记表
我使用了从表中按名字分组的SUM聚合,并且一切都很好,但我不太清楚如何过滤掉不到12小时的人,因为SQL不知道每个人有多少小时直到完成查询为止.
我的字符串看起来像这样
'SELECT Students.Fname, SUM(Classes.Crhrs) AS Credits
FROM Students, Classes, Enrolled
WHERE Students.ID = Enrolled.StudentID AND Classes.ID = Enrolled.CourseID
GROUP BY Students.Fname;'
Run Code Online (Sandbox Code Playgroud)
它工作正常,并在Delphi项目中显示网格,但我不知道从这里过滤结果,因为每个查询运行删除前一个.
我在下面的两个查询和相同的执行计划中都得到相同的结果,有什么区别吗?还是我更喜欢写查询?
SELECT PS.StepID,PR.ProgramID FROM ProgramSteps PS, Programs PR
WHERE PS.ProgramID = PR.ProgramID
SELECT PS.StepID,PR.ProgramID FROM ProgramSteps PS
INNER JOIN Programs PR ON PS.ProgramID = PR.ProgramID
Run Code Online (Sandbox Code Playgroud) 我有一个SQL查询,如下所示:
SELECT
a.id user_id, a.type, a.email_address,
a.name_first, a.name_last, languages.title as language,
b.created_at purchased_on, b.expires_at watchable_until,
c.title,
d.title topic,
e.title category,
f.subject, f.grade
FROM users a,
user_video_purchases b,
videos c,
gradesubject_category_topics d,
gradesubject_categories e,
gradesubjects f
JOIN languages ON
users.language_preferred_id = languages.id
WHERE a.id = b.user_id
AND b.video_id = c.id
AND c.gradesubject_category_topic_id = d.id
AND d.gradesubject_category_id = e.id
AND e.gradesubject_id = f.id
ORDER BY purchased_on DESC;
Run Code Online (Sandbox Code Playgroud)
此查询返回以下错误消息:
'on子句'中的未知列'users.language_preferred_id'
这些列存在于users表中,据我所知JOIN是正确的.
有人可以指出我可能出错的地方吗?
select o.customerid, c.customername, o.orderdate
from orders as o, customers as c
where o.orderdate='1997-08-26';
Run Code Online (Sandbox Code Playgroud)
使用示例northwind db,我无法弄清楚出了什么问题?我使用了样本表中使用的日期格式.
我正在尝试提取26日下订单的任何人的ID和姓名.
我不明白下面给出的两种编码之间的区别.第一个用于WHERELEFT JOIN.第二个代码使用AND.我不明白从每个编码中得到的输出是什么?
SELECT c.FirstName, c.LastName, oh.SalesOrderNumber
FROM SalesLT.Customer AS c
LEFT OUTER JOIN SalesLT.SalesOrderHeader AS oh
ON c.CustomerID = oh.CustomerID
WHERE oh.SalesOrderNumber IS NULL
ORDER BY c.CustomerID;
SELECT c.FirstName, c.LastName, oh.SalesOrderNumber
FROM SalesLT.Customer AS c
LEFT OUTER JOIN SalesLT.SalesOrderHeader AS oh
ON c.CustomerID = oh.CustomerID
AND oh.SalesOrderNumber IS NULL
ORDER BY c.CustomerID;
Run Code Online (Sandbox Code Playgroud) sql ×10
mysql ×5
sql-server ×3
database ×2
join ×2
cross-join ×1
date ×1
delphi ×1
left-join ×1
php ×1
postgresql ×1
syntax ×1
t-sql ×1