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子句、避免大规模排序操作(排序操作会保存到内存或磁盘中从而影响效率)、使用存储过程;