数据库

数据库简介:

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 WHERE Year>1965

这是错误的:
SELECT * FROM Persons WHERE Year>'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