CMU 15-445/645 Database Systems (Fall 2017) :: Advanced SQL · Keywords: Databases, Carnegie Mellon...
Transcript of CMU 15-445/645 Database Systems (Fall 2017) :: Advanced SQL · Keywords: Databases, Carnegie Mellon...
→→
→
→→
→
student(sid,name,login,gpa) enrolled(sid,cid,grade)
course(cid,name)
sid name login age gpa53666 Kanye kayne@cs 39 4.053688 Bieber jbieber@cs 22 3.953655 Tupac shakur@cs 26 3.5
sid cid grade53666 15-445 C53688 15-721 A53688 15-826 B53655 15-445 B53666 15-721 C
cid name15-445 Database Systems15-721 Advanced Database Systems15-826 Data Mining15-823 Advanced Topics in Databases
→ AVG(col)→ MIN(col)→ MAX(col)→ SUM(col)→ COUNT(col)
SELECT
SELECT COUNT(login) AS cntFROM student WHERE login LIKE '%@cs'
SELECT
SELECT COUNT(login) AS cntFROM student WHERE login LIKE '%@cs'SELECT COUNT(*) AS cnt
FROM student WHERE login LIKE '%@cs'
SELECT
SELECT COUNT(login) AS cntFROM student WHERE login LIKE '%@cs'SELECT COUNT(*) AS cnt
FROM student WHERE login LIKE '%@cs'SELECT COUNT(1) AS cnt
FROM student WHERE login LIKE '%@cs'
SELECT AVG(gpa), COUNT(sid)FROM student WHERE login LIKE '%@cs'
AVG(gpa) COUNT(sid)
3.25 12
COUNT SUM AVG DISTINCT
SELECT COUNT(DISTINCT login)FROM student WHERE login LIKE '%@cs'
COUNT(DISTINCT login)
10
SELECT AVG(s.gpa), e.cidFROM enrolled AS e, student AS sWHERE e.sid = s.sid
AVG(s.gpa) e.cid
3.5 ???
SELECT AVG(s.gpa), e.cidFROM enrolled AS e, student AS sWHERE e.sid = s.sidGROUP BY e.cid
e.sid s.sid s.gpa e.cid
53435 53435 2.25 15-721
53439 53439 2.70 15-721
56023 56023 2.75 15-826
59439 59439 3.90 15-826
53961 53961 3.50 15-826
58345 58345 1.89 15-445
AVG(s.gpa) e.cid
2.46 15-721
3.39 15-826
1.89 15-445
SELECT AVG(s.gpa), e.cidFROM enrolled AS e, student AS sWHERE e.sid = s.sidGROUP BY e.cid
e.sid s.sid s.gpa e.cid
53435 53435 2.25 15-721
53439 53439 2.70 15-721
56023 56023 2.75 15-826
59439 59439 3.90 15-826
53961 53961 3.50 15-826
58345 58345 1.89 15-445
SELECT
GROUP BY
SELECT AVG(s.gpa), e.cid, s.nameFROM enrolled AS e, student AS sWHERE e.sid = s.sidGROUP BY e.cid X
SELECT
GROUP BY
SELECT AVG(s.gpa), e.cid, s.nameFROM enrolled AS e, student AS sWHERE e.sid = s.sidGROUP BY e.cid X
SELECT AVG(s.gpa), e.cid, s.nameFROM enrolled AS e, student AS sWHERE e.sid = s.sidGROUP BY e.cid, s.name
WHERE GROUP BY
SELECT AVG(s.gpa) AS avg_gpa, e.cidFROM enrolled AS e, student AS sWHERE e.sid = s.sidAND avg_gpa > 3.9
GROUP BY e.cidX
WHERE GROUP BY
SELECT AVG(s.gpa) AS avg_gpa, e.cidFROM enrolled AS e, student AS sWHERE e.sid = s.sidAND avg_gpa > 3.9
GROUP BY e.cid
AVG(s.gpa) e.cid
3.75 15-4153.950000 15-7213.900000 15-826
avg_gpa e.cid
3.950000 15-721
XSELECT AVG(s.gpa) AS avg_gpa, e.cid
FROM enrolled AS e, student AS sWHERE e.sid = s.sidGROUP BY e.cidHAVING avg_gpa > 3.9;
WHERE UPPER(name) = UPPER('KaNyE')
WHERE name = "KaNyE"
LIKE
→ "%"
→ "_"
SELECT * FROM enrolled AS eWHERE e.cid LIKE '15-%'
SELECT * FROM student AS sWHERE s.login LIKE '%@c_'
→
SELECT SUBSTRING(name,0,5) AS abbrv_nameFROM student WHERE sid = 53688
SELECT * FROM student AS sWHERE UPPER(e.name) LIKE 'KAN%'
||
SELECT name FROM studentWHERE login = LOWER(name) + '@cs'
SELECT name FROM studentWHERE login = LOWER(name) || '@cs'
SELECT name FROM studentWHERE login = CONCAT(LOWER(name), '@cs')
→→
CREATE TABLE CourseIds (SELECT DISTINCT cid FROM enrolled);
SELECT DISTINCT cid INTO CourseIdsFROM enrolled;
→ SELECT
→
INSERT INTO CourseIds(SELECT DISTINCT cid FROM enrolled);
ORDER BY <column*> [ASC|DESC]→
SELECT sid, grade FROM enrolledWHERE cid = '15-721'ORDER BY grade
SELECT sid FROM enrolledWHERE cid = '15-721'ORDER BY grade DESC, sid ASC
sid grade
53123 A53334 A53650 B53666 D
sid
53666536505312353334
LIMIT <count> [offset]→
→
SELECT sid, name FROM studentWHERE login LIKE '%@cs'LIMIT 10
SELECT sid, name FROM studentWHERE login LIKE '%@cs'LIMIT 20 OFFSET 10
SELECT name FROM student WHEREsid IN (SELECT sid FROM enrolled)
SELECT name FROM studentWHERE ...
SELECT name FROM studentWHERE ...SELECT sid FROM enrolledWHERE cid = '15-445'
SELECT name FROM studentWHERE ...
SELECT name FROM studentWHERE ...SELECT sid FROM enrolledWHERE cid = '15-445'
SELECT name FROM studentWHERE sid IN (SELECT sid FROM enrolledWHERE cid = '15-445'
)
SELECT name FROM studentWHERE sid = ANY(SELECT sid FROM enrolledWHERE cid = '15-445'
)
SELECT name FROM studentWHERE sid = ANY(SELECT sid FROM enrolledWHERE cid = '15-445'
)
SELECT (SELECT S.name FROM student AS SWHERE S.sid = E.sid) AS sname
FROM enrolled AS EWHERE cid = '15-445'
SELECT MAX(e.sid), s.nameFROM enrolled AS e, student AS sWHERE e.sid = s.sid; X
SELECT sid, name FROM studentWHERE ...
SELECT sid, name FROM studentWHERE sidSELECT sid FROM enrolled
SELECT sid, name FROM studentWHERE ...
SELECT sid, name FROM studentWHERE sidSELECT sid FROM enrolled
SELECT sid, name FROM studentWHERE sid => ALL(SELECT sid FROM enrolled
)
sid name
53688 Bieber
SELECT sid, name FROM studentWHERE ...
SELECT sid, name FROM studentWHERE sidSELECT sid FROM enrolled
SELECT sid, name FROM studentWHERE sid => ALL(SELECT sid FROM enrolled
)
SELECT sid, name FROM studentWHERE sid IN (SELECT MAX(sid) FROM enrolled
)
SELECT sid, name FROM studentWHERE ...
SELECT sid, name FROM studentWHERE sidSELECT sid FROM enrolled
SELECT sid, name FROM studentWHERE sid => ALL(SELECT sid FROM enrolled
)
SELECT sid, name FROM studentWHERE sid IN (SELECT MAX(sid) FROM enrolled
)
SELECT sid, name FROM studentWHERE sid IN (SELECT sid FROM enrolledORDER BY sid DESC LIMIT 1
)
SELECT * FROM courseWHERE ...
sid cid grade
53666 15-445 C
53688 15-721 A
53688 15-826 B
53655 15-445 B
53666 15-721 C
cid name
15-445 Database Systems15-721 Advanced Database Systems15-826 Data Mining15-823 Advanced Topics in Databases
SELECT * FROM courseWHERE ...
SELECT * FROM courseWHERE NOT EXISTS(
)
SELECT * FROM courseWHERE ...
SELECT * FROM courseWHERE NOT EXISTS(
)
SELECT * FROM courseWHERE NOT EXISTS(SELECT * FROM enrolledWHERE course.cid = enrolled.cid
)
cid name
15-823 Advanced Topics in Databases
SELECT ... FUNC-NAME(...) OVER (...)FROM tableName
→
→ ROW_NUMBER()
→ RANK()
SELECT *, ROW_NUMBER() OVER () AS row_numFROM enrolled
sid cid grade row_num53666 15-445 C 153688 15-721 A 253688 15-826 B 353655 15-445 B 453666 15-721 C 5
OVER
PARTITION BY
SELECT cid, sid,ROW_NUMBER() OVER (PARTITION BY cid)
FROM enrolledORDER BY cid
cid sid row_number15-445 53666 115-445 53655 215-721 53688 115-721 53666 215-826 53688 1
ORDER BY
SELECT *,ROW_NUMBER() OVER (ORDER BY cid)
FROM enrolledORDER BY cid
SELECT * FROM (SELECT *,
RANK() OVER (PARTITION BY cidORDER BY grade ASC)
AS rankFROM enrolled) AS ranking
WHERE ranking.rank = 1
→
WITH cteName AS (SELECT 1
) SELECT * FROM cteName
AS
WITH cteName (col1, col2) AS (SELECT 1, 2
) SELECT col1 + col2 FROM cteName
WITH cteSource (maxId) AS (SELECT MAX(sid) FROM enrolled
) SELECT name FROM student, cteSourceWHERE student.sid = cteSource.maxId
WITH RECURSIVE cteSource (counter) AS ((SELECT 1)UNION ALL(SELECT counter + 1 FROM cteSource
WHERE counter < 10)) SELECT * FROM cteSource