SQL轻松入门

基础信息

SQL不区分大小写,语句和变量均不区分

  • 什么是SQL?
    SQL stands for Structured Query Language
    SQL lets you access and manipulate databases
    SQL is an ANSI (American National Standards Institute) standard

SQL高频语法

SELECT - extracts data from a database
UPDATE - updates data in a database
DELETE - deletes data from a database
INSERT INTO - inserts new data into a database
CREATE DATABASE - creates a new database
ALTER DATABASE - modifies a database
CREATE TABLE - creates a new table
ALTER TABLE - modifies a table
DROP TABLE - deletes a table
CREATE INDEX - creates an index (search key)
DROP INDEX - deletes an index

Syntax说明

SELECT

The SELECT statement is used to select data from a database.
The data returned is stored in a result table, called the result-set.

SELECT 子句
[INTO 子句]
FROM 子句
[WHERE 子句]
[GROUP BY 子句]
[HAVING 子句]
[ORDER BY 子句]

If SELECT all, use SELECT * FROM table_name;

SELECT column1, column2, ...
FROM table_name;

MaxRecursion(number)设置最大的查询递归次数,如果为0,不限次数;未指定,则默认是100;number是0到32767之间的非负整数。

SELECT DISTINCT

The SELECT DISTINCT statement is used to return only distinct (different) values.

SELECT DISTINCT column1, column2, ...
FROM table_name;

WHERE

The WHERE clause is used to extract only those records that fulfill a specified condition.
WHERE 可以在SELECT、UPDATE、DELETE等语句中使用

SELECT column1, column2, ...
FROM table_name
WHERE condition;

运算符Operator

Operator Description
+, -, *, / 加、减、乘、除
% 取余
= Equal
<>、!= Not equal. Note: In some versions of SQL this operator may be written as !=
> Greater than
!> Not greater than
< Less than
!< Not less than
>= Greater than or equal
<= Less than or equal
& 按位与(整型或二进制数据类型)
| 按位或(整型或二进制数据类型)
~ 按位非(整型或二进制数据类型)
^ 按位异或(整型或二进制数据类型)
AND, OR, NOT 逻辑与、或、非
以下逻辑运算符 通常与比较运算符连用
ANY 任意一个true,结果为true
ALL 全部为true,结果为true
BETWEEN ... AND Between an inclusive range
EXISTS 存在则为true
LIKE Search for a pattern,模式匹配则为true
IN '=ANY', To specify multiple possible values for a column

通配符

Operator Description
% 匹配0到多个字符的字符串
_ 匹配单个字符
[] 如[a-z],匹配指定范围或集合内的单个字符
[^] [^a-c], 匹配不在指定范围或集合内的单个字符

ORDER BY

The ORDER BY keyword is used to sort the result-set in ascending or descending order (ASC|DESC).

SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;

INSERT INTO

The INSERT INTO statement is used to insert new records in a table.
可以加某几列数据进去

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

也可以把一个表格的内容全部添加进去

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

IS NULL \ IS NOT NULL

A field with a NULL value is a field with no value.
It is not possible to test for NULL values with comparison operators, such as =, <, or <>.

SELECT column_names
FROM table_name
WHERE column_name IS NULL;
SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;

UPDATE

The UPDATE statement is used to modify the existing records in a table.

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

DELETE

The DELETE statement is used to delete existing records in a table.

DELETE FROM table_name
WHERE condition;

SELECT TOP number / percent

选择前几个SELECT TOP 50 * FROM Customers;,或前百分之几的数据。SELECT TOP 50 PERCENT * FROM Customers;
不是所有数据库都支持此条语法,MySQL 里用LIMIT:select a limited number of records, 而在Oracle中使用ROWNUM.

SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;

MIN() and MAX()

The MIN() function returns the smallest value of the selected column.
The MAX() function returns the largest value of the selected column.

SELECT MIN(column_name) AS newVal_name
FROM table_name
WHERE condition;

COUNT(), AVG() and SUM()

The COUNT() function returns the number of rows that matches a specified criteria.
The AVG() function returns the average value of a numeric column.
The SUM() function returns the total sum of a numeric column.

SELECT COUNT(column_name)
FROM table_name
WHERE condition;

WITH AS

子查询部分(subquery factoring),用来定义一个SQL片断,该SQL片断会被整个SQL语句所用到。这个语句算是公用表表达式(CTE)。

 with A as (select * from class)
    select *from A  

这个语句的意思就是,先执行select * from class 得到一个结果,将这个结果记录为A ,在执行select *from A 语句。A 表只是一个别名。
可以将重复用到的大批量 的SQL语句,放到with as 中,加一个别名,在后面用到的时候就可以直接用。类似Matlab里的段内function。

1.使用with子句可以让子查询重用相同的with查询块,通过select调用(with子句只能被select查询块引用),一般在with查询用到多次情况下。在引用的select语句之前定义,同级定义with关键字只能使用一次,多个用逗号分割。
2.with子句的返回结果存到用户的临时表空间中,只做一次查询,反复使用,提高效率。
3.在同级select前有多个查询定义的时候,第1个用with,后面的不用with,并且用逗号隔开。
4.最后一个with 子句与下面的查询之间不能有逗号,只通过右括号分割,with 子句的查询必须用括号括起来
5.如果定义了with子句,而在查询中不使用,那么会报ora-32035 错误:未引用在with子句中定义的查询名。(至少一个with查询的name未被引用,解决方法是移除未被引用的with查询),注意:只要后面有引用的就可以,不一定非要在主查询中引用,比如后面的with查询也引用了,也是可以的。
6.前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能嵌套with子句。
7.当一个查询块名字和一个表名或其他的对象相同时,解析器从内向外搜索,优先使用子查询块名字。
8.with查询的结果列有别名,引用的时候必须使用别名或*。

AS

as是别名关键字。select 字段 as 别名
在别名的部分,可以使用单引号标明字符串,方括号以避免和系统的关键字冲突。这两种方法都可以在别名内加入空格等特殊字符以改善显示结果。

例:
select
[Anum] as '编   号',
[name]  as [姓         名],
[sex] as [性别],
from [table];

CASE

用于计算条件列表的表达式,并返回可能的结果之一。
sql 的case 类型于编程语言里的 if-esle if-else 或者 switch,但它不用于控制sql程序的执行流程,而是作为列的逻辑使用。

case [input_expression]
when when_expression then result_expression
[...n]
[else else_result_expression]
end
注:其中[]内都是可选的。

简单case函数(case后加表达式,则根据表达式结果返回。)

--简单case函数
select *,
    case sex
    when '1' then '男'
    when '2' then '女’
    else '其他' end groupname
from @table

case搜索函数。(case 后不加表达式,则根据when的条件返回)

--case搜索函数
select *,
    case 
    when sex = '1' then '男'
    when sex = '2' then '女'
    else '其他' end comment
from @table 

这两种方式,可以实现相同的功能。简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式。
还有一个需要注重的问题,case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。

--比如说,下面这段sql,你永远无法得到“第二类”这个结果
case when col_1 in ('a','b') then '第一类'
     when col_1 in ('a') then '第二类'
     else '其他' end  

将sum与case结合使用,可以实现分段统计。
如果现在希望将上表中各种性别的人数进行统计,sql语句如下:

SQL> select
  2    sum(case u.sex when 1 then 1 else 0 end)男性,
  3    sum(case u.sex when 2 then 1 else 0 end)女性,
  4    sum(case when u.sex <>1 and u.sex<>2 then 1 else 0 end)性别为空
  5  from users u;
 
        男性         女性       性别为空
---------- ---------- ----------
         3          2          0

--------------------------------------------------------------------------------
SQL> select
  2    count(case when u.sex=1 then 1 end)男性,
  3    count(case when u.sex=2 then 1 end)女,
  4    count(case when u.sex <>1 and u.sex<>2 then 1 end)性别为空
  5  from users u;
 
        男性          女       性别为空
---------- ---------- ----------
         3          2          0

将case与order by一起使用,可实现复杂排序
如下,存储过程需要支持多种排序,可以传递一个参数变量,然后根据该变量判断操作。

declare @orderby int
set @orderby = 1
 
select * from @stuinfo
order by
    case when @orderby = 1 then id end desc,
    case when @orderby = 2 then id end

注意:这里要用多个case,因为desc需要放在end 后面,否则会有语法错误。

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

推荐阅读更多精彩内容