269 lines
No EOL
6.3 KiB
Markdown
269 lines
No EOL
6.3 KiB
Markdown
SQL
|
|
|
|
https://learnsql.com/blog/sql-basics-cheat-sheet/
|
|
|
|
## Joins
|
|
|
|
**Example**
|
|
we have 2 tables named 'first' and 'join'
|
|
first table
|
|
|id|name|
|
|
|--|----|
|
|
|1|name1|
|
|
|2|name2|
|
|
|3|name3|
|
|
|
|
Books table
|
|
|id|user_id|book_name|
|
|
|--|-------|---------|
|
|
|1|1|book1|
|
|
|2|1|book2|
|
|
|3|1|book3|
|
|
|4|2|book4|
|
|
|5|4|book5|
|
|
|
|
**Cross product** (first X books)
|
|
Query
|
|
```sql
|
|
select * from first,Books;
|
|
```
|
|
|
|
Output
|
|
|id|name|id|user_id|book_name|
|
|
|--|----|--|-------|---------|
|
|
|1|name1|1|1|book1|
|
|
|2|name2|1|1|book1|
|
|
|3|name3|1|1|book1|
|
|
|1|name1|2|1|book2|
|
|
|2|name2|2|1|book2|
|
|
|3|name3|2|1|book2|
|
|
|1|name1|3|1|book3|
|
|
|2|name2|3|1|book3|
|
|
|3|name3|3|1|book3|
|
|
|1|name1|4|2|book4|
|
|
|2|name2|4|2|book4|
|
|
|3|name3|4|2|book4|
|
|
|1|name1|5|4|book5|
|
|
|2|name2|5|4|book5|
|
|
|3|name3|5|4|book5|
|
|
|
|
|
|
|
|
**Union** ( full outer join ) (first U Books)
|
|
Query
|
|
```sql
|
|
-- for mysql
|
|
SELECT *
|
|
FROM first
|
|
LEFT JOIN Books ON first.id = Books.user_id
|
|
UNION
|
|
SELECT *
|
|
FROM first
|
|
RIGHT JOIN Books ON first.id = Books.user_id;
|
|
|
|
-- for others
|
|
select * from first FULL JOIN Books
|
|
ON first.id = Books.user_id ;
|
|
```
|
|
Output
|
|
|id|name|id|user_id|book_name|
|
|
|--|----|--|-------|---------|
|
|
|1|name1|1|1|book1|
|
|
|1|name1|2|1|book2|
|
|
|1|name1|3|1|book3|
|
|
|2|name2|4|2|book4|
|
|
|3|name3||||
|
|
|||5|4|book5|
|
|
|
|
|
|
|
|
**Intersection** (inner join) (first ∩ Books)
|
|
Query
|
|
```sql
|
|
select * from first,Books
|
|
where first.id = Books.user_id;
|
|
|
|
-- or
|
|
|
|
select * from first JOIN Books
|
|
ON first.id = Books.user_id ;
|
|
```
|
|
Output
|
|
|id|name|id|user_id|book_name|
|
|
|--|----|--|-------|---------|
|
|
|1|name1|1|1|book1|
|
|
|1|name1|2|1|book2|
|
|
|1|name1|3|1|book3|
|
|
|2|name2|4|2|book4|
|
|
|
|
|
|
|
|
|
|
**LEFT JOIN** (first U first ∩ Books )
|
|
Means all of left table and intersection of 2 tables is also included
|
|
Query
|
|
```sql
|
|
SELECT *
|
|
FROM first
|
|
LEFT JOIN Books ON first.id = Books.user_id
|
|
|
|
-- or
|
|
|
|
-- Select all rows from table1 and matching rows from table2
|
|
SELECT first.*, Books.*
|
|
FROM first, Books
|
|
WHERE first.id = Books.user_id
|
|
UNION ALL
|
|
-- Select all rows from table1 that have no matching row in table2
|
|
SELECT first.*, NULL AS id, NULL AS user_id , null as book_name
|
|
FROM first
|
|
WHERE first.id NOT IN (SELECT user_id FROM Books);
|
|
```
|
|
Output
|
|
|id|name|id|user_id|book_name|
|
|
|--|----|--|-------|---------|
|
|
|1|name1|1|1|book1|
|
|
|1|name1|2|1|book2|
|
|
|1|name1|3|1|book3|
|
|
|2|name2|4|2|book4|
|
|
|3|name3||||
|
|
|
|
|
|
|
|
**RIGHT JOIN** (first ∩ Books U Books)
|
|
Means all of right table and intersection of 2 tables is also included
|
|
Query
|
|
```sql
|
|
SELECT *
|
|
FROM first
|
|
RIGHT JOIN Books ON first.id = Books.user_id;
|
|
```
|
|
Output
|
|
|id|name|id|user_id|book_name|
|
|
|--|----|--|-------|---------|
|
|
|1|name1|1|1|book1|
|
|
|1|name1|2|1|book2|
|
|
|1|name1|3|1|book3|
|
|
|2|name2|4|2|book4|
|
|
|||5|4|book5|
|
|
|
|
|
|
|
|
Triple JOIN
|
|
Query
|
|
```sql
|
|
SELECT h.Address, p.Name, p.Address as OwnerAddress, i.url FROM house AS h
|
|
INNER JOIN person AS p ON p.personID = h.personID
|
|
INNER JOIN images AS i ON i.personID = p.personID
|
|
GROUP BY h.houseID
|
|
|
|
```
|
|
|
|
|
|
|
|
**Some snippets**
|
|
- query to select those records in which user has login and there session is recorded. Not all users who loginned have their session recorded.
|
|
Table named `users` have columns `id` as int, `email`
|
|
Table named `login` have columns like `id` and `email`
|
|
Table named `sessions` have columns like `id` and `userid` as text
|
|
Connection between users and login is email and connection between users and sessions is userid. So we need to join these 3 tables as in order to connect `login` and `sessions` we need to connect it with mutual relationship `users`
|
|
```sql
|
|
select login.*, sessions.userid from users join login on users.email = login.email
|
|
join sessions on CAST(users.id as text) = sessions.userid
|
|
group by login.id, sessions.userid
|
|
```
|
|
As sessions.userid is text so we type cased users.id to text when comparing.
|
|
|
|
## Keys
|
|
|
|
- Adding foriegn key
|
|
https://www.w3schools.com/sql/sql_foreignkey.asp
|
|
```sql
|
|
CREATE TABLE Orders (
|
|
OrderID int NOT NULL,
|
|
OrderNumber int NOT NULL,
|
|
PersonID int,
|
|
PRIMARY KEY (OrderID),
|
|
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
|
|
);
|
|
```
|
|
here Persons in the other table where Orders.PersonID is referencing to Persons.PersonID
|
|
Make sure that foreign key dont contain value which is not available in reference table.
|
|
- preventing delete related records for foreign keys
|
|
Cascade Delete: This will automatically delete records in table B when the corresponding record in table A is deleted. `ON DELETE CASCADE`
|
|
```sql
|
|
CREATE TABLE A (
|
|
id INT PRIMARY KEY,
|
|
-- other fields
|
|
);
|
|
|
|
CREATE TABLE B (
|
|
id INT PRIMARY KEY,
|
|
a_id INT,
|
|
-- other fields,
|
|
FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE CASCADE
|
|
);
|
|
|
|
```
|
|
Set Null: This sets the foreign key in table B to NULL when the referenced record in table A is deleted.
|
|
`ON DELETE SET NULL`
|
|
Restrict: This will prevent the deletion of a record in table A if there are any related records in table B.
|
|
`ON DELETE RESTRICT`. This is default
|
|
|
|
- cloning table data or structure
|
|
- cloning structure only
|
|
`CREATE TABLE employees_clone LIKE employees;`
|
|
- cloning structure and data
|
|
`CREATE TABLE employees_clone AS SELECT * FROM employees;`
|
|
|
|
|
|
Update command
|
|
```sql
|
|
UPDATE Customers
|
|
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
|
|
WHERE CustomerID = 1;
|
|
```
|
|
|
|
|
|
|
|
insert elements if not exists
|
|
```sql
|
|
INSERT INTO table_name (column1, column2, column3)
|
|
SELECT 'value1', 'value2', 'value3'
|
|
WHERE NOT EXISTS (
|
|
SELECT 1
|
|
FROM table_name
|
|
WHERE column1 = 'value1' AND column2 = 'value2'
|
|
);
|
|
```
|
|
|
|
|
|
update joins
|
|
https://stackoverflow.com/questions/982919/sql-update-query-using-joins
|
|
```sql
|
|
-- Source - https://stackoverflow.com/a/982947
|
|
-- Posted by gbn, modified by community. See post 'Timeline' for change history
|
|
-- Retrieved 2026-06-18, License - CC BY-SA 3.0
|
|
|
|
UPDATE im
|
|
SET mf_item_number = gm.SKU --etc
|
|
FROM item_master im
|
|
JOIN group_master gm
|
|
ON im.sku = gm.sku
|
|
JOIN Manufacturer_Master mm
|
|
ON gm.ManufacturerID = mm.ManufacturerID
|
|
WHERE im.mf_item_number like 'STA%' AND
|
|
gm.manufacturerID = 34
|
|
|
|
```
|
|
if this dont work then using legacy way
|
|
```js
|
|
const updateQuery = `update ${songDataTableEnums.tablename} as sd
|
|
set ${songDataTableEnums.columns.is_bookmarked}=${bookmark_value}
|
|
where exists (
|
|
select 1
|
|
from ${keywordTableEnums.tablename} as k
|
|
where sd.${songDataTableEnums.columns.id} = k.${keywordTableEnums.columns.song_id}
|
|
and k.${keywordTableEnums.columns.keywords}=?
|
|
)`
|
|
``` |