/
sql.yml
238 lines (180 loc) · 6.77 KB
/
sql.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
---
sql: |-
Select
SELECT first_name, last_name, state, active
FROM users
+------------+-----------+-------+--------+
| first_name | last_name | state | active |
+------------+-----------+-------+--------+
| Homer | Simpson | WI | 1 |
| Marge | Simpson | MI | 1 |
| Barney | Gumble | IL | 0 |
| Bart | Simpson | WI | 1 |
+------------+-----------+-------+--------+
Filtering with WHERE
SELECT first_name, last_name, state, active
FROM users
WHERE active = 1;
+------------+-----------+-------+--------+
| first_name | last_name | state | active |
+------------+-----------+-------+--------+
| Homer | Simpson | WI | 1 |
| Marge | Simpson | MI | 1 |
| Bart | Simpson | WI | 1 |
+------------+-----------+-------+--------+
Ordering records
SELECT first_name, last_name, state
FROM users
ORDER BY state asc
+------------+-----------+-------+
| first_name | last_name | state |
+------------+-----------+-------+
| Barney | Gumble | IL |
| Marge | Simpson | MI |
| Homer | Simpson | WI |
| Bart | Simpson | WI |
+------------+-----------+-------+
Counts
select count(*) as NumberOfRecords from users;
+-----------------+
| NumberOfRecords |
+-----------------+
| 4 |
+-----------------+
Grouping
SELECT count(*) as people, state
FROM users
GROUP BY state;
+--------+-------+
| people | state |
+--------+-------+
| 1 | IL |
| 1 | MI |
| 2 | WI |
+--------+-------+
Insert
INSERT INTO users
(first_name, last_name, active, state)
VALUES ('Lisa', 'Simpson', 1, 'WI');
Note that names and values have to match up.
Update
UPDATE users SET state = "WI" WHERE users.id = 1;
Delete
DELETE from users
WHERE state = 'WI';
Delete everyone.
DELETE from users;
-or- (faster)
TRUNCATE users;
Joins
chapters
+----+------------------+---------+
| id | title | book_id |
+----+------------------+---------+
| 1 | Ninjas Are Cool | 1 |
| 2 | Pirates Are Cool | 2 |
| 3 | Silence Is Key | 1 |
+----+------------------+---------+
Books
+----+-----------------+
| id | title |
+----+-----------------+
| 1 | The Ninja Book |
| 2 | The Pirate Book |
| 3 | The Web Book |
+----+-----------------+
Explicit Joins
---------------
Get all books and chapters
SELECT books.title AS book, chapters.title AS chapter
FROM books
LEFT JOIN chapters
ON books.id = chapters.book_id;
+-----------------+------------------+
| book | chapter |
+-----------------+------------------+
| The Ninja Book | Ninjas Are Cool |
| The Ninja Book | Silence Is Key |
| The Pirate Book | Pirates Are Cool |
| The Web Book | NULL |
+-----------------+------------------+
** The LEFT JOIN keyword returns all the rows from the left table (books), even if there are no matches in the right table (chapters)
This is also called OUTER JOIN
Get all books with no chapters
SELECT books.title AS book, chapters.book_id
FROM books
LEFT OUTER JOIN chapters
ON books.id = chapters.book_id
WHERE chapters.book_id IS NULL;
+--------------+---------+
| book | book_id |
+--------------+---------+
| The Web Book | NULL |
+--------------+---------+
Get only books with chapters.
SELECT books.title AS book, chapters.book_id
FROM books
INNER JOIN chapters
ON books.id = chapters.book_id;
+-----------------+---------+
| book | book_id |
+-----------------+---------+
| The Ninja Book | 1 |
| The Pirate Book | 2 |
| The Ninja Book | 1 |
+-----------------+---------+
* Inner joins are joins in which only rows with explicit matches
are returned. If a record in the left table (books) has no
associations in the right table(chapters), it is not returned.
Removing duplicates
Joins have duplication though. Filter that down with the DISTINCT
keyword.
SELECT distinct books.title AS book, chapters.book_id
FROM books
INNER JOIN chapters
ON books.id = chapters.book_id;
+-----------------+---------+
| book | book_id |
+-----------------+---------+
| The Ninja Book | 1 |
| The Pirate Book | 2 |
+-----------------+---------+
* IN order for distinct to work, the WHOLE ROW must be a duplicate.
Implicit joins:
Many people do an inner join implicitly in the WHERE condition:
SELECT distinct books.title AS book, chapters.book_id
FROM books, chapters
WHERE books.id = chapters.book_id;
+-----------------+---------+
| book | book_id |
+-----------------+---------+
| The Ninja Book | 1 |
| The Pirate Book | 2 |
+-----------------+---------+
This works, but is NOT recommended on many databases, especially for
large datasets. The WHERE conditions are USUALLY run on the entire set
of returned rows. n*rows.
Join Conditions
Conditions can be applied in joins as well instead of on the WHERE clause. This can reduce query times.
Assume our books table had a 'published' column.
And you wanted the number of chapters from books that were
published.
+----+-----------------+-----------+
| id | title | published |
+----+-----------------+-----------+
| 1 | The Ninja Book | 1 |
| 2 | The Pirate Book | 0 |
| 3 | The Web Book | 0 |
+----+-----------------+-----------+
SELECT books.title, count(chapters.book_id) as number_of_chapters
FROM books
INNER JOIN chapters
ON books.id = chapters.book_id
AND books.published = 1
GROUP BY books.title;
+----------------+--------------------+
| title | number_of_chapters |
+----------------+--------------------+
| The Ninja Book | 2 |
+----------------+--------------------
DON'T FEAR THE SQL! IT IS POWERFUL!