数据库学习笔记

L的定义:

SQL 是用于访问和处理数据库的标准的计算机语言。

  • SQL 指结构化查询语言,全称是 Structured Query Language。
  • SQL 让您可以访问和处理数据库。
  • SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。

2.RDBMS

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

3.SQL语法

  • use 数据库名称; 命令用于选择数据库。
  • set names utf8; 命令用于设置使用的字符集。
  • SELECT * FROM Websites; 读取数据表的信息。
  • SQL 对大小写不敏感:SELECT 与 select 是相同的。
  • select 语句
SELECT name,country FROM Websites;
SELECT DISTINCT country FROM Websites;//SELECT DISTINCT 语句用于返回唯一不同的值。
SELECT * FROM Websites WHERE country='CN';
  • and & or 运算符
SELECT * FROM Websites
WHERE country='CN'
AND alexa > 50;
SELECT * FROM Websites
WHERE country='USA'
OR country='CN';
  • order by语法
SELECT * FROM Websites
ORDER BY alexa;//默认就是升序排列,即SELECT * FROM Websites ORDER BY alexa ASC
SELECT * FROM Websites
ORDER BY alexa DESC;
  • insert into 语法

第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:

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

第二种形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
  • update语法
UPDATE Websites 
SET alexa='5000', country='USA' 
WHERE name='菜鸟教程';

在更新记录时要格外小心!在上面的实例中,如果我们省略了 WHERE 子句,所有数据中的alexa 和 country 都会被更改

  • delete语法
DELETE FROM Websites
WHERE name='百度' AND country='CN';
  • select top , limit , rownum语法

  并不是所有的数据库系统都支持select top 语法,下面是SQL,MS Access数据库系统

SELECT TOP number column_name(s)
FROM table_name;

SELECT TOP 50 PERCENT * FROM Websites;

  MY SQL数据库系统

SELECT column_name(s)
FROM table_name
LIMIT number;

  ORACLE数据库系统

SELECT *
FROM Persons
WHERE ROWNUM <=5;

   LIKE 操作符

SELECT * FROM Websites
WHERE name LIKE 'G%';

SELECT * FROM Websites
WHERE name NOT LIKE '%oo%';
通配符描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符

[^charlist]

或者

[!charlist]

不在字符列中的任何单一

 

SELECT * FROM Websites
WHERE name REGEXP '^[A-H]';//^在[]外面的就表示以A-H开头

SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';//如果^在[]里面面表示不以A-H开头 
  • in 操作符

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

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


SELECT column_name(s)
FROM table_name 
WHERE coumn_name IN (SELECT column_name FROM table_name WHERE ...)
  • between操作符

BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

SELECT * FROM Websites
WHERE alexa BETWEEN 1 AND 20;

SELECT * FROM Websites
WHERE alexa NOT BETWEEN 1 AND 20;

SELECT * FROM Websites
WHERE (alexa BETWEEN 1 AND 20)
AND NOT country IN ('USA', 'IND');

SELECT * FROM Websites
WHERE name NOT BETWEEN 'A' AND 'H';// SQL 语句选取 name 不介于 'A' 和 'H' 之间字母开始的所有网站

在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。

  • SQL别名
SELECT column_name AS alias_name
FROM table_name;
SELECT column_name(s)
FROM table_name AS alias_name;
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;//把三个列(url、alexa 和 country)结合在一起,并创建一个名为 "site_info" 的别名
  • SQL JOIN

1. INNER JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。

SQL INNER JOIN

SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;

2. LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SQL LEFT JOIN

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

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

例如:

SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;

3. RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

SQL RIGHT JOIN

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

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

4.

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.

FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。

SQL FULL OUTER JOIN

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
  •  union操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;

与union差不多的还有intersection(交),difference(差),使用的方法和union是一致的

但需要注意的一点是,这三个关系代数查询的前提是两个查询的结构一致,还有一点就是最后的结果是自动去掉重复的,所以如果需要展示所有的,就需要使用union all

SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;
  • select into 语句

通过 SQL,您可以从一个表复制信息到另一个表。

SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。(

MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。

当然你可以使用以下语句来拷贝表结构及数据:CREATE TABLE 新表 SELECT * FROM 旧表)

SELECT *
INTO WebsitesBackup2016
FROM Websites;//创建备份

SELECT name, url
INTO WebsitesBackup2016
FROM Websites;//只备份部分列到新的表中

SELECT *
INTO WebsitesBackup2016
FROM Websites
WHERE country='CN';//只备份国家为中国的数据到新的表中

SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;//复制多个表中的数据到新的表中
  • insert into select语句

通过 SQL,您可以从一个表复制信息到另一个表。

INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。

INSERT INTO table2
SELECT * FROM table1;

INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps;

INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps
WHERE id=1;
  • SQL UNIQUE 约束

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。

需要注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)//为某一列添加约束unique
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)//可以添加constraint name
)//添加多个列为unique
ALTER TABLE Persons
ADD UNIQUE (P_Id)//alter时为某一列的unique约束
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)//alter时添加某几列的unique约束
ALTER TABLE Persons
DROP INDEX uc_PersonID//MY Sql数据库系统中,撤销或删除某一列的unique约束
ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID//SQL Server / Oracle / MS Access数据库系统中,撤销或删除某一列的;unique约束
  • primary key约束

平时创建表时直接在列后面添加primary key即可

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)//alter时添加一个primary key

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)//alter时添加几个primary key
ALTER TABLE Persons
DROP PRIMARY KEY//MY SQL数据库系统

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID//SQL MS ACCESS 数据库系统

foreign key 约束

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)//可以添加多个foreign key
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)//alter时修改单个列的foreign key


ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)//alter时修改多个列的foreign key
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders//MySQL

ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders//SQL Server / Oracle / MS Access

 

posted @ 2017-07-09 10:19  fireporsche  阅读(243)  评论(0编辑  收藏  举报