Name | Capital | Area | Population | Continent | Currency |
---|---|---|---|---|---|
Denmark | Copenhagen | 43094 | 5484000 | EU | DKK |
Estonia | Tallinn | 45226 | 1291170 | EU | EUR |
Finland | Helsinki | 337030 | 5244000 | EU | EUR |
Norway | Oslo | 324220 | 5009150 | EU | NOK |
Sweden | Stockholm | 449964 | 9555893 | EU | SEK |
… | … | … | … | … | … |
Countries(name,capital,area,population,continent,currency)
CREATE TABLE Countries( name TEXT capital TEXT, area FLOAT, population INT, continent TEXT, currency TEXT );
Countries(name,capital,area,population,continent,currency)
CREATE TABLE Countries( name TEXT PRIMARY KEY, capital TEXT, area FLOAT NOT NULL, population INT NOT NULL, continent CHAR(2) NOT NULL, currency CHAR(3) );
SELECT continent,COUNT(name),SUM(population) FROM Countries GROUP BY continent;
COUNT
and SUM
are
usually used together with GROUP BY
SELECT COUNT(*) FROM Countries;
SELECT COUNT(capital) FROM Countries;
SELECT COUNT(name),SUM(population) FROM Countries;
SELECT COUNT(*) FROM Countries WHERE population>50000000;
SELECT COUNT(*) FROM Countries WHERE currency='EUR';
SELECT currency,COUNT(name) FROM Countries GROUP BY currency;
SELECT currency,COUNT(name)
FROM Countries
GROUP BY currency
HAVING COUNT(name)>1;
WHERE condition
works on individual rows, comes before
GROUP BY
.
HAVING condition
works on aggregated values, comes after
GROUP BY
.
UNION
INTERSECT
EXCEPT
SELECT name AS place FROM Countries UNION SELECT capital AS place FROM Countries;
SELECT name FROM Countries WHERE name=capital;
SELECT name AS place FROM Countries INTERSECT SELECT capital AS place FROM Countries;
SELECT name,'big' AS size FROM Countries WHERE population>=50000000 UNION SELECT name,'small' AS size FROM Countries WHERE population<50000000 ;
code | name | value |
---|---|---|
SEK | Krona | 1.0 |
DKK | Krone | 1.41 |
EUR | Euro | 10.54 |
GBP | Pound | 12.50 |
USD | Dollar | 9.57 |
BTC | Bitcoin | 85634.34 |
CREATE TABLE Countries( name TEXT PRIMARY KEY, capital TEXT, ..., -- as before currency CHAR(3) ); CREATE TABLE Currencies( code CHAR(3) PRIMARY KEY, name TEXT, value FLOAT );
SELECT Countries.name,code,value FROM Countries,Currencies WHERE currency=code;
SELECT Countries.name,code,value FROM Countries JOIN Currencies ON currency=code;
SELECT Countries.name,code,value FROM Countries INNER JOIN Currencies ON currency=code;
SELECT Countries.name,code,value FROM Countries RIGHT OUTER JOIN Currencies ON currency=code;
SELECT Countries.name,currency,value FROM Countries LEFT OUTER JOIN Currencies ON currency=code;
SELECT Countries.name,currency,value FROM Countries FULL OUTER JOIN Currencies ON currency=code;
SELECT * FROM Countries NATURAL JOIN Currencies
SELECT * FROM Countries JOIN Currencies USING (name)
SELECT * FROM Countries JOIN Currencies ON Countries.name=Currencies.name
|
|
Capitals NATURAL JOIN Currencies
country | capital | currency |
---|---|---|
Norway | Oslo | NOK |
Sweden | Stockholm | SEK |
Capitals NATURAL LEFT OUTER JOIN Currencies
country | capital | currency |
---|---|---|
Norway | Oslo | NOK |
Sweden | Stockholm | SEK |
France | Paris |
Capitals NATURAL RIGHT OUTER JOIN Currencies
country | capital | currency |
---|---|---|
Norway | Oslo | NOK |
Sweden | Stockholm | SEK |
Germany | EUR |
Capitals NATURAL FULL OUTER JOIN Currencies
country | capital | currency |
---|---|---|
Norway | Oslo | NOK |
Sweden | Stockholm | SEK |
France | Paris | |
Germany | EUR |
CREATE TABLE Countries(
name TEXT PRIMARY KEY,
capital TEXT,
area FLOAT NOT NULL,
...,
currency CHAR(3) REFERENCES Currencies(code)
);
CREATE TABLE Countries(
name TEXT,
capital TEXT,
area FLOAT
...,
currency CHAR(3),
PRIMARY KEY (name),
NOT NULL (area),
FOREIGN KEY (currency) REFERENCES Currencies(code)
);
Cities(name,country,...)
Countries(name,capital,...)
(capital,name) -> Cities(name,country)
CREATE TABLE Cities( name TEXT, country TEXT, ..., PRIMARY KEY (name,country) ); CREATE TABLE Countries( name TEXT PRIMARY KEY capital TEXT, ..., FOREIGN KEY (capital,name) REFERENCES Cities(name,country) );
CREATE VIEW ExchangeRates AS (SELECT name,code,value FROM Countries JOIN Currencies ON currency=code);
SELECT T1.a,T2.a -- table prefix on attribute names FROM T1,T2,T3 -- many tables = cross products WHERE condition GROUP BY value HAVING value -- conditions on aggregated values ORDER BY value
query UNION/INTERSECT/EXCEPT query
CREATE TABLE T( attr type REFERENCES Table(attr) PRIMARY KEY (a,b) FOREIGN KEY (a,b) REFERENCES Table(c,d) )
CREATE VIEW View_name AS ( query )
FROM T1,T2 WHERE condition
FROM T1 JOIN T2 ON condition
FROM T1 INNER JOIN T2 ON condition
SELECT currency,COUNT(name)
FROM Countries
GROUP BY currency
HAVING count(name)>1;
HAVING
but we could live without it:
WITH CurrencyCounts AS
(SELECT currency,COUNT(name) AS count
FROM Countries
GROUP BY currency)
SELECT *
FROM CurrencyCounts
WHERE count>1;
Countries
are missing in Currencies
?
SELECT DISTINCT currency AS code FROM Countries WHERE currency NOT IN (SELECT code FROM Currencies);
WHERE
part.
INSERT INTO Currencies (SELECT DISTINCT currency AS code FROM Countries WHERE currency NOT IN (SELECT code FROM Currencies) );
INSERT INTO
where the values are taken
from a query result.
code
column. The other
columns (name
,value
)
will have missing values (NULL
).
ALTER TABLE Countries ADD FOREIGN KEY (currency) REFERENCES Currencies(code);