现在的位置: 首页 > 数据库 > 正文

SQL入门笔记

2014年10月19日 数据库 ⁄ 共 11394字 评论数 2 ⁄ 阅读 880 次

这份笔记是我刚接触SQL时写的,相对来讲基础全面,但不够深入。笔记主要参考来源包括W3school、《SQL入门经典》和《SQL必知必会》等网络或书箱资源,因版本原因请勿转载。

【SQL是什么】

SQL是用于访问和处理数据库的标准的计算机语言。SQL是一门 ANSI的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。

 

【SQL 能做什么?】

  • SQL 面向数据库执行查询
  • SQL 可从数据库取回数据
  • SQL 可在数据库中插入新的记录
  • SQL 可更新数据库中的数据
  • SQL 可从数据库删除记录
  • SQL 可创建新数据库
  • SQL 可在数据库中创建新表
  • SQL 可在数据库中创建存储过程
  • SQL 可在数据库中创建视图
  • SQL 可以设置表、存储过程和视图的权限

 

【数据库表】

一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行)。

 

【注意事项】

  • 一定要记住,SQL语言对大小写不敏感,但数据永远是区分大小写的!
  • SQL语句后面的分号?某些数据库系统要求在每条SQL命令的末端使用分号,分号是在数据库系统中分隔每条SQ语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。
  • 大多数情况下,UPDATE和DELETE都需要跟WHERE子句,否则将对整列数据进行处理!

 

【SQL命令的类型】

SQL命令主要分类包括:

数据定义语言(DDL):基础DDL命令包括:CREATE(TABLE、INDEX、VIEW)、ALTER(TABLE、INDEX)、DROP(TABLE、INDEX、VIEW);

数据操作语言(DML):基础DML命令包括:INSERT、UPDATE、DELETE;

数据查询语言(DQL):最常用DML命令为SELECT;

数据控制语言(DCL):数据控制语言用于控制对数据库里数据的访问,用于创建与用户访问相关的对象,以及控制用的权限,常用命令包括:ALTER PASSWORD、GRANT、REVOKE、CREATE SYNONYM;

数据管理命令:数据管理命令用于对数据库里的操作进行审计和分析,有助于分析系统性能,常用命令包括:START AUDIT、STOP AUDIT;

事务控制命令:常用事务命令包括:COMMIT、ROLLBACK、SAVEPOINT、SET TRANSACTION;

 

【SQL DML和DDL

可以把SQL分为两个部分:数据操作语言(DML)和数据定义语言(DDL),总的来说数据操作主要包括查找(SELECT)、更新(UPDATE)、添加(INSERT INTO)、删除(DELETE),而数据定义主要包括创建(CREATE)、修改(ALTER)、删除(DROP)。

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 - 删除索引

 

【SQL SELECT 语句】

SELECT语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。SELECT可以匹配的子句较多,如WHERE(AND、OR、LIKE、IN、BETWEEN)、ORDER BY、TOP、JOIN、UNIO-N

语法一:SELECT 列名称 FROM 表名称

语法二:SELECT * FROM 表名称

搜索多列则各列名称间用逗号隔开,搜索所有列则直接用*即可。

唯一不重复DISTINCT

SQLSELECT DISTINCT语法:

SELECT DISTINCT 列名称 FROM 表名称

若想仅仅列出不同(distinct)的值,则该关键词DISTINCT用于返回唯一不同的值。

举例:

SELECT LastName,FirstName FROM Persons

【SELECT INTO

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中,常用于创建表的备份复件或者用于对记录进行存档。同时SELECT INTO可以用于向另一个数据库中拷贝表,或使用WHERE子句筛选拷贝。

语法:SELECT 列名 INTO 新表名 [IN 其他数据库] FROM 表名

举例:

SELECT * INTO Persons IN ‘Backup.mdb’ FROM Persons

 

【WHERE

WHERE 子句用于过滤数据指定搜索条件,一般跟在SELECT语句后。

语法:SELECT 列名称 FROM 表名称 WHERE 列运算符值

常用操作符:=(等于)、<>(不等于,也可用!=)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、BETWEEN(在某个范围内)、LIKE(搜索某种模式)、IS NULL(空值)、

举例:

SELECT * FORM Persons WHERE City = ‘Beijing’

在Persons表中搜索City列中为Beijing的记录,其中值为文本型则需要外加单引号,数值则不需要。

 

【AND OR NOT

AND 和 OR 运算符用于多条件记录过滤,对于AND输出同时满足两个条件的记录,对于OR输出满足任意一个条件的记录。NOT操作符用于否定后面的条件,用在过滤的列前,一般位于WHERE之后。

举例:

SELECT * FROM Persons WHERE FirstName = ‘Lei’ AND LastName = ‘Li’

在Persons表中查询姓为Li,名为Lei的记录。

同时出现AND和OR可以使用括号,如下:

SELECT * FROM Persons WHERE (FirstName = ‘Lei’ OR FirstName = ‘Dalei’) AND LastName = ‘Li’

在Persons表中查询姓为Li,名为Lei或Dalei的记录。

 

【ORDER BY

ORDER BY 语句用于根据指定的列对结果集进行排序,默认按升序对记录进行排序,如果需要按降序排序需要于最后使用DESC,指定按升序则用ASC。同时,ORDER BY可以针对多列进行排序,若排序第一列中有相同内容则该第二排序列进行排序。ORDER BY也可以不用列名,而用在SELECT中的相对列位置排序,如ORDER BY 2,3,然而,若有所更新很容易造成相对引用错误;

举例:

SELECT Company,OrderNumber FROM Orders ORDER BY Company

SELECT Company,OrderNumber FROM Orders ORDER BY Company,OrderNumber

SELECT Company,OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

 

【INSERT INTO

Insert into语句用于向表格中插入新数据。

语法一:INSERT INTO 表名 VALUES(值1,值2…)

语法二:INSERT INTO 表名(列1,列2…) VALUES(值1,值2…)

举例:

INSERT INTO Persons VALUES(Lei,Li,Xinjiekou,Nanjing)

INSERT INTO Persons(LastName,FirstName) VALUES(Lei,Li)

 

【UPDATE

Update语句用于修改表中的数据,若同时修改多列以逗号隔开即可。

语法:

UPDATE 表名 SET 列名 = 新值 WHERE 列名 = 检索列名

举例:

UPDATE Persons SET FirstName = ‘Lei’ WHERE LastName = ‘Li’

UPDATE Persons SET Address = ‘Xinjiekou’, City = ‘Nanjing’ WHERE FirstName = ‘Lei’

 

【DELETE FROM

Delete语句用于删除表中的行,若需要删除行则只需省略WHERE及之后的定位内容即可。

语法:

DELETE FROM 表名 WHERE 列名 = 值

举例:

DELETE FROM Persons WHERE LastName = ‘Lei’

Persons表中,名为Lei的一行记录将被删除

DELETE FROM 表名

删除所有行但不删除表,这意味着表的结构、属性和索引是完整的。

 

【TOP

TOP 子句用于规定要返回的记录的数目。

SQL Server语法:SELECT TOP 数字/百分比列名 FROM 表名

MySQL语法:SELECT 列名 FROM 表名 LIMIT 数字

Oracle语法:SELECT 列名 FROM 表名 WHERE ROWNUM <= 数字

举例:

SELCET TOP 10 * FROM Persons

SELECT TOP 50 PERCENT * FROM Persons

 

【LIKE

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式,相当于字符串模糊匹配。也可用为否定匹配,只需在LIKE前加NOT即可。

语法:SELECT 列名 FROM 表名 WHERE 列名 LIKE 匹配条件

举例:

SELECT * FROM Persons WHERE City LIKE ‘N%’选取城市列中以N开头的城市所在行

SELECT * FROM Persons WHERE City LIKE ‘%g’选取城市列中以g为结尾的城市所在行

SELECT * FROM Persons WHERE City NOT LIKE ‘%an%’选取城市中不包含an的城市所在行

 

【通配符】

% 表示一个或多个字符

_ 表示一个字符

[字符序列] 表示字符序列中的任意一个字符

[^字符序列]或[!字符序列] 表示非字符序列中的任意一个字符

举例:

SELECT * FROM Persons WHERE LastName LIKE ‘H_a_g’

选取姓氏列中以H开头然后任一字符再是a再任一字符最后以g结尾的姓氏所在行

SELECT * FROM Persons WHERE LastName LIKE ‘[HL]’

选取姓氏列中以H或L开头的姓氏所在行

 

【IN

IN 操作符允许我们在 WHERE 子句中规定多个值,相当于=加OR。

语法:SELECT 列名 FROM 表名 WHERE 列名 IN (值1,值2…)

举例:SELECT * FROM Persons WHERE FirstName IN (‘Lei’,’Dalei’)

 

【BETWEEN

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围,这些值可以是数值、文本或者日期。需要注意的是,在不同数据库数据范围可能不同,有些不包含上下界,有些包含上下界,有些包含上界不包含下界。同样,也可以使用NOT操作符反向选择区域。

语法:SELECT 列名 FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2

举例:SELECT * FROM Persons WHERE LastName BETWEEN ‘Li’ AND ‘Zhang’

 

【Aliases

Aliases可以为列名或表名指定别名(alias),别名有助于我们书写,列的别名在列后As跟别名,表的别名在表后跟AS别名。

表别名语法:SELECT 列名 FROM 表名 AS 别名

列别名语法:SELECT 列名 AS 别名 FROM 表名

举例:

SELECT p.FirstName,o.OrderID FROM Persons AS p, Order AS o WHERE p.FirstName = ‘Lei’

SELECT FirstName AS Name,LastName AS Family FROM Persons

 

【JOIN…ON

join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。数据库中的表可通过键将彼此联系起来,主键(Primary Key)是一个列,在某个表中这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

举例:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderID FROM Persons, Orders WHERE Persons.ID_P=Orders.ID_p

等价于:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderID FROM Persons INNER JOIN Orders ON Persons.ID_p=Orders.ID_p

JOIN共有四种类型:

JOIN: 只返回两表中均有匹配项的行,不返回左表或右表未匹配的行(INNER JOIN与JOIN是相同的);

LEFT JOIN: 返回左表的所有行,即使在右表中没有匹配;

RIGHT JOIN: 返回右表的所有行,即使在左表中没有匹配,某些数据库也称RIGHT OUTER JOIN;

FULL JOIN:返回左表和右表的所有行,即使没有匹配,某些数据库也称FULL OUTER JOIN;

INNER JOIN语法:SELECT 列名 FROM 左表名 INNER JOIN 右表名 ON 左列名=右列名

LEFT JOIN语法:SELECT 列名 FROM 左表名 LEFT JOIN 右表名 ON 左列名=右列名

RIGHT JOIN语法:SELECT 列名 FROM 左表名 RIGHT JOIN 右表名 ON 左列名=右列名

FULL JOIN语法:SELECT 列名 FROM 左表名 FULL JOIN 右表名 ON 左列名=右列名

 

【UNIO-N

UNIO-N 操作符用于合并两个或多个 SELECT 语句的结果集。UNIO-N 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。默认地,UNIO-N 操作符选取不同的值。如果允许重复的值,请使用 UNIO-N ALL。

语法:SELECT 列名 FROM 表1 UNIO-N SELCET 列名 FROM表2

 

【CREATE

CREATE DATABASE 用于创建数据库,CREATE TABLE 语句用于创建数据库中的表。

语法:

CREATE DATABASE 数据库名

CREATE TABLE 表名

(

列名1 数据类型,

列名2 数据类型,

)

 

【数据类型】

整数:integer(size)、int(size)、smallint(size)、tinyint(size),在括号内规定数字的最大位数。

小数:decimal(size,d)、numeric(size,d),"size"规定数字的最大位数,"d" 规定小数点右侧的最大位数。

字符:char(size)容纳固定长度的字符串(可容纳字母、数字以及特殊字符),”size”规定字符串的长度。varchar(size)容纳可变长度的字符串(可容纳字母、数字以及特殊的字符),”size”规定字符串的最大长度。

日期:date(yyyymmdd),容纳日期。

 

【Constraints

约束用于限制加入表的数据的类型,可以在创建表时规定约束(通过CREATE TABLE语句),或者在表创建之后也可以(通过ALTER TABLE语句)。

常见约束:

NOT NULL约束列不接受空值,字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

UNIQUE约 束唯一标识数据库表中的每条记录,UNIQUE和PRIMARY KEY约束均为列或列集合提供了唯一性的保证,PRIMARY KEY拥有自动定义的UNIQUE约束,每个表可以有多个 UNIQUE约束,但是每个表只能有一个PRIMARY KEY约束。在MySQL和SQL server、Oracle中位置不同,前者在最后定义,后者在所定义列定义。

若需要命名约束及多列定义约束,可于最后使用语法:CONSTRAINT 约束名 UNIQUE (列名1,列名2…);

若表已创建,需要添加约束条件,则可使用语法:ALTER TABLE 表名 ADD UNIQUE (列名);

若表已创建,需要命名且给多列添加约束条件,则可使用语法:ALTER ATBLE 表名 ADD CONSTRAINT 约束名 UNIQUE (列名1,列名2…);

若需撤销约束条件,对于MySQL可使用语法:ALTER TABLE 表名 DROP INDEX 约束名;对于Oracle等可使用语法:ALTER TABLE 表名 DROP CONSTRAINT 约束名;

PRIMARY KEY主 键必须包含唯一的值,主键列不能包含NULL值,每个表都应该有一个主键,并且每个表只能有一个主键。在创建表时,对于MySQL于列定义完的最后定义主 键,而其他可直接于定义列时定义。其命名及多列定义语法与UNIQUE一样,同样,添加主键ADD及撤销主键DROP规则与UNIQUE也一样。需要注意 的是在添加主键时,所添加列 在创建时需有NOT NULL定义。

FOREIGN KEY一 个表中的 FOREIGN KEY指向另一个表中的 PRIMARY KEY。创建表时,对于MySQL就于最后定义,而其他可直接于定义列时进行定义,语法:列名数据类型 FOREIGN KEY REFERENCES 表名(列名),见例三。同样,添加及撤销主键语法与UNIQUE一样。

CHECK用于限制列中的值的范围,限制条件可为数字范围或字符串等。如果对单个列定义 CHECK约束,那么该列只允许特定的值。如果对一个表定义CHECK约束,那么此约束会在特定的列中对值进行限制。约束条件创建、添加、撤销与其他一样,多个约束条件可以用AND。

DEFAULT用于向列中插入默认值,如果没有规定其他的值,那么会将默认值添加到所有的新记录。Default默认值可以为数字或字符串,也可以是函数,如例五。添加和撤销default与其他约束条件不太一样。

添加语法为:ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 条件(另一个出现)SET的语法为UPDATE;

撤销语法为:ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT;

例一:

CREATE TABLE Persons

(

Id_p int NOT NULL UNIQUE,

LastName varchar(255),

FirstName varchar(255)

)

例二:

CREATE TABLE Persons

(

Id_p int NOT NULL PRIMARY KEY,

LastName varchar(255),

FirstName varchar(255)

)

例三:

CREATE TABLE Orders

(

Id_o int NOT NULL PRIMARY KEY,

Ordernum int NOT NULL,

Id_p int FORIGN KEY REFERENCES Persons(Id_p)

)

例四:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),

CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Nanjing')

)

例五:

CREATE TABLE Orders

(

Id_O int NOT NULL,

OrderNo int NOT NULL,

Id_P int,

OrderDate date DEFAULT GETDATE()

)

 

【CREATE INDEX

CREATE INDEX语句用于在表中创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。用户无法看到索引,它们只能被用来加速搜索/查 询。更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创 建索引。

若在INDEX前加UNIQUE则为创建一个唯一的索引,唯一的索引意味着两个行不能拥有相同的索引值;

创建索引时也可以以降序或升序索引某个列的词,只需要在列名后加DESC或ASC即可;

若需要索引不只一列,也可以在括号中添加多列,各列之间只需要以逗号隔开即可;

语法:CREATE INDEX 索引名 ON 表名(列名)

举例:

CREATE INDEX PersonIndex

ON Persons (LastName, FirstName)

 

【DROP

DROP 语句可以用来删除数据库、数据表和索引,不同数据库中索引删除语法不同,数据库及数据表删除语法分别为:DROP DATABASE 数据库名、DROP TABLE 表名。若需要仅清除数据表内的数据,但不删除表本身可以使用TRUNCATE命令,语法为:TRUNCATE TABLE 表名。

 

【ALTER

ALTER TABLE 语句用于在已有的表中添加、修改或删除列(DELETE用于处理行),在条件约束CONSTRAINS时也常用到。

语法:

ALTER TABLE 表名 ADD 列名数据类型

ALTER TABLE 表名 DROP COLUMN 列名

ALTER TABLE 表名 ALTER COLUMN 列名数据类型

 

【AUTO_INCREMENT

Auto_increment 会在新记录插入表中时生成一个唯一的数字,在不同的数据库中语法不太相同。默认初始值为1,增幅为1,不同语法中通过不同代码可以进行设置。

 

【函数】

函 数的基本类型可分为两种,Aggregate Functions和Scalar Functions。Aggregate函数操作面向一系列值,返回一个单一值;Scalar函数面向单一的某个值,并返回一个单一值。函数使用的一般语 法为:SELECT 函数名(列) FROM 表名。同时函数还可以单纯被作为值引用在命令中,见例二。

【AVG

AVG(average)函数返回数值列的平均值,NULL 值不包括在计算中。

语法:SELECT AVG(列名) FROM 表名

例一:SELECT AVG(Price) AS Averageprice FROM Orders ‘在这里AS引起别名

例二:SELECT Customer FROM Orders

WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

【COUNT

COUNT()函数返回匹配指定条件的行数,NULL不计入。COUNT可以跟DISTINCT结合返回唯一不重复行数,可以跟WHERE定位返回行数。

语法:SELECT COUNT(列名) FROM 表名

例一:SELECT COUNT(Customer) AS times FROM Orders WHERE FirstName = ‘Lei’

例二:SELECT COUNT(*) AS Total FROM Orders

例三:SELECT COUNT(DISTINCT Customer) AS Uniquecustomer FROM Orders

【FIRST/LAST

FIRST()函数返回指定的字段中第一个记录的值,可使用ORDER BY语句对记录进行排序,Last函数与FIRST基本一致。

语法:SELECT FIRST(列名) FROM 表名

举例:SELECT FIRST(Customer) AS FirstCustomer FROM Orders

【MAX/MIN

MAX函数返回一列中的最大值,MIN函数返回一列中的最小值,NULL值不包括在计算中。

语法:SELECT MAX(列名) FROM 表名

举例:SELECT MAX(Price) AS maxprice FROM Orders

【SUM

SUM函数返回数值列的和。

语法:SELECT SUM(列名) FROM 表名

【GROUP BY

分 组充许把数据分为多个逻辑组,以便能对每个组进行聚集计算,分组是在SELECT语句的GROUP BY子句中建立的。数据分组是按照逻辑次序把具有重复值的字段进行合并,主要与汇总函数配合使用,如SUM、AVG、MAX、MIN、和COUNT。 GROUP BY的本质与ORDER BY类似,也是对查询结果进行逻辑上的分组排序。GROUP BY子句在WHERE子句之后,ORDER BY之前。注,若分组中有NULL值,则NULL将作为一个分组返回,如果列中有多行NULL值,它们将分为一级。

举例:SELECT Customer,SUM(OrderPrice) FROM OrdersGROUP BY Customer

若无GROUP BY则会出现每个Customer行后都跟一个SUM结果,出现多个重复行。

【HAVING

WHERE 子句无法与合计函数一起使用,而HAVING可在合计函数出现时起到定位作用。HAVING对于GROUP BY的作用就相当于WHERE对于SELECT的作用,WHERE子句设定被选择的字段的条件,而HAVING子句设置GROUP BY子句形成分组的条件。WHERE在分组前进行过滤,HAVING在分组后进行过滤。

举例:SELECT Customer,SUM(OrderPrice) FROM Orders

GROUP BY Customer

HAVING SUM(OrderPrice)<2000

【UCASE/LCASE

UCASE(uppercase)将列字段转换为大写,LCASE(lower case)将列字段转换为小写。

语法:SELECT UCASE(列名) FROM 表名

【MID

MID函数用于从文本段中提取字符。

语法:SELECT MID(列名,起始字符,[截取长度]) FROM 表名

起始字符为MID函数开始截取的位置,截取长度为所要返回的字符数,若省略,则MID函数返回剩余所有文本。

举例:SELECT MID(LastName,1,1) AS Letter FROM Persons

【LEN

LEN函数返回文本字段中值的长度。

语法:SELECT LEN(列名) FROM 表名

举例:SELECT LEN(City) AS lengthofcity FROM Persons

【ROUND

ROUND函数用于把数值字段舍入为指定的小数位数。

语法:SELECT ROUND(列名,小数位) FROM 表名

举例:SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products

【NOW

NOW函数返回当前的日期和时间,Sql Server数据库,使用 getdate() 函数来获得当前的日期时间。

语法:SELECT NOW() FROM 表名

举例:SELECT ProductName, UnitPrice, Now() as PerDate FROM Products

【FORMAT

FORMAT 函数用于对字段的显示进行格式化。

语法:SELECT FORMAT(column_name,format) FROM table_name

 

【增加SQL可读性】

  • 虽然提高SQL的可读性并不会改善性能,但这有利于后期修改和调整。
  • 每个子句都以新行开始,如FROM、WHERE、ORDER BY等;
  • 语句中使用多个表时,使用表别名;
  • 用统一的方式使用制表符和空格;
  • 语句过长时换行;
  • SELECT多字段时让每个字段都以新行形式出现;
  • FROM中使用多个表时每个表以新行形式出现;
  • WHERE条件多个时每个条件以新行形式出现;

 

【提高SQL语句的性能】

  • FROM子句中使用多个表时,把较小的表列放在前面,较大的表列放在后面会提升性能;
  • WHERE条件中,较小的表放在左侧,而较大的表放在右侧,一般基表在右侧;
  • WHERE子句中顺序影响性能,子句返回记录较少的就放在最后;
  • 索引的使用,在没有索引时SQL语句会发生全表扫描进而降低速度,大规模表应避免全表扫描,而小型表则可以删除索引以释放空间,一般被作为索引的数据有:主键字段、外键字段、结合表中常用字段、查询中常用条件字段、大部分值唯一字段;
  • 其他性能优化,使用LIKE操作符和通配符、避免使用OR操作符(可使用IN)、避免HAVING子句、避免大规模排序操作(排序操作会保存到内存或磁盘中从而影响效率)、使用存储过程;

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

目前有 2 条留言 其中:访客:1 条, 博主:1 条

  1. simon : 2014年10月24日08:51:58  -49楼 @回复 回复

    好文mark,鸟总V5 ^_^


    • 管理员
      大河笨鸟 : 2014年10月24日09:33:25  地下1层 @回复 回复

      恭迎孙总驾临~

给我留言

留言无头像?