SQL学习——青铜到钻石

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40006058/article/details/80636596

为了方便,语句后面没有加分号


1 青铜~黄金

这些基本知识搞定以后,那么。。。
这里写图片描述这里写图片描述

SELECT

SELECT column1, column2,...
FROM tablename

选择表中可用的所有字段SELECT * FROM tablename
这里写图片描述
从 “Customers” 表中选取 “CustomerName” 和 “City” 列:SELECT CustomerName, City FROM Customers
从 “Customers” 表中选取所有列SELECT * FROM Customers

SELECT DISTINCT

SELECT DISTINCT语法用于仅返回不同的(different)值。在一张表内,一列通常包含许多重复的值; 有时你只想列出不同的(different)值。SELECT DISTINCT语句用于仅返回不同的(different)值。

SELECT DISTINCT column1, column2, ...
FROM tablename

从“Customers”表中的“Country”列中选择所有(和重复)值:SELECT Country from Customers
从”Customers” 表中的 “Country” 列中选择DISTINCT值:SELECT DISTINCT Country FROM Customers
列出了不同(distinct)客户国家的数量:SELECT COUNT(DISTINCT Country) FROM Customers

WHERE Clause

SELECT column1, column2, ...
FROM Customers
WHERE condition

从”Customers”表中选择其国家为”Mexico”的所有客户:SELECT * FROM Customers WHERE Country = 'Mexico'
SQL在文本值周围使用单引号(大多数数据库系统也接受双引号)。
如果是数值字段,则不要使用引号
SELECT * FROM Customers WHERE CustomerID=1
这里写图片描述

AND, OR and NOT

SQL AND & OR 运算符
WHERE子句可以与AND,OR和NOT运算符结合使用。
AND和OR运算符用于根据多个条件筛选记录:
•如果由AND分隔的所有条件为TRUE,则AND运算符显示记录。
•如果由OR分隔的任何条件为真,则OR运算符显示记录。
如果条件不为真,则NOT运算符显示记录。

SELECT column1, column2, ...
FROM tablename
WHERE condition1 AND condition2 AND condition3 ...;
SELECT column1, column2, ...
FROM tablename
WHERE condition1 OR condition2 OR condition3 ...;
SELECT column1, column2, ...
FROM table_name
WHERE NOT condition

从 “Customers” 表中选择其国家为 “Germany” 、其城市为”Berlin” 的所有客户:SELECT * FROM Customers WHERE Country = 'Germany' AND City = 'Berlin'
选择城市为“Berlin”或“München”的“Customers”的所有字段:SELECT * FROM Customers WHERE City='München' OR City = 'Berlin'
选择国家不是 “Germany”的”Customers”的所有字段:SELECT * FROM Customers WHERE NOT Country='Germany'
从国家 “Germany” 且城市为”Berlin” 或”München”的”Customers” 表中选择所有客户SELECT * FROM Customers WHERE Country = 'Germany' AND (City = 'Berlin' OR City='München')
选择国家是“德国”的“客户”的所有字段,城市必须是“柏林”或“慕尼黑”(用括号形成复杂表达式):SELECT * FROM Customers WHERE Country = 'Germany' AND (City = 'Berlin' OR City='München')
选择来自”Customers” 的国家不是 “Germany” 且不是 “USA”的所有字段:SELECT * FROM Customers WHERE NOT Country = 'Germany' AND NOT Country = 'US'

ORDER BY

ORDER BY 关键字用于按升序或降序对结果集进行排序。
ORDER BY 关键字默认情况下按升序排序记录。
如果需要按降序对记录进行排序,可以使用DESC关键字

SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC

从 “Customers” 表中选取所有客户,并按照 “Country” 列排序:SELECT * FROM Customers ORDER BY Country
从 “Customers” 表中选取所有客户,并按照 “Country” 列降序排序:SELECT * FROM Customers ORDER BY Country DESC
从 “Customers” 表中选取所有客户,并按照 “Country” 和 “CustomerName” 列排序:SELECT * FROM Customers ORDER BY Country, CustomerName
从”Customers” 表中选择所有客户,按 “Country” 升序排列,并按 “CustomerName” 列降序排列:SELECT * FROM Customers ORDER BY Country ASC, CustomerName DESC

INSERT INTO

INSERT INTO 语句可以用两种形式编写。
第一个表单没有指定要插入数据的列的名称,只提供要插入的值:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...)

如果要为表中的所有列添加值,则不需要在SQL查询中指定列名称。但是,请确保值的顺序与表中的列顺序相同。INSERT INTO语法如下所示:

INSERT INTO table_name
VALUES (value1, value2, value3, ...)

在”Customers”表中插入一个新行:INSERT INTO Customers VALUES ('Cardinal','Tom B. Erichsen','Skagen 21', 'Stavanger', '4006' ,'Norway')
SQL语句插入一个新行,但只在“CustomerName”、“City”和“Countryn”列中插入数据(CustomerID字段将自动更新):INSERT INTO Customers(CustomerName, City, Country) VALUES ('Cardinal', 'Stavanger', 'Norway')

NULL Values

SQL 中,NULL 用于表示缺失的值。数据表中的 NULL 值表示该值所处的字段为空。
具有NULL值的字段是没有值的字段。如果表中的字段是可选的,则可以插入新记录或更新记录而不向该字段添加值。然后,该字段将被保存为NULL值。值为 NULL 的字段没有值。尤其要明白的是,NULL 值与 0 或者包含空白(spaces)的字段是不同的。
IS NULL语法

SELECT column_names
FROM table_name
WHERE column_name IS NULL;

IS NOT NULL语法

SELECT column_names
FROM table_name
WHERE column_name IS NOT NULL;

这里写图片描述
使用IS NULL运算符来列出所有没有地址的人员:SELECT LastName, FirstName, Address FROM Persons WHERE Address IS NULL
使用IS NOT NULL运算符来列出所有具有地址的人员:SELECT LastName, FirstName, Address FROM Persons WHERE Address IS NOT NULL

创建表的时候,NULL 的基本语法如下:
SQL> CREATE TABLE CUSTOMERS(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25) ,
   SALARY   DECIMAL (18, 2),       
   PRIMARY KEY (ID)
);
下面是 IS NOT NULL 运算符的用法:
SQL> SELECT  ID, NAME, AGE, ADDRESS, SALARY
     FROM CUSTOMERS
     WHERE SALARY IS NOT NULL;
下面是 IS NULL 运算符的用法:
SQL> SELECT  ID, NAME, AGE, ADDRESS, SALARY
     FROM CUSTOMERS
     WHERE SALARY IS NULL;

UPDATE

UPDATE 语句用于更新表中已存在的记录。

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

请注意 !更新表中的记录时要小心!要注意SQL UPDATE 语句中的 WHERE 子句! WHERE子句指定哪些记录需要更新。 如果省略WHERE子句,所有记录都将更新!

为第一个客户(CustomerID = 1)更新了“CustomerName”和“City”:UPDATE Customers SET CustomerName = 'lixu', City = 'weihai' WHERE CustomerID = 1
把国家/地区为”Mexico”的所有记录的联系人姓名更新为“Juan”:UPDATE Customers SET ContactName = 'Juan' WHERE Country = 'Mexico'

DELETE 语句

DELETE 语句用于删除表中的行。

DELETE FROM table_name
WHERE condition;

请注意!删除表格中的记录时要小心!注意SQL DELETE 语句中的 WHERE 子句!WHERE子句指定需要删除哪些记录。如果省略了WHERE子句,表中所有记录都将被删除!
从”Customers” 表中删除客户“Alfreds Futterkiste”。 DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste'
您可以删除表中的所有行,而不需要删除该表。这意味着表的结构、属性和索引将保持不变:DELETE FROM table_name或者DELETE * FROM table_name
注意:在没有备份的情况下,删除记录要格外小心!因为你删除了不能重复!


基本的知识就学这些了
这里写图片描述这里写图片描述


白金~钻石

对于很多黄金农药玩家来说,最痛苦的也就是在打游戏时不知道如何出装,有时用的鲁班却出肉,用的猴子却出防御。。。那么,你可能被当作小学生骂了,接下来是高级知识,你将。。。
这里写图片描述这里写图片描述
对,就是会出装!

SELECT TOP, LIMIT, ROWNUM

SELECT TOP 子句

•SELECT TOP 子句用于指定要返回的记录数量。
•SELECT TOP子句在包含数千条记录的大型表上很有用。返回大量记录会影响性能。注:并不是所有的数据库系统都支持SELECT TOP子句。MySQL支持LIMIT子句来选择有限数量的记录,而Oracle使用ROWNUM。
SQL Server / MS Access 语法

SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;

MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的

MySQL语法:
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;

实例:SELECT * FROM Persons LIMIT 5;

Oracle 语法
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;

实例:SELECT * FROM Persons WHERE ROWNUM <= 5;

从”Customers”表中选择前三个记录:

SELECT TOP 3 * FROM Customers                # SQL Server / MS Access

SELECT * FROM Customers LIMIT 3              # MySQL语法:

SELECT FROM Customers WHERE ROWNUM <= 3      # Oracle 语法

从”Customers”表中选择记录的前50%:SELECT TOP 50 PERCENT * FROM Customers;
从”Customers”表中选择国家为”Germany”的前三条记录:

SELECT TOP 3 * FROM Customers WHERE Country = 'Germany'           # SQL Server / MS Access

SELECT * FROM Customers WHERE Country = 'Germany' LIMIT 3         # MySQL语法:

SELECT FROM Customers WHERE ROWNUM <= 3 AND Country = 'Germany'   # Oracle 语法

LIKE

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
有两个通配符与LIKE运算符一起使用:
•% 百分号表示零个,一个或多个字符
•_ 下划线表示单个字符

注意: MS Access使用问号(?)而不是下划线(_)。
百分号和下划线也可以组合使用!

SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;

这里写图片描述
选择以“a”开头的CustomerName的所有客户:SELECT * FROM Customers WHERE CustomerName LIKE 'a%'
选择客户名称以“a”结尾的所有客户:SELECT * FROM Customers WHERE CustomerName LIKE '%a'
选择客户名称在任何位置都具有“或”的所有客户:SELECT * FROM Customers WHERE CustomerName LIKE '%or%'
选择客户名称在第二位具有“r”的所有客户:SELECT * FROM Customers WHERE CustomerName LIKE '_r%
以“a”开头且长度至少为3个字符的所有客户:SELECT * FROM Customers WHERE CustomerName LIKE 'a_%_%
选择联系人名称以“a”开头并以“o”结尾的所有客户:SELECT * FROM Customers WHERE CustomerName LIKE 'a%o
选择客户名称不以“a”开头的所有客户:SELECT * FROM Customers WHERE CustomerName NOT LIKE 'a%

Wildcards

通配符用于替换字符串中的任何其他字符。 通配符与SQL LIKE运算符一起使用。在WHERE子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与LIKE运算符一起使用:
•% 百分号表示零个,一个或多个字符
•_ 下划线表示单个字符
注意: MS Access使用问号(?)而不是下划线(_)。
在MS Access和SQL Server中,你也可以使用:
•[ charlist ] - 定义要匹配的字符的集合和范围
•[^ charlist ]或[!charlist ] - 定义不匹配字符的集合和范围
通配符也可以组合使用!
选择所有客户City以字母“ber”开头:SELECT * FROM Customers WHERE City LIKE 'ber%'
选择City中包含“es”模式的所有客户:SELECT * FROM Customers WHERE City LIKE '%es%'
选择City以任意字符开头,然后是“erlin”的所有客户:SELECT * FROM Customers WHERE City LIKE '_erlin'
选择City开头为“L”,后面是任意字符,后面是“n”,后面是任意字符,后面是“on”的所有客户:SELECT * FROM Customers WHERE City LIKE 'L_n_on'
选择所有客户City以”b”、”s”或”p”开头:SELECT * FROM Customers WHERE City LIKE '[bsp]%'
选择“City”以“a”、“b”或“c”开头的所有客户:SELECT * FROM Customers WHERE City LIKE '[a-c]%'
选择所有客户City不以”b”、”s”或”p”开头:SELECT * FROM Customers WHERE City LIKE '[!bsp]%'或者SELECT * FROM Customers WHERE City NOT LIKE '[bsp]%';

IN

IN运算符允许您在WHERE子句中指定多个值。IN运算符是多个OR条件的简写。

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);

或者

SELECT column_name(s)
FROM table_name
WHERE column_name IN (SELECT STATEMENT);

选择位于“Germany”,“France”和“UK”的所有客户:SELECT * FROM Customers WHERE Country IN ('Germany', 'France', 'UK')
选择不在“Germany”,“France”或“UK”中的所有客户:SELECT * FROM Customers WHERE Country NOT IN ('Germany', 'France', 'UK')
选择来自同一国家的所有客户作为供应商:SELECT * FROM Customers WHERE Country IN (SELECT Country FROM Suppliers)

BETWEEN

BETWEEN运算符选择给定范围内的值。值可以是数字,文本或日期。BETWEEN运算符是包含性的:包括开始和结束值。

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

这里写图片描述
选择价格在10到20之间的所有产品:SELECT * FROM Products WHERE Price BETWEEN 10 AND 20
选择价格在10到20之间但CategoryID不是1、2或3的所有产品:SELECT * FROM Products WHERE (Price BETWEEN 10 AND 20) AND CategoryID NOT IN (1,2,3);
选择ProductName不是BETWEEN’Carnarvon Tigers’和’Mozzarella di Giovanni’的所有产品:SELECT * FROM Products WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni' ORDER BY ProductName
选取 OrderDate 介于 ‘04-July-1996’ 和 ‘09-July-1996’ 之间的所有订单SELECT * FROM Orders WHERE OrderDate BETWEEN #07/04/1996# AND #07/09/1996#;

通用数据类型

数据类型定义了存储在列中的值的类型。数据库表中的每一列都需要有一个名称和数据类型。SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。
这里写图片描述
这里写图片描述
这里写图片描述

语句快速参考

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

JOIN

SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;

•INNER JOIN:如果表中有至少一个匹配,则返回行
•LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
•RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
•FULL JOIN:只要其中一个表中存在匹配,则返回行

INNER JOIN

等价于JOIN

SELECT column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

以下SQL语句将返回所有下订单的客户:

SELECT Customers.CustomerName, Orders.OrderID 
FROM Customers 
INNER JOIN Orders 
ON Customers.CustomerID=Orders.CustomerID 
ORDER BY Customers.CustomerName;

以下SQL语句选择包含客户和货运单信息的所有订单:

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

LEFT JOIN

SQL左链接LEFT JOIN关键字返回左表(表1)中的所有行,即使在右表(表2)中没有匹配。如果在正确的表中没有匹配,结果是NULL。

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;

或:

在一些数据库中,LEFT JOIN称为LEFT OUTER JOINSELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;

将选择所有客户以及他们可能拥有的任何订单:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;

RIGHT JOIN

SELECT column_name(s)
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;

注释:在一些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
返回所有雇员以及他们可能已经放置的任何订单:

SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID

FULL OUTER JOIN

当左(表1)或右(表2)表记录匹配时,FULL OUTER JOIN关键字将返回所有记录。注意: FULL OUTER JOIN可能会返回非常大的结果集!

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

这里写图片描述
选择所有客户和所有订单:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName

自联接

自联接是一种常规联接,但表本身是连接的。

Self JOIN语法

SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;

匹配来自同一城市的客户:

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City 
ORDER BY A.City;

UNION

UNION运算符用于组合两个或更多SELECT语句的结果集。
•UNION中的每个SELECT语句必须具有相同的列数
•这些列也必须具有相似的数据类型
•每个SELECT语句中的列也必须以相同的顺序排列

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

注释:默认情况下,UNION 运算符选择一个不同的值。如果允许重复值,请使用 UNION ALL。

SQL UNION ALL 语法
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

注释:UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。
从 “Customers” 和 “Suppliers” 表中选取所有不同的城市(只有不同的值):

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

不能用 UNION 来列出两个表中的所有城市。如果一些客户和供应商来自同一个城市,每个城市将只被列入一个列表。UNION将只选择不同的值。请使用UNION ALL选择重复值!
使用 UNION ALL 从 “Customers”和”Suppliers” 表中选择所有城市(也是重复的值):

SELECT City FROM Customers
UNION ALL
SELECT City FROm Suppiers
ORDER BY City

使用UNIONALL从”Customers”和 “Suppliers” 表中选择所有德国城市(也是重复数值):

SELECT Country, City FROM Customers
WHERE Country = 'Germany'
UNION ALL
SELECT Country, City FROM Suppliers
WHERE Country = 'Germany'
ORDER BY City

从“客户”和“供应商”中选择所有不同的德国城市(只有不同​​的值):

SELECT Country, City FROM Customers
WHERE Country = 'Germany'
UNION 
SELECT Country, City FROM Suppliers
WHERE Country = 'Germany'
ORDER BY City

SELECT INTO

使用 SQL,您可以将信息从一个表中复制到另一个表中。 要求目标表不存在,因为在插入时会自动创建表,并将指定字段数据复制到目标表中。
我们可以把所有的列都复制到新表中:

SELECT *
INTO newtable [IN externaldb]
FROM table1;

或者只复制希望的列插入到新表中:

SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;

提示:将使用SELECT语句中定义的列名和类型创建新表。您可以使用AS子句来应用一个新名称
创建 Customers 的备份复件:

SELECT *
INTO Customers2
FROM Customers

请使用 IN 子句来复制表到另一个数据库中:

SELECT *
INTO Cuatomers3 IN 'Cus.mdb'
FROM Customers

只复制一些列插入到新表中:

SELECT ContactName, City
INTO Customers4
FROM Customers

只复制德国的客户插入到新表中:

SELECT * 
INTO Customers5
FROM Customers
WHERE Country = 'Germany'

复制多个表中的数据插入到新表中:

SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2013
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID;

INSERT INTO SELECT

使用SQL,您可以将信息从一个表中复制到另一个表中。
INSERT INTO SELECT 从表中复制数据,并将数据插入现有的表中。
INSERT INTO SELECT 语句从表中复制数据,并将数据插入现有的表中。目标表中的任何现有行都不会受到影响。
我们可以将所有列从一个表中复制到另一个已经存在的表中:

INSERT INTO table2
SELECT * FROM table1;

或者我们可以把想要的列复制到另一个现有的表中:

INSERT INTO table2(column_name(s))
SELECT column_name(s)
FROM table1;

把 “Suppliers” 一栏复制到 “Customers” 一栏:

INSERT INTO Customers (CustomerName, Country)
SELECT SupplierName, Country 
FROM Suppliers

只将德国供应商的副本插入 “Customers” :

INSERT INTO Customers (CustomerName, Country)
SELECT SupplierName, Country FROM Suppliers
WHERE Country='Germany'; 

DROP

撤销索引、表以及数据库

DROP INDEX 语句

DROP INDEX 语句用于删除表中的索引。
用于 MS Access 的 DROP INDEX 语法:DROP INDEX index_name ON table_name
用于 MS SQL Server 的 DROP INDEX 语法:DROP INDEX table_name.index_name
用于 DB2/Oracle 的 DROP INDEX 语法:DROP INDEX index_name
用于 MySQL 的 DROP INDEX 语法:ALTER TABLE table_name DROP INDEX index_name

DROP TABLE 语句

DROP TABLE 语句用于删除表。DROP TABLE table_name

DROP DATABASE 语句

DROP DATABASE 语句用于删除数据库。DROP DATABASE database_name

TRUNCATE TABLE 语句

如果我们只需要删除表中的数据,而不删除表本身,那么我们该怎么做?

使用TRUNCATE TABLE语句:TRUNCATE TABLE table_name
drop、truncate和delete的区别

CREATE DATABASE

创建数据库CREATE DATABASE dbname
创建一个名为 “my_db” 的数据库:CREATE DATABASE my_db

CREATE TABLE 语句

CREATE TABLE 语句用于创建数据库中的表。
表由行和列组成,每个表都必须有个表名。

CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);

column_name 参数规定表中列的名称。data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。size 参数规定表中列的最大长度。

创建一个名为 “Persons” 的表,包含五列:PersonID、LastName、FirstName、Address 和 City:
各个数据库的数据类型手册

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

ALTER TABLE

ALTER TABLE 语句用于在现有表中添加、删除或修改列。

若要向表中添加列,请使用以下语法:

ALTER TABLE table_name
ADD column_name datatype

若要删除表中的列,请使用以下语法(请注意,一些数据库系统不允许这样删除数据库表中的列):

ALTER TABLE table_name
DROP COLUMN column_name

若要更改表中列的数据类型,请使用以下语法:

SQL Server / MS Access:

ALTER TABLE table_name
ALTER COLUMN column_name datatype
MySQL / Oracle:

ALTER TABLE table_name
MODIFY COLUMN column_name datatype

这里写图片描述

在 “Persons” 表中添加一个名为 “DateOfBirth” 的列:

ALTER TABLE Persons
ADD DateOfBirth date

改变 “Persons” 表中 “DateOfBirth” 列的数据类型:

ALTER TABLE Persons
ALTER COLUMN DateOfBirth year

删除 “Person” 表中的 “DateOfBirth” 列:

ALTER TABLE Persons
DROP COLUMN DateOfBirth

AUTO INCREMENT

Auto-increment 会在新记录插入表中时生成一个唯一的数字。我们通常希望在每次插入新记录时自动创建主键字段的值。我们可以在表中创建一个自动增量(auto-increment)字段。
用于 MySQL 的语法,以下SQL语句将 “Persons” 表中的“ID”列定义为自动递增(auto-increment)主键字段:

CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)

MySQL使用AUTO_INREMENT关键字来执行自动增量( auto-increment )任务。默认情况下,AUTO_INREMENT的起始值为1,每个新记录增加1。 若要以其他值开始AUTO_INREMENT序列,请使用以下SQL语法:

用于 SQL Server 的语法以下SQL语句将 “Persons” 表中的“ID”列定义为自动递增( auto-increment )主键字段:

CREATE TABLE Persons
(
ID int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

MS SQL Server使用IDENTITY关键字执行自动增量( auto-increment )任务。
在上面的示例中,IDENTITY的起始值为1,每个新记录增量为1。 提示:指定“ID”列以10开头,并递增5,将标识( identity )更改为IDENTITY(105)。要在 “Persons” 表中插入新记录,我们不需要为”ID”栏指定值(自动添加唯一值):

INSERT INTO Persons (FirstName,LastName)
VALUES ('Lars','Monsen')

上面的 SQL 语句在 “Persons” 表中插入一个新记录。“ID”栏将得到唯一值。”FirstName”栏设置为”Lars”,”LastName”栏设置为”Monsen”。

CREATE VIEW、REPLACE VIEW、 DROP VIEW

CREATE VIEW 语句
在 SQL 中,视图是基于 SQL 语句的结果集的可视化表。 视图包含行和列,就像真正的表一样。视图中的字段是一个或多个数据库中真实表中的字段。 您可以添加 SQL 函数,在哪里添加,并将语句连接到视图,或者您可以呈现数据,就像数据来自单个表一样。

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

注释:视图总是显示最新数据!每当用户查询视图时,数据库引擎就使用视图的 SQL 语句重新构建数据。
“Current Product List”(当前产品列表)视图从”Products”表中列出了所有正在使用的产品(未停产的产品)。这个视图使用下面的 SQL 创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

我们可以像这样查询上面这个视图:SELECT * FROM [Current Product List]

Northwind 样本数据库的另一个视图会选取 “Products” 表中所有单位价格高于平均单位价格的产品:

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

我们可以像这样查询上面这个视图:SELECT * FROM [Products Above Average Price]

Northwind 样本数据库的另一个视图会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 “Product Sales for 1997” 的视图那里选取数据:

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName

我们可以像这样查询上面这个视图:SELECT * FROM [Category Sales For 1997]
我们也可以向查询添加条件。现在,我们仅仅需要查看 “Beverages” 类的销售总数:

SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'

CREATE OR REPLACE VIEW 语法
更新视图

CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

现在,我们希望向 “Current Product List” 视图添加 “Category” 列。我们将通过下列 SQL 更新视图:

CREATE OR REPLACE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

DROP VIEW 语法
删除视图

DROP VIEW view_name

Date

Note注意:当我们处理日期时,最困难的任务可能是确保插入日期的格式与数据库中日期列中的格式相匹配。只要您的数据仅包含日期的一部分,运行查询就不会成为问题。然而,当涉及到时间时,情况会稍微复杂一些。 在讨论日期查询的复杂性之前,让我们看看最重要的内置日期处理程序。
这里写图片描述
这里写图片描述

MySQL 使用下列数据类型在数据库中存储日期或时间值:
•DATE - 格式:YYYY-MM-DD
•DATETIME - 格式:YYYY-MM-DD HH:MM:SS
•TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
•YEAR - 格式:YYYY 或 YY

SQL Server 使用下列数据类型在数据库中存储日期或时间值:
•DATE - 格式:YYYY-MM-DD
•DATETIME - 格式:YYYY-MM-DD HH:MM:SS
•SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
•TIMESTAMP - 格式:唯一的数字

选取 OrderDate 为 “2008-11-11” 的记录:SELECT * FROM Orders WHERE OrderDate = '2008-11-11'

NULL 值 – IS NULL 和 IS NOT NULL

如果表中的列是可选的,那么我们可以插入一个新记录或更新一个现有记录,而无需向列添加一个值。这意味着该字段将存储为 NULL 。NULL 值的处理与其他值不同。NULL 为未知或不适当值的占位符。Note注释:无法比较 NULL 和 0;它们是不等价的。
选择 “Address” 列中有 NULL 值的记录:SELECT * FROM Persons WHERE Address IS NULL
选择 “Address” 列中没有 NULL 值的记录:SELECT * FROM Persons WHERE Address IS NOT NULL


欧克,就这些了
这里写图片描述这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_40006058/article/details/80636596