SQL

SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)

查询和更新指令构成了 SQL 的 DML 部分:
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据

SQL 中最重要的 DDL 语句:
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

SQL基本语句

1、SELECT
SELECT 列名称或者* FROM 表名称
SELECT DISTINCT 列名称 FROM 表名称 返回唯一不同的值
SELECT LastName,FirstName FROM Persons

2、WHERE 筛选条件
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
SELECT * FROM Persons WHERE City='Beijing'
文本条件值周围用单引号!

3、AND/OR
SELECT * FROM Persons WHERE FirstName='Thomas' AND/OR LastName='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')
AND LastName='Carter'

4、ORDER BY 排序
SELECT Company, OrderNumber FROM Orders ORDER BY Company 以字母顺序显示公司名称
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 以逆字母顺序显示公司名称,并以数字顺序显示顺序号

5、INSERT INTO 插入值
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees') 在指定的列中插入数据

6、UPDATE 更新修改数据
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson' 为 lastname 是 "Wilson" 的人修改地址,添加城市

7、DELETE
DELETE FROM Person WHERE LastName = 'Wilson'
DELETE * FROM table_name

SQL高级功能

1、TOP 限定前几个
SELECT column_name(s) FROM table_name LIMIT number
SELECT * FROM Persons LIMIT 5
SELECT TOP 2 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons

2、LIKE
SELECT * FROM Persons WHERE City LIKE 'N%'
希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人
注意:"%" 可用于定义通配符(模式中缺少的字母)
SELECT * FROM Persons WHERE City LIKE '%g' 以 "g" 结尾的城市
SELECT * FROM Persons WHERE City NOT LIKE '%lon%' 不包含 "lon" 的城市

3、通配符介绍
SQL 通配符必须与 LIKE 运算符一起使用!
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er' 姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er"
SELECT * FROM Persons WHERE City LIKE '[ALN]%' 城市以 "A" 或 "L" 或 "N" 开头

通配符

4、IN / BETWEEN 选取多个值
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') 选取姓氏为 Adams 和 Carter
SELECT * FROM Persons WHERE LastName (NOT)BETWEEN 'Adams' AND 'Carter' 字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)

5、AS 别名
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"

6、各种JOIN
JOIN = INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN
INNER JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行

INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。
FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

两张表格

FULL OUTER JOIN

7、UNION / UNION ALL 合并两个结果集
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
SELECT E_Name FROM Employees_China
UNION (ALL)
SELECT E_Name FROM Employees_USA

8、SELECT INTO 创建表的备份复件
SELECT LastName,FirstName INTO Persons_backup FROM Persons
SELECT * INTO Persons IN 'Backup.mdb' FROM Persons 向另一个数据库中拷贝
SELECT Persons.LastName,Orders.OrderNo
INTO Persons_Order_Backup
FROM Persons INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P 创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息

9、CREATE DATABASE / TABLE
CREATE DATABASE my_db
CREATE TABLE Persons 创建数据库中的表
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
) Id_P 列是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符

表格数据类型

10、约束: 限制加入表的数据的类型
写在创建表的数据类型之后。primary key中暗含unique约束。一个表格只能有一个primary key约束,但可以有多个unique约束。
SQL Server格式:列名称 数据类型 约束;MySQL会单列一行命令
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录
CREATE TABLE Persons
(
Id_P int NOT NULL, UNIQUE 这是SQL Server的写法
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_P) 这是MySQL的写法
)
如果是当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束:
ALTER TABLE Persons ADD UNIQUE (Id_P)
ALTER TABLE Persons DROP INDEX uc_PersonID (撤销)

11、PRIMARY / FOREIGN KEY
PRIMARY KEY 约束唯一标识数据库表中的每条记录。每个表都应该有一个主键,并且每个表只能有一个主键。
MySQL 与Server的用法同UNIQUE,同理ADD和DROP:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P) 这是MySQL的用法
)
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
例子:"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
这是MySQL用法,在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

12、CHECK约束
CHECK (Id_P>0) CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

13、DEFAULT 插入默认值
City varchar(255) DEFAULT 'Sandnes'
OrderDate date DEFAULT GETDATE() 通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值

14、CREATE INDEX 创建索引
CREATE UNIQUE INDEX PersonIndex ON Person (LastName DESC)
创建一个唯一索引,名为 "PersonIndex",在 Person 表的 LastName 列,并降序索引
CREATE INDEX PersonIndex ON Person (LastName, FirstName)
删除索引(MySQL的用法):ALTER TABLE table_name DROP INDEX index_name

15、DROP 与 ALTER
DROP TABLE 表名称 / DATABASE db
ALTER TABLE Persons ADD Birthday date 添加新列Birthday
ALTER TABLE Persons ALTER COLUMN Birthday year 修改Birthday 类型
ALTER TABLE Person DROP COLUMN Birthday

16、VIEW 可视化
视图 "Current Product List" 会从 Products 表列出所有正在使用的产品:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
SELECT * FROM [Current Product List] 查询命令:可以查询上面这个视图
计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 "Product Sales for 1997" 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName

17、Isnull() 和 Ifnull()
由于Null本身和0不等价,所以,我们需要处理null值,比如设置其等于0。
SQL Server的用法:
SELECT ProductName,UnitPrice(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products
MySQL的用法:
SELECT ProductName,UnitPrice
(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products

18、RDBMS 关系数据库管理系统
RDBMS是SQL的基础!
首先,数据库管理系统是一种可以访问数据库中数据的计算机程序。DBMS 使我们有能力在数据库中提取、修改或者存贮信息。不同的 DBMS 提供不同的函数供查询、提交以及修改数据。关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。

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

推荐阅读更多精彩内容