Difference between revisions of "Subquery and JOIN"
(Undo revision 13510 by 27.251.109.28 (talk)) |
|||
(12 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
Here you are shown how to convert subqueries into JOIN functions this would be done | |||
as using subqueries that contain no aggregate functions unnecessarily | |||
causes the response speed of the query to slow down. | |||
<div class='ht'> | <div class='ht'> | ||
<div class=params>schema:scott</div> | <div class=params>schema:scott</div> | ||
Line 6: | Line 8: | ||
DROP TABLE salary;</source> | DROP TABLE salary;</source> | ||
<source lang=sql class='setup'> CREATE TABLE jobs( | <source lang=sql class='setup'> CREATE TABLE jobs( | ||
employee VARCHAR(40 | employee VARCHAR(40), | ||
title VARCHAR(40)); | title VARCHAR(40)); | ||
INSERT INTO jobs VALUES ('Gordon Russell','Lecturer'); | INSERT INTO jobs VALUES ('Gordon Russell','Lecturer'); | ||
Line 27: | Line 29: | ||
<div> | <div> | ||
SELECT payment FROM salary WHERE rank = | SELECT payment FROM salary WHERE rank = | ||
(SELECT rank FROM ranks WHERE title = | |||
(SELECT title FROM jobs | |||
WHERE employee = 'Andrew Cumming')) | |||
This subquery would be more efficient if it was changed to a JOIN as there are no | This subquery would be more efficient if it was changed to a <code>JOIN</code> as there are no | ||
aggregate functions in the queries. | aggregate functions in the queries. | ||
<ul>Use the following steps to change a subquery into a JOIN | <ul>Use the following steps to change a subquery into a <code>JOIN</code> | ||
<li>Mark all columns with the table name they came from</li> | <li>Mark all columns with the table name they came from</li> | ||
<li>If you use the same table in two different FROM clauses, use aliases</li> | <li>If you use the same table in two different <code>FROM</code> clauses, use aliases</li> | ||
<li>Move all FROM statements together to form a single FROM </li> | <li>Move all <code>FROM</code> statements together to form a single <code>FROM</code> </li> | ||
<li>Delete all occurrences of (SELECT </li> | <li>Delete all occurrences of (<code>SELECT</code> </li> | ||
<li>Substitute WHERE for AND after the first occurence of WHERE</li> | <li>Substitute <code>WHERE</code> for AND after the first occurence of <code>WHERE</code></li> | ||
</ul> | </ul> | ||
</div> | </div> | ||
<source lang='sql' class='def'> | <source lang='sql' class='def'> | ||
SELECT payment | SELECT payment | ||
FROM salary JOIN ranks ON (salary.rank = ranks.rank) | FROM salary, ranks, jobs | ||
JOIN jobs ON (ranks.title = jobs.title) | WHERE salary.rank = ranks.rank | ||
WHERE jobs.employee = 'Andrew Cumming'</div> | AND ranks.title = jobs.title | ||
AND jobs.employee = 'Andrew Cumming'</source> | |||
<div class="ecomm e-mysql" style="display: none"><code>JOIN ON</code> functions would also work with: | |||
<pre>SELECT payment | |||
FROM salary JOIN ranks | |||
ON (salary.rank = ranks.rank) | |||
JOIN jobs ON (ranks.title = jobs.title) | |||
WHERE jobs.employee = 'Andrew Cumming'</pre></div> | |||
</div> | </div> | ||
{{Hacks Ref}} | {{Hacks Ref}} |
Latest revision as of 09:25, 22 March 2014
Here you are shown how to convert subqueries into JOIN functions this would be done as using subqueries that contain no aggregate functions unnecessarily causes the response speed of the query to slow down.
DROP TABLE jobs;
DROP TABLE ranks;
DROP TABLE salary;
CREATE TABLE jobs(
employee VARCHAR(40),
title VARCHAR(40));
INSERT INTO jobs VALUES ('Gordon Russell','Lecturer');
INSERT INTO jobs VALUES ('Andrew Cumming','Teaching fellow');
INSERT INTO jobs VALUES ('Jim Smith','Technician');
CREATE TABLE ranks (
title VARCHAR(40),
rank VARCHAR(40));
INSERT INTO ranks VALUES ('Lecturer','LECT1');
INSERT INTO ranks VALUES ('Teaching fellow','LECT2');
INSERT INTO ranks VALUES ('Technician','TECH1');
CREATE TABLE salary (
rank VARCHAR(40),
payment INTEGER);
INSERT INTO salary VALUES ('LECT1',2000);
INSERT INTO salary VALUES ('LECT2',3000);
INSERT INTO salary VALUES ('TECH1',5000);
INSERT INTO salary VALUES ('TECH2',6000);
SELECT payment FROM salary WHERE rank = (SELECT rank FROM ranks WHERE title = (SELECT title FROM jobs WHERE employee = 'Andrew Cumming'))
This subquery would be more efficient if it was changed to a JOIN
as there are no
aggregate functions in the queries.
- Use the following steps to change a subquery into a
- Mark all columns with the table name they came from
- If you use the same table in two different
FROM
clauses, use aliases - Move all
FROM
statements together to form a singleFROM
- Delete all occurrences of (
SELECT
- Substitute
WHERE
for AND after the first occurence ofWHERE
JOIN
SELECT payment
FROM salary, ranks, jobs
WHERE salary.rank = ranks.rank
AND ranks.title = jobs.title
AND jobs.employee = 'Andrew Cumming'
Hack 10 Converting subqueries into joins
Hack 11 Converting aggregate subqueries into joins
Hack 16 Search for a String across columns
Hack 24 Multiply Across a Result Set
Hack 25.5 Splitting and combining columns
Hack 26 Include the rows your JOIN forgot
Hack 30 Calculate the maximum/minimum of two fields
Hack 33 Get values and subtotals in one shot
Hack 50 Combine tables containing different data
Hack 51/52 Display rows as columns
Hack 55 Import Someone Else's Data
Hack 62 Issue Queries Without Using a Table
Hack 63 Generate rows without tables
Hack 72 Extract a subset of the results
Hack 78 Break it down by Range
Hack 88 Test two values from a subquery