以下内容来自菜鸟教程 MySQL教程 与 SQL教程

SQL
  • SQL (Structured Query Language: 结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。

  • SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。

  • 虽然 SQL 是一门 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言,但是仍然存在着多种不同版本的 SQL 语言。然而,为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的命令(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。

  • RDBMS 指关系型数据库管理系统,全称 Relational Database Management System。

  • RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server、IBM DB2、Oracle、MySQL 以及 Microsoft Access。

  • RDBMS 中的数据存储在被称为表的数据库对象中。

  • 表是相关的数据项的集合,它由列和行组成。


MySQL

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

RDBMS 术语

在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:

  • 数据库: 数据库是一些关联表的集合。
  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
  • 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
  • 外键:外键用于关联两个表。
  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

SQL & MySQL (1) - 基础_MySQL

  • 表头(header): 每一列的名称;
  • 列(col): 具有相同数据类型的数据的集合;
  • 行(row): 每一行用来描述某条记录的具体信息;
  • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
  • 键(key): 键的值在当前列中具有唯一性。

MySQL数据库

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • MySQL 是开源的,目前隶属于 Oracle 旗下产品。
  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL 使用标准的 SQL 数据语言形式。
  • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
  • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
  • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
  • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。

SQL 语句

SQL 对大小写不敏感:SELECT 与 select 是相同的。

下面的 SQL 语句从 "Websites" 表中选取所有记录:

SELECT * FROM Websites;

某些数据库系统要求在每条 SQL 语句的末端使用分号。

分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句。

一些最重要的 SQL 命令

  • SELECT - 从数据库中提取数据 select
  • UPDATE - 更新数据库中的数据 update
  • DELETE - 从数据库中删除数据 delete
  • INSERT INTO - 向数据库中插入新数据 insert into
  • CREATE DATABASE - 创建新数据库 create database
  • ALTER DATABASE - 修改数据库 alter datebase
  • CREATE TABLE - 创建新表 create table
  • ALTER TABLE - 变更(改变)数据库表 alter table
  • DROP TABLE - 删除表 drop table
  • CREATE INDEX - 创建索引(搜索键) create index
  • DROP INDEX - 删除索引 drop index

create 对应 drop,update 和 delete用于数据而非属性


1. SQL SELECT

SELECT 语句用于从数据库中选取数据。

结果被存储在一个结果表中,称为结果集。

下面是选自 "Websites" 表的数据:

SQL SELECT 语法

  • SELECT COLUMN 语法
SELECT column_name,column_name 
FROM table_name;

SELECT name,country FROM Websites;
  • SELECT * 语法
SELECT * 
FROM table_name;

SELECT * FROM Websites;

在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。

DISTINCT 关键词用于返回唯一不同的值。

  • SELECT DISTINCT 语法
SELECT DISTINCT column_name,column_name 
FROM table_name;

SELECT DISTINCT country FROM Websites;

SQL WHERE 子句

WHERE 子句用于提取那些满足指定条件的记录。

  • SQL WHERE 语法
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;

SELECT * FROM Websites WHERE country='CN';
SELECT * FROM Websites WHERE id=1;

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。

在上个实例中 'CN' 文本字段使用了单引号。

如果是数值字段,请不要使用引号。

下面的运算符可以在 WHERE 子句中使用:= 等于, <>/!= 不等于,> 大于,< 小于,>=,<=,BETWEEN 在某个范围内,LIKE 搜索某种模式,IN 指定针对某个列的多个可能值(模糊查询)。


SQL AND & OR 运算符

  • 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

  • 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

SELECT * FROM Websites
WHERE country='CN'
AND alexa > 50;   从 "Websites" 表中选取国家为 "CN" 且alexa排名大于 "50" 的所有网站:

SELECT * FROM Websites  
WHERE country='USA'
OR country='CN';   从 "Websites" 表中选取国家为 "USA" 或者 "CN" 的所有客户

SELECT * FROM Websites   把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式)。
WHERE alexa > 15
AND (country='CN' OR country='USA');  从 "Websites" 表中选取 alexa 排名大于 "15" 且国家为 "CN" 或 "USA" 的所有网站:

SQL ORDER BY 关键字

  • ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。

  • ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

SELECT * FROM Websites 从 "Websites" 表中选取所有网站,并按照 "alexa" 列排序(默认升序):
ORDER BY alexa;

SELECT * FROM Websites 从 "Websites" 表中选取所有网站,并按照 "alexa" 列降序排序:
ORDER BY alexa DESC;

SELECT * FROM Websites 
ORDER BY country,alexa;
从 "Websites" 表中选取所有网站,先按照 "country" 在 "alexa" 列排序:
order by A,B        这个时候都是默认按升序排列
order by A desc,B   这个时候 A 降序,B 升序排列
order by A ,B desc  这个时候 A 升序,B 降序排列
即 desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。

SELECT语句示例:

Select * from emp where ename='SMITH'; SMITH 用单引号引起来,表示是字符串,字符串要区分大小写。
Select * from emp where sal > 2000 and sal < 3000; AND: 查询 EMP 表中 SAL 列中大于 2000 小于 3000 的值。
Select * from emp where sal > 2000 or comm > 500; OR: 查询 emp 表中 SAL 大于 2000 或 COMM 大于500的值。
select * from emp where not sal > 1500; NOT: 查询EMP表中 sal 小于等于 1500 的值。
Select * from emp where comm is null; is null: 查询 emp 表中 comm 列中的空值。
Select * from emp where sal between 1500 and 3000; BETWEEN: 查询 emp 表中 SAL 列中大于等于 1500 且小于等于 3000 的值,闭区间。
Select * from emp where sal in (5000,3000,1500); IN: 查询 EMP 表 SAL 列中等于 5000,3000,1500 的值。
Select * from emp where ename like 'M%'; LIKE: 查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。
  • % 表示多个字值,_ 下划线表示一个字符;
  • M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
  • %M% : 表示查询包含M的所有内容。
  • %M_ : 表示查询以M在倒数第二位的所有内容。

WHERE 子句并不一定带比较运算符,当不带运算符时,会执行一个隐式转换。当 0 时转化为 false,1 转化为 true。

SELECT studentNO FROM student WHERE 0 会返回一个空集,因为每一行记录 WHERE 都返回 false。
SELECT  studentNO  FROM student WHERE 1 返回 student 表所有行中 studentNO 列的值。因为每一行记录 WHERE 都返回 true。

2. SQL INSERT INTO

INSERT INTO 语句用于向表中插入新记录。

INSERT INTO 语句可以有两种编写形式。

  • 第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:没有指定要插入数据的列名的形式需要列出插入行的每一列数据
  • 第二种形式需要指定列名及被插入的值:
INSERT INTO table_name    无需指定要插入数据的列名
VALUES (value1,value2,value3,...); 

INSERT INTO table_name (column1,column2,column3,...)   需要指定列名及被插入的值:
VALUES (value1,value2,value3,...);

假设要向 "Websites" 表中插入一个新行。
INSERT INTO Websites (name, url, alexa, country) 
VALUES ('百度','https://www.baidu.com/','4','CN');

也可以在指定的列插入数据。
下面的 SQL 语句将插入一个新行,但是只在 "name"、"url" 和 "country" 列插入数据(id 字段会自动更新),其中 "alexa"列没有插入数据,此处默认值为 0
INSERT INTO Websites (name, url, country)
VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');

insert into select 和 select into from 的区别
insert into scorebak select * from socre where neza='neza'   --插入一行,要求表scorebak 必须存在
select *  into scorebak from score  where neza='neza'  --也是插入一行,要求表scorebak 不存在

PS:id 列是自动更新的,表中的每条记录都有一个唯一的数字。


3. SQL UPDATE

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

WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!

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

假设我们要把 "菜鸟教程" 的 alexa 排名更新为 5000,country 改为 USA。
UPDATE Websites 
SET alexa='5000', country='USA' 
WHERE name='菜鸟教程';

PS:在更新记录时要格外小心!在上面的实例中,如果我们省略了 WHERE 子句执行以上代码会将 Websites 表中所有数据的 alexa 改为 5000,country 改为 USA。

  • 执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。

  • 在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错。 set sql_safe_updates=1; 表示开启该参数


4. SQL DELETE

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

WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!

DELETE FROM table_name
WHERE some_column=some_value;

假设我们要从 "Websites" 表中删除网站名为 "Facebook" 且国家为 USA 的网站。
DELETE FROM Websites
WHERE name='Facebook' AND country='USA';

您可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变:
DELETE FROM table_name;
或
DELETE * FROM table_name;

PS:在删除记录时要格外小心!因为您不能重来!

SQL关于删除的三个语句:DROP、TRUNCATE、 DELETE 的区别。

相同点:drop、delete、truncate 都是删除表的内容。

不同点:

  • drop:删除表内容和结构,释放空间,将表删除的一干二净。没有备份表之前要慎用;
  • truncate:删除表的内容,但不删除表的定义,表的结构存在,可以释放空间,没有备份表之前要慎用;
  • delete:删除表的内容,保留表的定义,表的结构还存在,不释放空间,可以回滚恢复;

执行速度:

drop > truncate > delete