记录一下基础的SQL语法基础:
RDBMS: Relative Date Base Management System 关系型数据库管理系统
SQL里的statement一共有三种:
DDL: Data Defined Language
DML: Data Manipulation language
DCL: Data Control Language
DDL主要是:
CREATE: 建表
ALTER: 修改表
DROP: 删除表
具体是
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
DML主要是:
SELECT: 选择一些数据
INSERT INTO: 插入新的数据
UPDATE: 修改数据
DELETE: 删除数据
DCL主要是:
GRANT: 给用户授权
REVOKE: 撤销对用户的授权
试了一下极客学院的sql语法入门教程, 很垃圾, 建议不要使用, 转投W3Cschool
一.基础语法
最重要的是SELECT用于选取数据,
用SELECT来选择出一些特定的数据
从Orders表中选择出Company的数据
SELECT Company FROM Orders;
下面开始介绍一些常用的关键词, SELECT已经在上面了;
1.DISTINCT
从Orders表中选择出Company中不重复的的数据
SELECT DISTINCT Company FROM Orders;
2.WHERE
选出满足条件的数据
SELECT * FROM Persons WHERE City='Beijing';
可以使用AND OR 这样的逻辑连词来连接判断逻辑
3.ORDER BY
按Company降序为第一关键词, OrderNumber升序为第二关键词 进行按顺序输出
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC;
4.INSERT INTO
插入一整行新的条目
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
在指定列插入信息, 其余列为null
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');
5.UPDATE
更新某一行的条目
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson';
6.DELETE
删除某一行
DELETE FROM Person WHERE LastName = 'Wilson' ;
也可以删除所有条目, 用下面的语句:
DELETE FROM table_name;
DELETE * FROM table_name;
7.TOP
下面是标准的TOP语法, 但是不同的数据库
SQL SEVER的语法是:
SELECT TOP number|percent column_name(s)
FROM table_name
比如:
--Mysql
SELECT *
FROM Persons
LIMIT 5;
--oracle
SELECT *
FROM Persons
WHERE ROWNUM <= 5
8.LIKE
LIKE的语法:
SELECT * FROM Persons
WHERE City LIKE '%lon%'
还可以用NOT LIKE
SELECT * FROM Persons
WHERE City NOT LIKE '%lon%'
匹配的内容看下面的通配符:
9.通配符
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 比如[GODV]表示只能是GODV四个字母 |
[^charlist] 或者 [!charlist] | 不在字符列中的任何单一字符 比如[!GODV]表示只能是除了GODV四个以外的其他字母 |
10. IN
IN关键词一般是和WHERE连用表示限制的, 比如:
表示选取LastName为Adams和Carter的条目
SELECT * FROM Persons
WHERE LastName IN ('Adams','Carter')
11.BETWEEN
BETWEEN一般也是用在WHERE里的, 比如:
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
也可以用NOT BETWEEN
12.Alias
可以给表设置一个别名, 直接在表名后面设置alias就可以了
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
这样等效于
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons, Product_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
但是我们老师讲的是也可以不用AS的, 可以直接把别名写在表名的后面
13.JOIN
JOIN有很多种:
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
语法大概这样:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
还有一个natural join, 是类似于inner join的
natural join是对两张表中字段名和数据类型都相同的字段进行等值连接,并返回符合条件的结果 。
natural join是自然连接,自动对两个表按照同名的列进行内连接
使用自然连接要注意,两个表同名的列不能超过1个
还有CROSS JOIN是交叉连接, 会把两个表里的条目两两组合生成很多张表, 语法类似:
把两张表中的所有条目两两结合
SELECT* FROM GameScores CROSS JOIN Departments ;
14.UNION
可以用UNION来把两张表连接起来, 可以连接两个SELECT的语句生成一个合并后的新的表:
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
语法类似这样:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
还有UNION ALL关键词, 因为UNION在结合两个SELECT的时候会自动合并相同内容, 但是UNION ALL会把重复的内容输出两次;
15.SELECT INTO
SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
语法类似这样:
SELECT LastName,FirstName
INTO Persons IN 'Backup.mdb'
FROM Persons
WHERE City='Beijing'
其中的IN可以省略;
16.CREATE DATABASE
可以直接这样新建一个数据库
CREATE DATABASE my_db
17.CREATE TABLE
创建一个新的表, 语法类似这样:
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
18.基本数据类型
SQL中的数据类型基本有下面这些
这个网站可以看到一些整理的Oracle数据库的类型:
Oracle数据类型
W3School SQL数据类型
19.CONSTRAINTS
在sql中对于表的数据内容可以有很多约束:
- NOT NULL 内容不能为null
- UNIQUE 内容不能重复
- PRIMARY KEY 主键
- FOREIGN KEY 外键 参考键
- CHECK 检查判断
- DEFAULT 设置数据默认值
a.NOT NULL
b.UNIQUE
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
如果要在Oracle建表的时候没有加入这个约束, 也可以用ALTER TABLE来加入约束:
ALTER TABLE Persons
ADD UNIQUE (Id_P);
也可以:
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤销这个约束:
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
c.PRIMARY KEY
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
主键是自带UNIQUE的;
--可以建表的时候直接设置主键, 或者加主键约束:
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
--也可以建表之后用ALTER TABLE设定主键约束
ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)
--或者:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
--可以这样来撤销一个约束:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
d.FOREIGN KEY
类似的方法设置FOREIGN KEY
e.CHECK
可以这样ALTER TABLE设置CHECK约束:
ALTER TABLE Persons
ADD CHECK (Id_P>0)
f.DEFAULT
设置DEFAULT:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'
撤销DEFAULT:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
20.INDEX
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
除了普通的INDEX还有UNIQUE INDEX, 可以这样来设置:
CREATE INDEX index_name
ON table_name (column_name DESC)
例如:
也可以对多个列创建索引
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)
索引的实现可能是使用了B-树来实现的, 具体内容可以参见这个博客:
数据库索引到底是什么,是怎样工作的?
21.DROP
删除索引:
DROP INDEX index_name;
删除表:
DROP TABLE 表名称;
删除数据库:
DROP DATABASE 数据库名称;
清空表内的数据, 但是不删除表本身:
TRUNCATE TABLE 表名称;
22.ALTER
ALTER用于改变表中的内容
添加一列:
ALTER TABLE table_name
ADD column_name datatype
删除一列:
ALTER TABLE table_name
DROP COLUMN column_name
改变一列:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
23.AUTO INCREMENT
这是一个可以用于主键自动递增的东西, 用这个auto increment, 数据库会自动生成主键, 比上一个主键+1, 插入数据的时候就不用自己去设定主键了;
但是ORACLE数据库对这个东西没有直接的关键词, 只能这样:
先定义一个递增的序列SEQUENCE:
CREATE SEQUENCE seq_person
START WITH 1
INCREMENT BY 1
CACHE 10
上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增
该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。
然后这样调用这个SEQUENCE:
INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES (seq_person.nextval,'Lars','Monsen')
24.VIEW
视图是可视化的表; 关于视图和表的区别见这个博客:视图和表的区别
创建视图:
CREATE VIEW V_Name AS
SELECT ProductID,ProductName
FROM Products;
查询视图:
SELECT * FROM V_Name;
更新视图:(没有直接更新的方法, 新建一个视图会自动顶替以前的视图)
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition;
撤销一个视图:
DROP VIEW view_name;
25. Date Function
在sql中有专门用于保存日期的数据类型Date类型;
具体的函数可以看这个博客:
oracle 数据类型详解—日期型
几个比较常用的, 比如
日期类型转字符类, 可以指定输出格式
to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
字符类转日期类(Date精确到秒,timestamp精确到纳秒):
to_date('2010-02-24 15:01:54','YYYY-MM-DD HH24:MI:SS')
to_timestamp('1999-12-01 11:00:00.123456','YYYY-MM-DD HH:MI:SS.FF6')
还有很多函数可以对日期进行很方便的操作, 比如获取当月最后一天, 获取两个日期的时间间隔之类的, 都很好用
26.NULL
在sql里NULL表示空, 和0, false不一样, 所以要用特定的isnull函数去判别
但是oracle里面没有isnull函数, 用nvl函数来判断:
NVL(Expr1,Expr2)如果Expr1为NULL,返回Expr2的值,否则返回Expr1的值
NVL2(Expr1,Expr2,Expr3)如果Expr1为NULL,返回Expr2的值,否则返回Expr3的值
NULLIF(Expr1,Expr2)如果Expr1和Expr2的值相等,返回NULL,否则返回Expr1的值
但是其实可以直接使用IS NULL 或者IS NOT NULL来判断, 比如下面这样是等价的:
SELECT * FROM PC WHERE NVL(PRICE,0)!=0;
SELECT * FROM PC WHERE PRICE IS NOT NULL;
二. SQL FUNCTION
1.AVG
用于求一列的平均值:
找到 OrderPrice 值高于 OrderPrice 平均值的客户
SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
2.COUNT
COUNT 函数返回匹配指定条件的行数
比如:
计算客户 "Carter" 的订单数
SELECT COUNT(Customer) AS CustomerNilsen FROM Orders
WHERE Customer='Carter';
计算客户 "Carter" 的不重复的订单数
SELECT COUNT(DISTINCT Customer) AS CustomerNilsen FROM Orders
WHERE Customer='Carter';
3.FIRST&LAST
FIRST函数返回指定的字段中第一个记录的值
LAST函数返回指定的字段中最后一个记录的值
用AS是为了改变输出的列的标题
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders;
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders;
4.MAX&MIN
MAX 函数返回一列中的最大值, MIN 函数返回一列中的最小值, NULL 值不包括在计算中
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders;
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders;
5.SUM
SUM函数求取某一列的总和:
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders;
6.GROUP BY
一列数据中可能会有一些重复的元素, GROUP BY就是把相同的内容分为一组, 然后按组去对每一组进行操作, 比如SUM或者AVG这些, 看w3school上的这个例子: ?
还可以GROUP BY多个列的数据, 就要求两个数据完全相同的重复数据是一组;
7.HAVING
在where中不能使用类似于sum, avg这样的合计函数, 所以需要having
比如现在我们希望查找客户 “Bush” 或 “Adams” 拥有超过 1500 的订单总金额:
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500;
不能使用WHERE SUM(OrderPrice)>1500这种语句;
8.UCASE&LCASE
把字段转换成大写输出或者小写输出;
SELECT UCASE(LastName) as LastName,FirstName FROM Persons;
SELECT LCASE(LastName) as LastName,FirstName FROM Persons;
9.MID
MID 函数用于从文本字段中提取字符
MID函数有三个参数, 可以这样用 MID(City,1,3)
, 具体参数如下:
参数 | 描述 |
---|---|
column_name | 必需。要提取字符的字段。 |
start | 必需。规定开始位置(起始值是 1)。 |
length | 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。 |
我们希望从 "City" 列中提取每条数据的前 3 个字符
SELECT MID(City,1,3) as SmallCity FROM Persons;
10. LEN
LEN 函数返回文本字段中值的长度
比如我希望取得 “City” 列中值的长度
SELECT LEN(City) as LengthOfCity FROM Persons;
11.ROUND
ROUND 函数用于把数值字段舍入为指定的小数位数。
这个函数还是有两个参数
参数 | 描述 |
---|---|
column_name | 必需。要舍入的字段。 |
decimals | 必需。规定要返回的小数位数。 |
现在,我们希望把名称和价格舍入为最接近的整数(四舍五入)。
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products;
除了ROUND还可以使用:
CEIL(n) 取大于等于数值n的最小整数;
FLOOR(n)取小于等于数值n的最大整数
还可以使用TRUNC函数, 在处理正数的时候类似FLOOR, 处理负数的时候类似CEIL, 而且TRUNC还可以对日期类型进行操作;
12.NOW
NOW用于获取当前日期和时间
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products;
13.FORMAT
FORMAT 函数用于对字段的显示进行格式化
结束啦, 嘤嘤嘤~