Sql分为两个部分:数据操作语言dml 数据定义语言 ddl
数据操作语言就是对数据库的增删改查
Insert into 增加 Insert into 表名 values(?,) Insert into 表名 (列名1,列名2) values (值1,值2) Select 查询 Select 列名 from 表名 Select distinct 列名 from 表明 删除查询出来的相同的值(相同值只查询一次) Delect 删除 Delect from 表名 where 列名称 =某值 删除所有值 delect from 表名 Update 修改 Update 表名称 set 列名称=新值,列名称=新值 where 列名称=某值
一.Where 操作
下面的运算符可在 WHERE 子句中使用: 操作符 描述
= 等于
不等于
大于
< 小于
= 大于等于
<= 小于等于
BETWEEN 在某个范围内 LIKE 搜索某种模式 比如Select * from user where uid = 1 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录 Select * from user where uid=1 and username=’ss’ 也可以多次使用and和or Select * from user where (uid=1or username=’ss’) and age=18
二
order by 用于对结果集进行排序
1 用于对指定列排序 默认排序是升序 如果想降序用desc 可以多次用 Select * from user order by username desc ,uid 按名字排序 如果名字相同 按id 排序
三
Top子句
相当于限定个数 比如mysql是select * from user where username=’wang’ limit 1 只能取出一个名字是王的人
四
Like 模糊查询
Select * from user where username=’王%’ 删选名字叫王什么的人 通配符 描述 % 替代一个或多个字符 _ 仅替代一个字符 [charlist] 字符列中的任何单一字符 [^charlist] 或者 [!charlist] 不在字符列中的任何单一字符 SELECT * FROM Persons WHERE City LIKE '[!ALN]%' "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人
五in操作符
In 操作符可以在where中定义多个值 SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
六 between
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。 SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
七 别名
使用表名作为别名 SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John' 别名使查询程序更易阅读和书写 使用一个列名别名 Id LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing SELECT LastName AS Family, FirstName AS Name FROM Persons 查询后 Family Name Adams John Bush George Carter Thomas
连接查询
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。 数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。 JOIN: 如果表中有至少一个匹配,则返回行 LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行 RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行 FULL JOIN: 只要其中一个表中存在匹配,就返回行 "Persons" 表: Id_P LastName FirstName Address City 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing "Orders" 表: Id_O OrderNo Id_P 1 77895 3 2 44678 3 3 22456 1 4 24562 1 5 34764 65
内连接
语法 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name 运行内连接 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678
左连接
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行 LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 使用下面的 SELECT 语句: SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 Bush George LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。
右连接
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。 RIGHT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 使用下面的 SELECT 语句: SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 34764 RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。
4.SQL FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。 FULL JOIN 关键字语法 SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name 使用下面的 SELECT 语句: SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 结果集: LastName FirstName OrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 Bush George 34764
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。 SQL UNION 语法 SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。 SQL UNION ALL 语法 SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2 另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
SQL SELECT INTO 语句可用于创建表的备份复件。
SELECT INTO 语句 SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。 SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。 SQL SELECT INTO 语法 您可以把所有的列插入新表: SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename 或者只把希望的列插入新表: SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename SQL SELECT INTO 实例 - 制作备份复件 下面的例子会制作 "Persons" 表的备份复件: SELECT *INTO Persons_backup FROM Persons IN 子句可用于向另一个数据库中拷贝表: SELECT *INTO Persons IN 'Backup.mdb' FROM Persons 如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域: SELECT LastName,FirstNameINTO Persons_backup FROM Persons SQL SELECT INTO 实例 - 带有 WHERE 子句 我们也可以添加 WHERE 子句。 下面的例子通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表: SELECT LastName,FirstnameINTO Persons_backup FROM PersonsWHERE City='Beijing' SQL SELECT INTO 实例 - 被连接的表 从一个以上的表中选取数据也是可以做到的。 下面的例子会创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息: SELECT Persons.LastName,Orders.OrderNoINTO Persons_Order_BackupFROM PersonsINNER JOIN OrdersON Persons.Id_P=Orders.Id_P
increment
SQL AUTO INCREMENT 字段 SQL Alter SQL View Auto-increment 会在新记录插入表中时生成一个唯一的数字。 AUTO INCREMENT 字段 我们通常希望在每次插入新记录时,自动地创建主键字段的值。 我们可以在表中创建一个 auto-increment 字段。 用于 MySQL 的语法 下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键: CREATE TABLE Persons ( P_Id int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (P_Id) ) MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。 默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。 要让 AUTO_INCREMENT 序列以其他的值起始,请使用下列 SQL 语法: ALTER TABLE Persons AUTO_INCREMENT=100 要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值): INSERT INTO Persons (FirstName,LastName) VALUES ('Bill','Gates') 上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。 用于 SQL Server 的语法 下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键: CREATE TABLE Persons ( P_Id int PRIMARY KEY IDENTITY, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) ) MS SQL 使用 IDENTITY 关键字来执行 auto-increment 任务。 默认地,IDENTITY 的开始值是 1,每条新记录递增 1。 要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10) 要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值): INSERT INTO Persons (FirstName,LastName) VALUES ('Bill','Gates') 上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。 用于 Access 的语法 下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键: CREATE TABLE Persons ( P_Id int PRIMARY KEY AUTOINCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) ) MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务。 默认地,AUTOINCREMENT 的开始值是 1,每条新记录递增 1。 要规定 "P_Id" 列以 20 起始且递增 10,请把 autoincrement 改为 AUTOINCREMENT(20,10) 要在 "Persons" 表中插入新记录,我们不必为 "P_Id" 列规定值(会自动添加一个唯一的值): INSERT INTO Persons (FirstName,LastName) VALUES ('Bill','Gates') 上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 会被赋予一个唯一的值。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。 用于 Oracle 的语法 在 Oracle 中,代码稍微复杂一点。 您必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。 请使用下面的 CREATE SEQUENCE 语法: CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10 上面的代码创建名为 seq_person 的序列对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。CACHE 选项规定了为了提高访问速度要存储多少个序列值。 要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值): INSERT INTO Persons (P_Id,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen') 上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"P_Id" 的赋值是来自 seq_person 序列的下一个数字。"FirstName" 会被设置为 "Bill","LastName" 列会被设置为 "Gates"。
视图
SQL CREATE VIEW 语句 什么是视图? 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。 注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。 SQL CREATE VIEW 语法 CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition 注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。 SQL CREATE VIEW 实例 可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。 样本数据库 Northwind 拥有一些被默认安装的视图。视图 "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' SQL 更新视图 您可以使用下面的语法来更新视图: SQL CREATE OR REPLACE VIEW Syntax CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition 现在,我们希望向 "Current Product List" 视图添加 "Category" 列。我们将通过下列 SQL 更新视图: CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName,Category FROM Products WHERE Discontinued=No SQL 撤销视图 您可以通过 DROP VIEW 命令来删除视图。 SQL DROP VIEW Syntax DROP VIEW view_name