SQL基础语法

记录一下基础的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中对于表的数据内容可以有很多约束:

  1. NOT NULL 内容不能为null
  2. UNIQUE 内容不能重复
  3. PRIMARY KEY 主键
  4. FOREIGN KEY 外键 参考键
  5. CHECK 检查判断
  6. 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 函数用于对字段的显示进行格式化

结束啦, 嘤嘤嘤~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值