DAY1
什么是SQL?
SQL,全称Structure Query Language(结构化查询语言)
什么是数据库?
平时说到的数据库,一般是指关系型数据库Relational Database,数据库是用来存储大量数据的软件
SQL和数据库有何联系?
SQL是用来操作数据库中的数据的。如果把数据库比作盘子,数据就是盘子里的菜,而SQL就是筷子
什么是关系型数据库呢?
数据库由若干张表(Table)组成,表(Table)由行(rows)和列(Columns)组成。
一个表Table存储一个类别的数据,一行row代表一条数据,一列Column代表一个属性
SELECT简单查询
用法:
SELECT column1(列名),column2 ...
FROM table(表名)
如果想要查询所有列的数据,用(*)表示
SELECT * FROM table(表名)
例子:
找到所有电影的名称?
SELECT title
FROM movies
找到所有电影的名称,Id和播放时长
SELECT title,Id,Length_minutes
FROM movies
简单条件查询
用法:
SELECT column1(列名),column2 ...
FROM table(表名)
WHERE condition
AND/OR another_condition
例子:
找到id为6的电影
SELECT *
FROM movies
where Id=6
找到在2000-2010年间year上映的电影
SELECT *
FROM movies
WHERE year
BETWEEN 2000 AND 2010;
找到不是在2000-2010年间year上映的电影
SELECT *
FROM movies
WHERE year
NOT BETWEEN 2000 AND 2010;
找到头5部电影
SELECT *
FROM movies
WHERE id<=5;
找到2010(含)年之后的电影里片长小于两个小时的片子
SELECT *
FROM movies
WHERE Year>=2010
AND Length_minutes <120;
DAY2
复杂条件查询
LIKE(模糊查询):如果没有通配符等价于 =
%(通配符):匹配0个以上的字符"%(匹配的字符)%"
例子
找到所有Toy Story系列电影
SELECT *
FROM movies
WHERE Title
LIKE “%Toy Story%”
找到所有不是John Lasseter导演的电影
SELECT *
FROM movies
WHERE director
NOT LIKE "%John Lasseter%";
找到所有电影名为 “WALL-” 开头的电影
SELECT *
FROM movies
WHERE title
LIKE "%WALL-%";
查询结果过滤Filering和排序Sorting
DISTINCT去重
用法
SELECT DISTINCT column1,column2,...
FROM table
WHERE conditions;
ORDER BY结果排序
用法
SELECT column1,column2,...
FROM table
WHERE conditions
ORDER BY column ASC/DESC;
ASC(升序)、DESC(降序),升序降序按照的是文本的字母序
LIMIT/OFFSET选取部分结果
用法
SELECT column,another_column,...
FROM table
WHERE conditons
ORDER BY column ASC/DESC
LIMIT num_limit(返回多少行) OFFSET num_offset(从哪一行开始返回);
LIMIT/OFFSET选取结果通常和GROUP BY一起用,使用完ORDER BY排好序之后,进行结果选取
例子:
按导演名排重列出所有电影(只显示导演),并按导演名正序排列
SELECT DISTINCT Director
FROM movies
ORDER BY Director ASC;
列出按上映年份最新上线的4部电影
SELECT *
FROM Movies
ORDER BY Year DESC
LIMIT 4;
按电影名字母序升序排列,列出前6-10部电影
SELECT *
FROM movies
ORDER BY Title ASC l
LIMIT 5 OFFSET 5
如果按片长排列,John Lasseter导演导过片长第3长的电影是哪部,列出名字即可
SELECT title
FROM movies
WHERE director
LIKE "%John Lasseter%"
ORDER BY Length_minutes ASC
LIMIT 1 OFFSET 2;
列出美国United States
人口3-4位的两个城市和他们的人口(包括所有字段)
SELECT *
FROM north_american_cities
WHERE Country
LIKE "%United States%"
ORDER BY Population DESC
LIMIT 2 OFFSET 2;
JOINS多表联合查询
在学习多表查询之前需要了解下范式,那什么是数据库范式呢?
数据库范式(normalization)是数据库表设计规范,在范式表的规范下,表中的重复数据减小,表与表之间的耦合度降低。随着表的分离,对表的操作难度也随之提升,需要更复杂的SQL语句。
用JOIN来实现多表联合查询
一般的关系表中,都会讲一个属性设置为主键(Primary Key),主键具有唯一标识一个数据的,不会重复。
借助主键(其他唯一的属性也可以)可以将两个表中具有相同主键的数据连接起来,具体我们用到 JOIN
关键字。我们先来学习 INNER JOIN
INNER JOIN用法:
SELECT column,another_column,...
FROM table
INNER JOIN another_table(要连接的表) ON table.id = another_table.id
WHERE conditions
ORDER column BY ASC/DESC
LIMIT nums_limit OFFSET nums_offset;
例子
找到所有电影的国内Domestic_sales和国际销售额
SELECT *
FROM movies
INNER JOIN Boxoffice
ON Boxoffice.movie_id = movies.id;
找到所有国际销售额比国内销售大的电影
SELECT *
FROM movies
INNER JOIN BoxOffice
ON BoxOffice.Movie_id = Movies.id
WHERE Domestic_sales <International_sales;
找出所有电影按市场占有率rating
倒序排列
SELECT *
FROM movies
INNER JOIN BoxOffice
ON movies.id = BoxOffice.movie_id
ORDER BY rating DESC;
每部电影按国际销售额比较,排名最靠前的导演是谁,国际销量多少
SELECT Director,International_sales
FROM movies
INNER JOIN BoxOffice
ON movies.id = BoxOffice.movie_id
ORDER BY International_sales DESC
LIMIT 1;
INNER JOIN只会保留两者都存在的数据,这意味着可能存在数据丢失。
那如何避免查询两表的数据丢失呢?
那就要靠外连接了:左连接LEFT JOIN、右连接RIGHT JOIN、全连接FULL JOIN。这几个 连接方式都会保留不能匹配的行。
语法:
SELECT column,another_column,...
FROM table
INNER/LEFT/RIGHT/FULL JOIN another_table(要连接的表) ON table.id = another_table.id
WHERE conditions
ORDER column BY ASC/DESC
LIMIT nums_limit OFFSET nums_offset;
左连接LEFT JOIN不管有没有匹配上右表,都会保存左表数据;右连接RIGHT JOIN不管有没有匹配上左表,都会保存右表数据;全连接FULL JOIN,不管有没有匹配上,都会保留两表数据。