我知道SQL Server中的连接.
例如.Table1,Table2有两个表.
他们的桌子结构如下.
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
Run Code Online (Sandbox Code Playgroud)
表1数据如下:
Id Name
-------------
1 A
2 B
Run Code Online (Sandbox Code Playgroud)
表2数据如下:
Id Name
-------------
1 A
2 B
3 C
Run Code Online (Sandbox Code Playgroud)
如果我执行下面提到的两个SQL语句,则两个输出都是相同的
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)
请解释上述SQL语句中左右连接的区别.
在我所工作的每家公司,我发现人们仍然在ANSI-89标准中编写SQL查询:
select a.id, b.id, b.address_1
from person a, address b
where a.id = b.id
Run Code Online (Sandbox Code Playgroud)
而不是ANSI-92标准:
select a.id, b.id, b.address_1
from person a
inner join address b
on a.id = b.id
Run Code Online (Sandbox Code Playgroud)
对于这样一个非常简单的查询,可读性没有太大差异,但是对于大型查询,我发现将我的连接条件分组并列出表格可以更容易地查看我在连接中可能存在问题的位置,以及让我在WHERE子句中保留所有过滤功能.更不用说我觉得外连接比Oracle中的(+)语法更直观.
当我尝试向人们传播ANSI-92时,使用ANSI-92而不是ANSI-89有什么具体的性能优势吗?我会自己尝试,但是我们这里的Oracle设置不允许我们使用EXPLAIN PLAN - 不希望人们尝试优化他们的代码,是吗?
例如,我想获取应用了某些标签的所有项目的列表.我可以做以下任何一种情况:
SELECT Item.ID, Item.Name
FROM Item
WHERE Item.ID IN (
SELECT ItemTag.ItemID
FROM ItemTag
WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55)
Run Code Online (Sandbox Code Playgroud)
要么
SELECT Item.ID, Item.Name
FROM Item
LEFT JOIN ItemTag ON ItemTag.ItemID = Item.ID
WHERE ItemTag.TagID = 57 OR ItemTag.TagID = 55
GROUP BY Item.ID, Item.Name
Run Code Online (Sandbox Code Playgroud)
或者完全不同的东西.
一般来说(假设有一般规则),什么是更有效的方法?
选择联合:
select * from table1
union
select * from table1_backup
Run Code Online (Sandbox Code Playgroud)
选择交叉点的查询是什么?
这可能吗?
我有2个表,客户和订单.现在,我想在客户中填写该客户的所有订单ID(以逗号分隔).
我试过这样的东西,但它不起作用:
UPDATE customers AS c
LEFT JOIN orders AS o ON o.customerid=c.customerid
SET c.orders = GROUP_CONCAT(DISTINCT o.orderid)
Run Code Online (Sandbox Code Playgroud)
我得到'无效使用群组功能'.
PS.我知道总是在SELECT/JOIN中动态获取GROUP_CONCAT值会更好,但我只是想知道我是否可以用某种方式填充这个列.
我正在学习SQL/dbms并使用Postgres.我想返回在某列中都具有特定值的行.例如,在桌Carpets和Curtains,我想要得到的id行S其中颜色'light yellow'.我想我需要JOIN,但我不确定是什么类型.
这是我得到的:
SELECT id
FROM Carpets
WHERE colour = 'light yellow'
INNER JOIN Curtains ON Carpets.colour = Curtains.colour;
Run Code Online (Sandbox Code Playgroud)
两个表都具有该id属性.
关于学习JOIN,我应该先学习哪一个?如果我尝试一次性学习所有这些,我就会在脚下射击自己(因为不同的资源包括不同的"变种").
重要我正在寻找一个答案,id只有当窗帘和地毯都是"淡黄色"时才会返回.
可能重复:
我可以将多个MySQL行连接到一个字段中吗?
我有三张桌子:
表格1: teacher
id
firstname
surname
Run Code Online (Sandbox Code Playgroud)
表#2: course
id
name
Run Code Online (Sandbox Code Playgroud)
表3: courses_has_teachers
course_id
teacher_id
Run Code Online (Sandbox Code Playgroud)
我想得到的是教师信息的课程信息.我已经尝试过这个查询:
SELECT * FROM
teacher, course, courses_has_teachers
WHERE
courses_has_teachers.teacher_id = teacher.id
AND
course.id = courses_has_teachers.course.id
Run Code Online (Sandbox Code Playgroud)
我得到了我想要的东西,但是:如果一门课程有一位以上的老师,我想把结果结合起来.我希望得到一个包含课程信息和教师列表的简单行,而不是具有相同课程信息的多行.
不喜欢这样:
Name | Teacher
--------------------
Course 1 | Person 1
Course 1 | Person 2
Run Code Online (Sandbox Code Playgroud)
但是这个:
Name | Teacher
------------------------------
Course 1 | Person 1, Person 2
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
有两个表:管理员,新闻
结构是这样的:
admin
-----
id
name
news
-----
id
createBy
updateBy
Run Code Online (Sandbox Code Playgroud)
目前createBy和updateBy存储了admin id,我想得到createBy和updateBy的管理员名称,如何实现呢?谢谢
这是我在codeigniter中使用的
$this->db->select('*');
$this->db->from('news,admin');
$this->db->where('id', $id);
$this->db->where('admin.id', 'news.updateBy');
Run Code Online (Sandbox Code Playgroud)
无论如何sql查询是受欢迎的,我会将其转换为codeigniter语法.谢谢你的帮助
sql ×7
join ×4
mysql ×3
php ×3
sql-server ×2
ansi-92 ×1
ansi-sql ×1
codeigniter ×1
date ×1
group-concat ×1
left-join ×1
performance ×1
postgresql ×1
right-join ×1
t-sql ×1
union ×1
union-all ×1