数据库
数据库简介:
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 - 删除索引
SOL语句:
Select语句(查询)
SELECT 第一个字段名称,第二个字段名称(“*”表示查询所有) FROM 表名称WHERE 条件(主键=?,字段名=?,列 运算符值)
下面的运算符可在 WHERE 子句中使用:
操作符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
例如:SELECT * FROM Persons WHERECity='Beijing'
注意标点符号。
文本值:
这是正确的:
SELECT * FROM Persons WHERE FirstName='Bush'
这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush
数值:
这是正确的: SELECT * FROM Persons WHEREYear>1965
这是错误的: SELECT * FROM Persons WHEREYear>'1965'
AND 运算符实例
使用AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人:
SELECT * FROMPersons WHERE FirstName='Thomas' AND LastName='Carter'
OR 运算符实例
使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR
lastname='Carter'
结合 AND 和 OR 运算符
我们也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式):
SELECT * FROM Persons WHERE (
FirstName='Thomas' OR
FirstName='William')
AND
LastName='Carter'
ORDER BY 语句(排序)
asc:升序,默认
desc:降序
以字母顺序显示公司名称:
SELECT Company,OrderNumber FROM Orders ORDER BY Company
按住二十六个字母的顺序排列
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company,OrderNumber FROM Orders ORDER BY Company, OrderNumber
首先以字母排序,然后按照数字的由小到大的顺序排列
以逆字母顺序显示公司名称:
SELECT Company,OrderNumber FROM Orders ORDER BY Company DESC
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company,OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
INSERT INTO 语句(插入)
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10','Beijing')
除了主键意外,按顺序插入
我们也可以指定所要插入数据的列:
INSERT INTOtable_name (列1, 列2,...) VALUES (值1, 值2,....)
INSERT INTO Persons(LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
对应插入值
Update 语句(修改)
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
为lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SETFirstName = 'Fred' WHERE LastName = 'Wilson'
修改地址(address),并添加城市名称(city):
UPDATE Person SETAddress = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName ='Wilson'
把名字是Wilson的人的Address和City修改成Zhongshan 23和Nanjing
DELETE语句(删除)
DELETE FROM 表名称 WHERE 列名称 = 值
DELETE FROM PersonWHERE LastName = 'Wilson'
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROMtable_name 或者: DELETE * FROM table_name
SQLTOP 子句
SQLServer 的语法:
SELECT TOP number|percent column_name(s)
FROM table_name
MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
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
SQL LIKE 操作符
SELECTcolumn_name(s) FROM table_name WHERE column_name LIKE pattern
例子:SELECT * FROM Persons WHERE City LIKE 'N%'
注意:%号表示省略的意思,在N后面表示以N开头,N后面可以是任意的东西无论多少,都查出来
SELECT * FROMPersons WHERE City LIKE '%g'(以g结尾,前面省略)
SELECT * FROMPersons WHERE City LIKE '%lon%'(两边省略,中间有lon的)
通过使用 NOT 关键字,我们可以从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:
我们可以使用下面的 SELECT 语句:
SELECT * FROMPersons WHERE City NOT LIKE '%lon%'
分组查询 :group by
group by必须和聚合函数配合起来才能发挥威力,select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
例如,selecte.depid,SUM(e.salary) from emp as e GROUP BY e.depid
其中SUM()是mysql的内置函数,用于求和;还有AVG(),COUNT(),MAX(), MIN()等其他聚合函数
我们想要使用 GROUP BY 语句对客户进行组合。
我们使用下列 SQL 语句:
SELECTCustomer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
把customer相同名字的OrderPrice加起来求和
SQL 通配符
%可以代表一个和多个字符
-尽可以代替一个字符
[charlist]字符列中的任何单一字符
[^charlist]或者[!charlist]不在字符列中的任何单一字符
SQL IN操作符
SELECT column_name(s) FROM table_name WHERE column_nameIN (value1,value2,...)
现在,我们希望从上表中选取姓氏为 Adams 和 Carter 的人:
我们可以使用下面的 SELECT 语句:
SELECT * FROM Persons WHERE LastName IN('Adams','Carter')
SQLBETWEEN 操作符
SELECT column_name(s) FROM table_name WHERE column_name BETWEENvalue1 AND value2
SELECT * FROM Persons WHERE LastName BETWEEN
'Adams' AND
'Carter'
如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:
SELECT * FROMPersons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
SQLINNER JOIN 关键字(内连接查询)
在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
INNER JOIN 与 JOIN 是相同的。
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
SQLLEFT JOIN 关键字(左连接查询)
LEFT JOIN 关键字会从左表(table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName
SQLRIGHT JOIN 关键字(右连接查询)
RIGHT JOIN 关键字会右表(table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName