博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL基础知识小结
阅读量:5839 次
发布时间:2019-06-18

本文共 9266 字,大约阅读时间需要 30 分钟。

hot3.png

SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL 可以做什么

  • SQL 面向数据库执行查询
  • SQL 可从数据库取回数据
  • SQL 可在数据库中插入新的记录
  • SQL 可更新数据库中的数据
  • SQL 可从数据库删除记录
  • SQL 可创建新数据库
  • SQL 可在数据库中创建新表
  • SQL 可在数据库中创建存储过程
  • SQL 可以设置表、存储过程和视图的权限

SQL语言包括三个部分:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)

  • 数据定义语言Data Definition Language(DDL),用来建立数据库、数据对象和定义其列。例如:CREATE、DROP、ALTER等语句。
  • 数据操作语言Data Manipulation Language(DML),用来插入、修改、删除、查询,可以修改数据库中的数据。例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句、SELECT(查询)
  • 数据控制语言Data Controlling Language(DCL),用来控制数据库组件的存取许可、存取权限等。例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。

数据操作语言DML

SELECT 语句 (用于从表中选取数据)

语法:SELECT  列名  FROM 表名  (SQL 语句对大小写并不敏感)

例子:

获取 “LastName” 和 “FirstName” 列内容,SELECT LastName,FirstName FROM Persons

 

SELECT DISTINCT语句(关键词 DISTINCT 用于返回唯一不同的值)

语法 SELECT DISTINCT 列名 FROM 表名

需从 Company“ 列中仅选取唯一不同的值,SELECT DISTINCT Company FROM Orders
结果:

 

SQL WHERE 子句(有条件地从表中选取数据)

语法:SELECT 列名 FROM 表名 WHERE 列 运算符 值

可在子句中使用的运算符: = <> > < >= <= BETWEEN LIKE    
例子

希望选取 居住在“Beijing” 的人,SELECT * FROM Persons WHERE City='Beijing'

 

AND & OR 运算符(在WHERE 子句中把两个或多个条件结合起来)

使用AND 来显示所有姓为 “Carter” 并且名为“Thomas” 或者“William”的人:

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

 

ORDER BY 子句(根据指定列对结果集进行排序。默认升序)

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

 

INSERT INTO语句(向表中插入新行)

语法: INSERT INTO 表名VALUES (值1, 值2,....)

 

例 1 插入新的行

INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

例 2 指定的列中插入数据

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

 

Update 语句(用于修改表中的数据)

语法:UPDATE 表名 SET 列名 = 新值 WHERE 列名 = 某值

例1:更新某一行中的一个列
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'

例2:更新某一行中的若干列

修改地址(address),并添加城市(city)
UPDATE Person SET Address = ‘Zhongshan 23’, City = ‘Nanjing’  WHERE LastName = 'Wilson' 

 

DELETE 语句(用于删除表中的行)

语法:DELETE FROM 表名WHERE 列名= 值

删除某行

DELETE FROM Person WHERE LastName = 'Wilson'
删除所有行
DELETE FROM table_name
DELETE * FROM table_name

 

TOP 子句(规定要返回的记录数)不同的数据库,语法不同

SQL Server语法:

SELECT TOP number|percent column_name(s) FROM tabel_name
例1 从表中选取头2条记录    SELECT TOP 2 * FROM Persons
例2 从表中选取50%的记录   SELECT TOP 50 PERCENT * FROM Persons

MySQL语法:

SELECT column_name(s) FROM table_name LIMIT number
例  SELECT * FROM Persons LIMIT 5
Oracle语法:
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
例 SELECT * FROM Persons WHERE ROWNUM <=5

 

操作符

LIKE 操作符(在WHERE 子句中搜索列中的指定模式)

语法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern

例  选取Persons表中居住在以N开始的城市里的人
SELECT * FROM Persons WHERE City LIKE 'N%'

SQL 通配符(通配符必须与LIKE 运算符一起使用)

  • % :替代一个或多个字符
  • _  :仅替代一个字符

SELECT * FROM Persons WHERE FirstName LIKE '_eorge'    

  • [charlist]:字符列中的任何单一字符
    “Persons” 表中选取居住在城市以“A” 或“L” 或“N” 开头的人:   
       SELECT * FROM Persons WHERE City LIKE '[ALN]%'
  • [^charlist]     [!charlist]:不在字符列中的任何单一字符   

Persons” 表中选取居住在城市不以“A” 或“L” 或“N” 开头的人:   

   SELECT * FROM Persons WHERE City LIKE ‘[!ALN]%'

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

语法:SELECT column_name(s)

            FROM table_name
            WHERE column_name IN (value1,value2,...)

例子:选取姓氏为Adams 和Carter 的人

SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')

 

BETWEEN 操作符(在WHERE 子句中使用,作用是选取介于两个值之间的数据)

语法:SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)

  • 例:以字母顺序显示介于"Adams"(包括)和"Carter"之间的人
    SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
  • 例:范围之外的人,可使用NOT 操作符
    SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'

注意:不同的数据库对BETWEEN...AND 操作符的处理方式是有差异,主要体现在边界。

 

Join 和Key(根据两个或多个表中列之间的关系,从这些表中查询数)

谁订购了产品,并且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName

 

INNER JOIN (或者JOIN):内连接。
在表中至少存在一个匹配时,INNER JOIN 关键字返回行
例 前面两张表格中中,列出所有人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

注意:INNER JOIN 关键字在表中至少存在一个匹配时返回行。如果"Persons" 中的行在"Orders" 中没有匹配,就不会列出这些

 

INNER JOIN (或者JOIN):内连接。

在表中至少存在一个匹配时,INNER JOIN 关键字返回行
例 前面两张表格中中,列出所有人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P

注意:INNER JOIN 关键字在表中至少存在一个匹配时返回行。如果"Persons" 中的行在"Orders" 中没有匹配,就不会列出这些

 

LEFT JOIN(left outer join):左外连接 。

从左表返回所有的行,即使右表中没有匹配的行。

例 前面两张表格中中,列出所有人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
注意:左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。

 

RIGHT JOIN (RIGHT OUTER JOIN):右外连接。

会从右表(table_name2) 那里返回所有的行,即使在左表(table_name1) 中没有匹配的行 。

例 前面两张表格中中,列出所有人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
注意:右表的记录将会全部表示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为NULL。

 

FULL JOIN(FULL OUTER JOIN) 。

只要其中某个表存在匹配,FULL JOIN 关键字就会返回。

例 前面两张表格中中,列出所有人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
注意:FULL JOIN 关键字会从左表(Persons) 和右表(Orders) 那里返回所有的行。如果"Persons" 表中的行在表"Orders" 中没有匹配,或者"Orders" 表中的行在表"Persons" 中没有匹配,这些行同样会列出。

 

“Orders” 表已存在的情况下为“Id_P” 列创建FOREIGN KEY 约束

ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

撤销 FOREIGN KEY 约束
以MySQL 为例
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders

 

操作符

 

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

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

UNION 语法:SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2

UNION 操作符默认选取不同的值。如果允许重复值,请使用UNION ALL

CREATE DATABASE(创建数据库)

语法:CREATE DATABASE database_name

CREATE TABLE (创建数据库中的表)

语法:CRATE TABLE 表名
(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
....
)

CREATE TABLE Persons

(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

约束用于限制加入表的 数据的类型,

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT

NOT NULL(约束强制列不接受 NULL 值。即如果不向字段添加值,就无法插入新记录或者更新记录)

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

UNIQUE (约束唯一标识数据库表中的每条记录)

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

PRIMARY KEY 约束唯一标识数据库表中的每条记录

主键必须包含唯一的值
主键列不能包含NULL 值
每个表都应该有一个主键,并且每个表只能有一个主键
以MySql为例
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)
)

为多个列定义PRIMARY KEY 约束(联合主键)

  CREATE TABLE Persons
  (
  Id_P int NOT NULL,
  LastName varchar(255) NOT NULL,
  FirstName varchar(255),
  Address varchar(255),
  City varchar(255),
  CONSTRAINT uc_PersonID PRIMARY KEY (Id_P,LastName)
  )

如果在表已存在的情况下为“Id_P” 列创建PRIMARY KEY 约束

ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
注:如果使用ALTER TABLE 语句添加主键,必须把主键列声明为不包含NULL 值(在表首次创建时

撤销 PRIMARY KEY 约束

MySql语法 ALTER TABLE Persons DROP PRIMARY KEY
SQL Server / Oracle / MS Access语法:
        ALTER TABLE Persons DROP CONSTRAINT pk_PersonID

FOREIGN KEY 外键约束

一个表中的FOREIGN KEY 指向另一个表中的PRIMARY KEY,FOREIGN KEY 约束能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一

以MySql为例:

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (O_Id),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

“Orders” 表已存在的情况下为“Id_P” 列创建FOREIGN KEY 约束

ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

撤销 FOREIGN KEY 约束
以MySQL 为例
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders

CHECK 约束 (限制列中值的范)

下面的 SQL 在"Persons" 表创建时为"Id_P" 列创建CHECK 约束。CHECK 约束规定"Id_P" 列必须只包含大于0 的整数。
以MySql为例
CREATE TABLE Persons
    (
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

表已存在的情况下为"Id_P" 列创建CHECK 约束

ALTER TABLE Persons
ADD CHECK (Id_P>0)

撤销 CHECK 约束

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

DEFAULT 约束(用于向列中插入默认值)

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
在表已存在的情况下为“City” 列创建DEFAULT 约束
以MySql为例
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
撤销 DEFAULT 约束
以MySql为例
ALTER TABLE Persons ALTER City DROP DEFAULT

CREATE INDEX(用于在表中创建索)

在表上创建一个简单的索引。允许使用重复的
CREATE INDEX index_name ON table_name (column_name)

在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值

CREATE UNIQUE INDEX index_name ON table_name (column_name)

例降序索引某个列中的值

CREATE INDEX PersonIndex ON Person (LastName DESC)

例索引不止一个列

CREATE INDEX PersonIndex ON Person (LastName, FirstName)

DROP(撤销索引、表以及数据库)

以MySQL为例,撤销索引语法
ALTER TABLE table_name DROP INDEX index_name

DROP TABLE用于删除表(表的结构、属性以及索引也会被删除)

DROP TABLE 表名

DROP DATABASE用于删除数据

DROP DATABASE 数据库名

TRUNCATE TABLE 命令(仅仅删除表格中的数据):

TRUNCATE TABLE 表名

ALTER TABLE(在已有的表中添加、修改或删除列DROP)
需在表中添加列,可使用下列语法
ALTER TABLE table_name ADD column_name datatype

删除表中的列,可使用下列语法

ALTER TABLE table_name DROP COLUMN column_name

NULL 值

表中某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有记录。这意味着该字段将以NULL 值保存
无法比较NULL 和0;它们是不等价的
无法使用比较运算符来测试 NULL 值,比如=, <, 或者<>。必须使用 IS NULL 和IS NOT NULL 操作符
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL

转载于:https://my.oschina.net/u/658505/blog/751630

你可能感兴趣的文章
文件权限
查看>>
busybox里的僵尸进程为何那么多
查看>>
python debug
查看>>
java 连接数据库之一个完整的函数
查看>>
mysql脚本
查看>>
OllyDBG 入门系列教学--让你瞬间成为破解高手
查看>>
Dubbo点滴(2)之集群容错
查看>>
检测不到兼容的键盘驱动程序
查看>>
listbox用法
查看>>
冲刺第九天 1.10 THU
查看>>
传值方式:ajax技术和普通传值方式
查看>>
Linux-网络连接-(VMware与CentOS)
查看>>
寻找链表相交节点
查看>>
linq 学习笔记之 Linq基本子句
查看>>
[Js]布局转换
查看>>
Hot Bath
查看>>
Java annotation 自定义注释@interface的用法
查看>>
Apache Spark 章节1
查看>>
Linux crontab定时执行任务
查看>>
mysql root密码重置
查看>>