SQL 是用于访问和处理数据库的标准的计算机语言。
************************************************************************************************************************************************************************
一些最重要的sql命令:
- SELECT - 从数据库中提取数据
- UPDATE - 更新数据库中的数据
- DELETE - 从数据库中删除数据
- INSERT INTO - 向数据库中插入新数据
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
****************************************************************************************
select语句:SELECT * FROM Websites;-查询所有记录
SELECTname,countryFROMWebsites;-查询指定字段
SELECTDISTINCTcountryFROMWebsites;-去掉字段里的重复值
where语句: (支持运算符:=,>,<,>=,<=,begin,like,in等)
SELECT
* FROMWebsitesWHEREcountry='CN';-使用单引号来环绕文本值
SELECT * FROMWebsitesWHEREid=1;-如果是数值字段,请不要使用引号
and和or语句:
SELECT
* FROMWebsitesWHEREcountry='CN'ANDalexa
> 50;
SELECT
* FROMWebsitesWHEREcountry='USA'ORcountry='CN';
SELECT * FROMWebsitesWHEREalexa > 15AND(country='CN'ORcountry='USA');
order by语句:
SELECT
* FROMWebsitesORDERBYalexa;-按照字段排序(默认为升序)
SELECT
* FROMWebsitesORDERBYalexaDESC;-按照字段降序排序
SELECT
* FROMWebsitesORDERBYcountry,alexa;-按照多列排序,先country后alexa
insert into 语句:
INSERTINTOWebsites(name,url,alexa,country)VALUES('百度','https://www.baidu.com/','4','CN');
update 语句:
UPDATEWebsitesSETalexa='5000',country='USA'WHEREname='菜鸟教程';
delete 语句:
DELETEFROMWebsitesWHEREname='百度'ANDcountry='CN';-删除某条记录
DELETE
* FROM table_name;-删除所有记录
****************************************************************************************
select top 语句:(并非所有的数据库系统都支持 SELECT TOP 子句)
sql server语法:SELECTTOP50PERCENT * FROMWebsites;-选取前面 50% 的记录
SELECTTOP50FROMWebsites;-选取前面50条将记录
mysql语法: SELECT * FROMWebsitesLIMIT2;-选取前面两条记录
oracle语法: SELECT * FROMWebsitesWHERE ROWNUM <= 5;-选取前面5条数据
like语句/通配符:
SELECT * FROM Websites WHERE name LIKE 'G%';-选取
name 字段以字母 "G" 开始的所有客户
SELECT * FROM Websites WHERE name NOT LIKE '%oo%';-选取
name 不包含模式 "oo" 的所有客户
in 语句:
SELECT * FROM Websites WHERE name IN ('Google','菜鸟教程');-选取
name 为 "Google" 或 "菜鸟教程" 的所有网站
between语句:
SELECT * FROM Websites WHERE alexa BETWEEN 1 AND 20;
SELECT * FROM Websites WHERE
alexa NOT BETWEEN 1 AND 20;
SELECT * FROM Websites WHERE (alexa BETWEEN 1 AND 20) AND NOT country IN ('USA', 'IND');
-选取alexa介于
1 和 20 之间但 country 不为 USA 和 IND 的所有网站
别名:
SELECT name AS n, country AS c FROM Websites;-指定了两个别名,一个是
name 列的别名,一个是 country 列的别名
SELECT
name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites;
- 把三个列(url、alexa 和 country)结合在一起,并创建一个名为 "site_info" 的别名
SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE
a.site_id=w.id and w.name="菜鸟教程";
- 使用 "Websites" 和 "access_log" 表,并分别为它们指定表别名 "w" 和 "a"(通过使用别名让 SQL 更简短)
****************************************************************************************
jion 连接: (JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段)
- INNER JOIN:如果表中有至少一个匹配,则返回行
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行
INNER JOIN 与 JOIN 是相同的
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;
LEFT JOIN (在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。)
关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
RIGHT JOIN (在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。)
关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
****************************************************************************************
UNION 操作符 合并两个或多个 SELECT 语句的结果
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
****************************************************************************************
SELECT
INTO 语句:从一个表复制数据,然后把数据插入到另一个新表中。
SELECT *
INTO WebsitesBackup2016
FROM Websites; -复制所有的列插入到新表中
SELECT name, url
INTO WebsitesBackup2016
FROM Websites; -只复制一些列插入到新表中
SELECT *
INTO WebsitesBackup2016
FROM Websites
WHERE country='CN'; -只复制中国的网站插入到新表中
注:SELECT INTO 语句可用于通过另一种模式创建一个新的空表。只需要添加促使查询没有数据返回的 WHERE 子句即可,如下:
SELECT
*
INTO newtable
FROM table1
WHERE 1=0;
INSERT INTO SELECT 语句:从一个表复制数据,然后把数据插入到一个已存在的表中。
INSERT INTO table2
SELECT * FROM table1;
-从一个表中复制所有的列插入到另一个已存在的表中
INSERT INTO Websites (name,
country)
SELECT app_name, country FROM apps; -复制
"apps" 中的数据插入到 "Websites" 中
****************************************************************************************
在 SQL 中,我们有如下约束:
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。
- DEFAULT - 规定没有给列赋值时的默认值。
-表创建时在 "P_Id" 列上创建 UNIQUE 约束:
mysql语法:
CREATE TABLE Persons
(
P_Id int NOT NULL,
UNIQUE (P_Id)
)
sql server/oracle语法:
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
)
mysql/sql
server/oracle语法:
ALTER
TABLE Persons
ADD UNIQUE (P_Id)
****************************************************************************************
CREATE
INDEX 语句:用于在表中创建索引
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
CREATE
INDEX index_name ON table_name (column_name) -在表上创建一个简单的索引。允许使用重复的值
CREATE
UNIQUE INDEX index_name ON table_name (column_name) -在表上创建一个唯一的索引。不允许使用重复的值
CREATE
INDEX PIndex ON Persons (LastName) -在
"Persons" 表的 "LastName" 列上创建一个名为 "PIndex" 的索引