文档章节

SQL复习笔记

陆幽轩
 陆幽轩
发布于 2017/08/27 16:30
字数 1162
阅读 4
收藏 0

Review Of SQL

Basis

Basic Usage

/* Select */
SELECT column_name,column_name
FROM table_name;

SELECT * FROM table_name;

/* Insert */
INSERT INTO table_name
VALUES (value1,value2,value3,...);

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

/* Update */
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

/* Delete */
DELETE FROM table_name
WHERE some_column=some_value;

Where

SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;

Distinct

Choose the only one

SELECT DISTINCT column_name,column_name
FROM table_name;

Order by

SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

Note that ASC is the default way.


Advanced

演示数据库说明

Websites表

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鸟教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

Access_log 表

+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+

apps表

+----+------------+-------------------------+---------+
| id | app_name   | url                     | country |
+----+------------+-------------------------+---------+
|  1 | QQ APP     | http://im.qq.com/       | CN      |
|  2 | 微博 APP | http://weibo.com/       | CN      |
|  3 | 淘宝 APP | https://www.taobao.com/ | CN      |
+----+------------+-------------------------+---------+

通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用,SQL 通配符用于搜索表中的数据。

通配符 描述
_ 代替一个字符
% 代替0或多个字符
[字符串] 字符串中的任意一个字符
[^字符串] 或 [!字符串] 不在字符串中的任意一个字符
SELECT * FROM Websites
WHERE url LIKE 'https%';

正则表达式

/* 正则表达式匹配 */
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';

/* 正则表达式匹配 否定形式 */
SELECT * FROM Websites
WHERE name NOT REGEXP '^[GFs]';

IN

IN 操作符允许您在 WHERE 子句中规定多个值

SELECT * FROM Websites
WHERE name IN ('Google','菜鸟教程');

BETWEEN

BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

AS

通过使用 SQL,可以为表名称或列名称指定别名。

SELECT column_name AS alias_name
FROM table_name;

JOIN

INNER JOIN

SQL INNER JOIN

语法如下:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;

/*或者*/
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;

/* 实例 */
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count;

举例如下:

img

LEFT JOIN

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果 NULL(RIGHT JOIN 则相反)

SQL LEFT JOIN

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

img

FULL OUTER JOIN

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行。

SQL FULL OUTER JOIN

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

UNION

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

Attention: UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

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

/*默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。*/
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

imgimg

另外,带where的union all会这样:

img

INSERT INTO SELECT

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

EXISTS

结果集是否为空。比如说,选出有人访问的网站:

SELECT * FROM Websites
WHERE EXISTS (SELECT * FROM access_log
             WHERE access_log.site_id = Websites.id)

还有NOT EXISTS搭配使用。

LIMIT ... OFFSET

用于分页。比较巧妙的用法比如选出第n个大的数:

SELECT DISTINCT
   Salary AS SecondHighestSalary
FROM
   Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1

SQL Function

GROUP BY

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

img

HAVING

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用

HAVING 子句可以让我们筛选分组后的各组数据

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;

查找访问量大于200的网站

SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log
INNER JOIN Websites
ON access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;

聚合(Aggregate)函数

SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。

有用的 Aggregate 函数:

  • AVG() - 返回平均值
  • COUNT() - 返回行数
  • MAX() - 返回最大值
  • MIN() - 返回最小值
  • SUM() - 返回总和

FAQ

You can't specify target table for update in FROM clause

不能先select出同一表中的某些值,再update这个表(在同一语句中)。

错误示范:

delete from Person
where Id not in (select min(Id)
    from Person
    group by Email  
)

正确示范:

delete from Person
where Id not in (
    select * from (select min(Id)
    from Person
    group by Email  
    ) as a
)

© 著作权归作者所有

陆幽轩
粉丝 2
博文 7
码字总数 9951
作品 0
杭州
程序员
私信 提问
吴恩达(Andrew Ng)机器学习公开课中文笔记

课程地址 https://www.coursera.org/learn/machine-learning (吴恩达老师在 Coursera 上的机器学习公开课) 前言趣闻 去年的这个时间学完了这门非常赞的入门课程,最近由于项目需要,就复习...

scruel
2018/01/10
0
0
大数据之MySql笔记-0916

复习: 1.MySQL部署 拓展题: rm -rf $MYSQL_HOME/arch/* binlog日志 恢复 主从同步 rm -rf $MYSQL_HOME/data/* 数据 $MYSQLHOME/scripts/mysqlinstall_db --user=mysqladmin --basedir=/usr/......

hnairdb
2018/10/17
15
0
林晓冬的决心书

决心书 1.自我介绍: 本人林晓冬于2017年4月25日进入老男孩linux36期脱产班,是一名即将离开校园步入社会的学生,大学期间学习网络管理专业,当时对专业课没有认真学习。希望在老男孩当中端正...

Dream_wudi
2017/04/27
0
0
JAVA EE 复习笔记

写后记: 2017/11/22 最近因为吉趣项目需要做校园网的课表、成绩查询功能,不得不使用模拟请求,去请求uims教务系统的信息。 获取后需要放在一个连有校园网(外网无法查询)的服务器上,然后...

大海画家
2017/11/22
0
0
学习笔记SQL提交查询语法之WHERE子句的应用和规则[图]

俗话说,活到老,学到老,我就是半路出来学习编程的年轻人了,因为个人对于程序有兴趣,因此从一开始就自学,但是难度也非常大,目前在学习数据库了,对于一些语法和技巧,写一些学习心得笔记...

原创小博客
2018/06/01
13
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
17
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部