SQL基础语法

Sql基础语法,以下部分可以直接在SQLyog中执行。

-- SQL Structured Query Language 结构化查询语句

-- SQL 指结构化查询语言 
-- SQL 使我们有能力访问数据库
-- SQL 是一种ANSI的标准计算机语言

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


-- SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。
-- SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。
-- 不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来
-- 支持一些主要的关键词(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。


-- RDBMS 指的是关系型数据库管理系统。
-- RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server, IBM DB2,
-- Oracle, MySQL 以及 Microsoft Access。
-- RDBMS 中的数据存储在被称为表(tables)的数据库对象中。
-- 表是相关的数据项的集合,它由列和行组成。


-- SQL DML 和 DDL
-- 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
-- SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
-- 查询和更新指令构成了 SQL 的 DML 部分:
-- SELECT - 从数据库表中获取数据
-- UPDATE - 更新数据库表中的数据
-- DELETE - 从数据库表中删除数据
-- INSERT INTO - 向数据库表中插入数据
-- SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),
-- 规定表之间的链接,以及施加表间的约束。
-- SQL 中最重要的 DDL 语句:
-- CREATE DATABASE - 创建新数据库
-- ALTER DATABASE - 修改数据库
-- CREATE TABLE - 创建新表
-- ALTER TABLE - 变更(改变)数据库表
-- DROP TABLE - 删除表
-- CREATE INDEX - 创建索引(搜索键)
-- DROP INDEX - 删除索引


-- 创建表格
CREATE TABLE Persons(
Id INT(5) PRIMARY KEY NOT NULL ,
FirstName CHAR(10) ,
LastName CHAR(10) ,
Address CHAR(10) ,
City CHAR(10) 
 );
 -- 删除表格
 DROP TABLE Persons;
 -- 插入数据
INSERT INTO Persons VALUES
(1,'Adams','John','Oxford Street','London'),
(2,'Bush','George','Fifth Avenue','NEW York'),
(3,'Carter','Thomas','Changan Street','Beijing'),
(4,'Tim','Duncn','Shui ZhiD','Boston'),
(5,'Chen','Xiang','China','Beijing'),
(6,'Park','Thomas','Changan Street','Beijing');


CREATE TABLE Orders(
Id_O INT NOT NULL,
Company CHAR(20) NOT NULL,
OrderNumber INT NOT NULL,
Id INT,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id) REFERENCES Persons(Id)
);


INSERT INTO Orders VALUES
(1,'W3School',6754,1),
(2,'Apple',3356,3),
(3,'IBM',2189,1),
(4,'W3School',4567,2),
(5,'Apple',3987,5),
(6,'W3School',4276,4),
(7,'IBM',5555,3);


-- 查询 SELECT 用于表中获取数据 结果被存储在一个结果表中(称为结果集)。
SELECT * FROM Persons;
SELECT LastName FROM Persons ;
SELECT * FROM Orders;


-- 去重 关键词 DISTINCT 用于返回唯一不同的值。
SELECT Company FROM Orders;
SELECT DISTINCT Company FROM Orders;


-- 条件查询,可将 WHERE 子句添加到 SELECT 语句。
-- 运算符: < > <= >= == <> between  like in not in 
-- 请注意,我们在例子中的条件值周围使用的是单引号。
-- SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。


-- AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
-- 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
-- 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。


-- ORDER BY 语句用于根据指定的列对结果集进行排序(默认升序)。降序排序,可以使用 DESC 关键字。
-- INSERT INTO 语句用于向表格中插入新的行。
-- Update 语句用于修改表中的数据。
-- DELETE 语句用于删除表中的行。


-- Limit 用于规定要返回的记录的数目。Oracle中使用 ROWNUM 字段
-- LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式,即模糊查询。
SELECT * FROM Persons WHERE City LIKE 'N%' ;
SELECT * FROM Persons;
-- 'A%'以A开头 '%A'以A结尾 '%A%'A在中间


-- IN 操作符允许我们在 WHERE 子句中规定多个值。


-- BETWEEN AND 选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SELECT * FROM Persons WHERE FirstName BETWEEN 'Adams' AND 'Carter' ;
-- NOT BETWEEN AND
SELECT * FROM Persons WHERE FirstName
NOT BETWEEN 'Adams' AND 'Carter' ;
-- SQL Alias(别名)包括 表的别名和列的别名
SELECT * FROM Persons p ;
-- 基于别名的两表联查
SELECT 
  o.Company,
  p.LastName,
  p.FirstName 
FROM
  Persons AS p,
  Orders AS o 
WHERE p.Id = o.Id 
  AND p.LastName = 'John' 
  AND p.FirstName = 'Adams' ;
  
-- SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
-- 普通形式
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNumber
FROM Persons, Orders
WHERE Persons.Id = Orders.Id ;
-- inner join 如果表中有至少一个匹配,则返回行
SELECT p.* , o.* 
FROM Persons p INNER JOIN Orders o ON p.Id = o.Id ;
-- left join 左连接 即使右表中没有匹配,也从左表返回所有的行
SELECT p.* , o.* 
FROM Persons p LEFT JOIN Orders o ON p.Id = o.Id ;
-- right join 右连接 即使左表中没有匹配,也从右表返回所有的行
SELECT p.* , o.* 
FROM Persons p RIGHT JOIN Orders o ON p.Id = o.Id ;
-- full join 全连接 只要其中一个表中存在匹配,就返回行
-- ELECT p.*,o.* FROM Persons p full JOIN Orders o ON p.Id = o.Id ;


-- SQL UNION 操作符
-- UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
-- 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。
-- 同时,每条 SELECT 语句中的列的顺序必须相同。
-- UNION 命令列出的值不重复,UNION ALL 命令列出所有的值,包括重复的。


-- SQL SELECT INTO 语句可用于创建表的备份复件。
-- SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
-- SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。
-- SELECT * INTO Persons_backup FROM Persons ;


-- CREATE DATABASE 数据库名 用于创建数据库。
-- CREATE TABLE 表名 创建表


-- SQL 约束 约束用于限制加入表的数据的类型。
-- 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
-- 主要约束:NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT


-- NOT NULL 约束强制列不接受 NULL 值。NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
-- UNIQUE 约束唯一标识数据库表中的每条记录。UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
-- PRIMARY KEY 拥有自动定义的 UNIQUE 约束。注:每个表可以有多个 UNIQUE 约束,但只能有一个 PRIMARY KEY 约束。
-- PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含 NULL 值。
-- 每个表都应该有一个主键,并且每个表只能有一个主键。
-- ALTER TABLE Persons ADD PRIMARY KEY (Id);
-- ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id,LastName);
-- ALTER TABLE Persons DROP PRIMARY KEY;
-- FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
-- ALTER TABLE Orders ADD FOREIGN KEY (Id) REFERENCES Persons(Id);
-- ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders;
-- CHECK 约束用于限制列中的值的范围。 如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
-- 如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
-- ALTER TABLE Persons ADD CHECK (Id>0) ;
-- ALTER TABLE Persons DROP CHECK chk_Person ;
-- DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。
-- ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES' ;
-- ALTER TABLE Persons ALTER City DROP DEFAULT ;


-- 索引
-- CREATE INDEX 语句用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
-- 在表中创建索引,以便更加快速高效地查询数据。用户无法看到索引,它们只能被用来加速搜索/查询。
-- 注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。
-- 因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
-- CREATE INDEX index_name ON table_name (column_name)
-- CREATE INDEX PersonIndex ON Persons (LastName) ;
SELECT * FROM Persons;
-- DROP INDEX 命令删除表格中的索引。


-- ALTER TABLE 语句 用于在已有的表中添加、修改或删除列。
-- 增加列 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


-- AUTO INCREMENT 自增字段 自动地创建主键字段的值。
-- MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。
-- 默认 AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
-- 要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法:
-- ALTER TABLE Persons AUTO_INCREMENT=100
-- 在 Oracle 中,通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。


-- 什么是视图?
-- 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
-- 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据
-- 库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,
-- 我们也可以提交数据,就像这些来自于某个单一的表。
-- 注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
-- 注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。


-- SQL 日期
-- 当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
-- 只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
-- 在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
-- NOW() 返回当前的日期和时间
-- CURDATE() 返回当前的日期
-- CURTIME() 返回当前的时间
-- DATE() 提取日期或日期/时间表达式的日期部分
-- EXTRACT() 返回日期/时间按的单独部分
-- DATE_ADD() 给日期添加指定的时间间隔
-- DATE_SUB() 从日期减去指定的时间间隔
-- DATEDIFF() 返回两个日期之间的天数
-- DATE_FORMAT() 用不同的格式显示日期/时间
-- DATE - 格式 YYYY-MM-DD
-- DATETIME - 格式: YYYY-MM-DD HH:MM:SS
-- TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
-- YEAR - 格式 YYYY 或 YY


-- SQL NULL 值
-- 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。
-- 这意味着该字段将以 NULL 值保存。
-- NULL 值的处理方式与其他值不同。
-- NULL 用作未知的或不适用的值的占位符。
-- 注释:无法比较 NULL 和 0;它们是不等价的。
-- 测试 NULL 值呢?使用 IS NULL 和 IS NOT NULL 操作符。


-- DBMS - 数据库管理系统(Database Management System)
-- 数据库管理系统是一种可以访问数据库中数据的计算机程序。
-- DBMS 使我们有能力在数据库中提取、修改或者存贮信息。
-- 不同的 DBMS 提供不同的函数供查询、提交以及修改数据。
-- RDBMS - 关系数据库管理系统(Relational Database Management System)
-- 关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。
-- 20 世纪 70 年代初,IBM 公司发明了 RDBMS。
-- RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 
-- 以及 Microsoft Access 的基础。




-- SQL函数的类型
-- 在 SQL 中,基本的函数类型和种类有若干种。函数的基本类型是:
-- 合计函数(Aggregate functions) Aggregate 函数的操作面向一系列的值,并返回一个单一的值。
-- Scalar 函数   Scalar 函数的操作面向某个单一的值,并返回基于输入值的一个单一的值。


-- AVG(column) 返回某列的平均值
SELECT * FROM Orders;
-- 平均值
SELECT AVG(OrderNumber) FROM Orders;
-- 查询在平均值之上的信息
SELECT 
  * 
FROM
  Orders 
WHERE OrderNumber > 
  (SELECT 
    AVG(OrderNumber) 
  FROM
    Orders) ;


-- COUNT(column) 返回某列的行数(不包括 NULL 值)
SELECT  * FROM Persons;
SELECT COUNT(Id) FROM Persons;
-- COUNT(*) 返回被选行数
SELECT COUNT(*) FROM Persons;
-- FIRST(column) 返回在指定的域中第一个记录的值
-- LAST(column) 返回在指定的域中最后一个记录的值
-- MAX(column) 返回某列的最高值
-- MIN(column) 返回某列的最低值
-- SUM(column)   返回某列值的总和
-- STDEV(column)  
-- STDEVP(column)  
-- VAR(column)  
-- VARP(column)


-- GROUP BY 分组
-- GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。 
SELECT * FROM Persons;
SELECT * FROM Orders;
SELECT SUM(OrderNumber),Company FROM Orders GROUP BY Company;


-- HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SELECT SUM(OrderNumber),Company FROM Orders GROUP BY Company HAVING SUM(OrderNumber) > 10000 ;


-- UCASE() 函数 UCASE 函数把字段的值转换为大写
-- LCASE() 函数 LCASE 函数把字段的值转换为小写
SELECT UCASE(FirstName) FirstName , LCASE(LastName) LastName FROM Persons ;
-- MID() 函数 MID 函数用于从文本字段中提取字符。
SELECT MID(City,1,3) AS SmallCity FROM Persons ;
-- LENGTH() 函数 LEN 函数返回文本字段中值的长度。
SELECT LENGTH(City) AS LengthOfCity ,city FROM Persons ;
-- ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数。
SELECT ROUND(OrderPrice) price ,OrderPrice FROM Orders;
-- NOW() 函数 NOW 函数返回当前的日期和时间。
SELECT NOW();
-- DATEDIFF(date1,date2)函数 date1-date2所得到的天数
SELECT DATEDIFF(NOW(),OrderDate) FROM Orders;
SELECT * FROM Orders;
-- FORMAT() 函数 FORMAT 函数用于对字段的显示进行格式化。
SELECT OrderDate , FORMAT(OrderDate , 'YYYY/MM/DD') FROM Orders;

猜你喜欢

转载自blog.csdn.net/spurs611/article/details/80916302