Sql queries: Difference between revisions

From wikinotes
No edit summary
Line 29: Line 29:
<blockquote>
<blockquote>
== Nested Queries ==
== Nested Queries ==
<source lang="mySQL">
You can nest SQL queries and treat them as tables.<br>
SELECT user_Id
The example below finds <code>user.id</code> values that are not present in the 1:many <code>user_departments</code> table.
FROM (
<syntaxhighlight lang="MySQL">
  SELECT DISTINCT     d.user_Id                                          ,
SELECT *
                      CONCAT(u.firstName, " ", u.lastName)  user_fullName
FROM users
  FROM               userDepartmentTable            d
LEFT JOIN (
  INNER JOIN         userTable AS u ON d.user_Id  = u.user_Id
  SELECT DISTINCT users.id AS user_id
  WHERE              d.department_Id              =  2
  FROM   user_departments
) u
  INNER JOIN users ON users.id = user_departments.user_id
WHERE u.user_fullName REGEXP 'andr%';
) AS users_with_departments
</source>
WHERE users_with_departments.user_id IS NULL;
</syntaxhighlight>


== Dynamically Defined Tables ==
== Dynamically Defined Tables ==

Revision as of 18:56, 19 September 2021

Example

SELECT *
FROM  users
WHERE username = "dvader"
AND   age > 40;

Query Components

SELECT which columns you'd like to see, and how you'd like them to be presented (order, max results, etc).

SELECT *                               # select all columns
SELECT name, age FROM users;           # select name, and age only
SELECT name AS userame FROM users;     # rename column in results table
SELECT DISTINCT name FROM users;       # select 1x row for each unique name in users
SELECT * FROM users LIMIT 10;          # only select first 10 results
SELECT * FROM users ORDER BY name ASC  # sort results in ascending order by name

Techniques

Nested Queries

You can nest SQL queries and treat them as tables.
The example below finds user.id values that are not present in the 1:many user_departments table.

SELECT *
FROM users
LEFT JOIN (
  SELECT DISTINCT users.id AS user_id
  FROM   user_departments
  INNER JOIN users ON users.id = user_departments.user_id
) AS users_with_departments
WHERE users_with_departments.user_id IS NULL;

Dynamically Defined Tables

Some databases do not implement the SQL IN operator.
Instead, you can use VALUES.

SELECT *
FROM (
  VALUES (1), (2)
) foo(id);

Most useful within a join

SELECT *
FROM (
  VALUES (1), (2)
) foo(id)

INNER JOIN (
  (VALUES (1)) bar(id)
) ON foo.id = bar.id