SQL结构化查询语言

SQL Structured Query Language 结构化查询语言

1.1 Manipulation 数据操纵

SELECT * FROM celebs; 提取celebs表中的全部数据

  • 数据类型

integer 整数类型
text 文本字符串类型
date 日期类型
real 实数类型

  • 创建表
CREATE TABLE table_name (
    column_1 data_type, 
    column_2 data_type, 
    column_3 data_type
  );
  • 插入数据
INSERT INTO celebs (id, name, age)
VALUES (1, 'Justin Bieber', 21);
  • 选取某一列
SELECT name FROM celebs;
  • 更新数据
UPDATE celebs
SET age = 22
WHERE id = 1;
  • 修改数据表

增加一列数据定义

ALTER TABLE celebs ADD COLUMN twitter_handle TEXT;
  • 删除数据
DELETE FROM celebs WHERE twitter_handle IS NULL;

1.2 Queries 数据查询

  • 单表查询
SELECT name, imdb_rating FROM movies;

【DISINCT 操作符 保证查询结果为唯一值】

SELECT DISTINCT genre FROM movies;

【WHERE 操作符 过滤查询/条件查询】

SELECT * FROM movies WHERE imdb_rating > 8;

WHERE 条件运算符有
= 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

【LIKE 操作符 模糊查询】

SELECT * FROM movies
WHERE name LIKE 'Se_en';
SELECT * FROM movies
WHERE name LIKE 'a%';

SELECT * FROM movies
WHERE name LIKE '%man%'

LIKE 通配符
_ 通配单个字符
% 通配零个或多个字符

A% 匹配所有开头为'A'的字符
%a 匹配所有结尾为'a'的字符

【BETWEEN ... AND ... 操作符 匹配范围内的记录】

SELECT * FROM movies
WHERE name BETWEEN 'A' AND 'J';
SELECT * FROM movies
WHERE year BETWEEN 1990 AND 2000
AND genre = 'comedy';

【AND & OR 操作符 逻辑过滤】

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录

SELECT * FROM movies
WHERE genre = 'comedy'
OR year < 1980;

【ORDER BY DESC/ASC 操作符 排序】

ASC 升序排序
DESC 降序排序

SELECT * FROM movies
ORDER BY imdb_rating DESC;

【LIMIT 操作符 限制记录数量】

SELECT * FROM movies
ORDER BY imdb_rating ASC
LIMIT 3;

1.3 Aggregate Functions 聚合函数

【COUNT(...) 计数函数】

SELECT COUNT(*) FROM fake_apps;

【GROUP BY 分组函数】

SELECT price, COUNT(*) FROM fake_apps
GROUP BY price;
SELECT price, COUNT(*) FROM fake_apps
WHERE downloads > 20000
GROUP BY price;

【SUM(...) 求和函数】

SELECT SUM(downloads) FROM fake_apps;
SELECT category, SUM(downloads) FROM fake_apps
GROUP BY category;

【MAX(...) 最大值函数】

SELECT MAX(downloads) FROM fake_apps;
SELECT name, category, MAX(downloads) FROM fake_apps
GROUP BY category;

【MIN(...) 最小值函数】

SELECT MIN(downloads) FROM fake_apps;

【AVG(...) 平均函数】

SELECT AVG(downloads) FROM fake_apps;
SELECT price, AVG(downloads) FROM fake_apps
GROUP BY price;

【ROUND(...) 舍入为指定小数位数函数】

SELECT price, ROUND(AVG(downloads), 2) FROM fake_apps
GROUP BY price;

1.4 Multiple Tables 多表

【PRIMARY KEY 主键】

定义为主键的一列不为NULL值,都是唯一值

CREATE TABLE artists(id INTEGER PRIMARY KEY, name TEXT)

【FOREIGN KEY 外键】

  • 多表查询
SELECT albums.name, albums.year, artists.name FROM albums, artists;

【INNER JOIN 内连接】

SELECT
*
FROM
albums
JOIN artists ON
albums.artist_id = artists.id;

【LEFT JOIN 左连接】

SELECT
*
FROM
albums
LEFT JOIN artists ON
albums.artist_id = artists.id;

【AS 关键字 重命名列名】

SELECT
albums.name AS 'Album',
albums.year,
artists.name AS 'Artist'
FROM
albums
JOIN artists ON
albums.artist_id = artists.id
WHERE
albums.year > 1980;

1.5 Subqueries 子查询

  • non-correlated subquery 非关联子查询

【嵌套查询】

SELECT *
FROM flights
WHERE origin in (
SELECT code
FROM airports
WHERE elevation < 2000);
SELECT a.dep_month,
   a.dep_day_of_week,
   AVG(a.flight_distance) AS average_distance
FROM (
    SELECT dep_month,
          dep_day_of_week,
           dep_date,
           sum(distance) AS flight_distance
      FROM flights
     GROUP BY 1,2,3
   ) a
GROUP BY 1,2
ORDER BY 1,2;
  • correlated subquery 关联子查询

【外部查询取出一行后,再对内部查询中的每一行内进行运算,TRUE时候返回查询结果】

SELECT id
FROM flights AS f
WHERE distance < (
SELECT AVG(distance)
FROM flights
WHERE carrier = f.carrier
);

1.6 Set Operations

【UNION 并集】

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

UNION ALL会列出所有的值,即不去重

【INTERSECT 交集】

SELECT category FROM new_products
INTERSECT
SELECT category FROM legacy_products;

【EXCEPT 差集】

SELECT category FROM new_products
EXCEPT
SELECT category FROM legacy_products;

1.7 Conditional Aggregates 条件聚合

IS NULL 值为空
IS NOT NULL 值不为空

【CASE 控制结构】

SELECT
CASE
    WHEN elevation < 250 THEN 'Low'
    WHEN elevation BETWEEN 250 AND 1749 THEN 'Medium'
    WHEN elevation >= 1750 THEN 'High'
    ELSE 'Unknown'
END AS elevation_tier
, COUNT(*)
FROM airports
GROUP BY 1;

【COUNT(CASE WHEN)】

SELECT    state, 
COUNT(CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END) as count_high_elevation_aiports 
FROM airports 
GROUP BY state;

【SUM(CASE WHEN)】

SELECT origin, sum(distance) as total_flight_distance, sum(CASE WHEN carrier = 'DL' THEN distance ELSE 0 END) as total_delta_flight_distance 
FROM flights 
GROUP BY origin;
SELECT origin, 100.0*(sum(CASE WHEN carrier = 'UN' THEN distance ELSE 0 END)/sum(distance)) as percentage_flight_distance_from_united 
FROM flights 
GROUP BY origin;

SELECT state,
100.0 * sum(CASE WHEN elevation >= 2000 THEN 1 ELSE 0 END) / count(*)  as percentage_high_elevation_airports
FROM airports
GROUP BY state;

1.8 Date, Number, and String Functions 日期,数字和字符串函数

【Dates 时间函数】

SELECT DATETIME(manufacture_time)
FROM baked_goods;
SELECT DATE(manufacture_time), count(*) as count_baked_goods
FROM baked_goods
GROUP BY DATE(manufacture_time);
SELECT TIME(manufacture_time), count(*) as count_baked_goods
FROM baked_goods
GROUP BY TIME(manufacture_time);

在当前时间进行时间的增加,下述例子在当前时间上增加了1天2小时30分钟

SELECT DATETIME(manufacture_time, '+2 hours', '30 minutes', '1 day') as inspection_time
FROM baked_goods;

【Numbers 数字函数】

SELECT ROUND(ingredients_cost, 4) as rounded_cost
FROM baked_goods;

SELECT (number1 + number2) 返回两个数字的和
SELECT CAST(number1 AS REAL) / number3 CAST()函数用于将某种数据类型的表达式显式转换为另一种数据类型
SELECT ROUND(number, precision) 四舍五入数字,precision为精度

返回两列数据中同行的最小值

SELECT id, MIN(cook_time, cool_down_time)
FROM baked_goods;

【|| 字符串连接运算】

SELECT string1 || ' ' || string2; 利用"||"连接string1和一个空格和string2

【REPLACE() 字符串替换运算】

REPLACE(string,from_string,to_string) 将string列中的"from_string"字符串替换为"to_string"字符串

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容