MySQL 极速指南 1——标准 SQL 语句

可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。DML 主要用于查询和更新;DDL 使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

查询和更新指令构成了 SQL 的 DML 部分:

  • SELECT – 从数据库表中获取数据
  • UPDATE – 更新数据库表中的数据
  • DELETE – 从数据库表中删除数据
  • INSERT INTO – 向数据库表中插入数据

DDL 语句:

  • CREATE DATABASE – 创建新数据库
  • CREATE TABLE – 创建新表
  • CREATE INDEX – 创建索引(搜索键)
  • ALTER DATABASE – 修改数据库
  • ALTER TABLE – 变更(改变)数据库表
  • DROP TABLE – 删除表
  • DROP INDEX – 删除索引

|ID|Lastname|Firstname|Address|City |
|–|
|01|Adams| John| Oxford Street| London
|02|Bush| George| Fifth Avenue| New York
|03|Carter| Thomas| Changan Street| Beijing
|04|Carter| William| Xuanwumen 10| Beijing

数据操作指令 DML

Select

  • distinct 返回不同的值
SELECT DISTINCT Firstname FROM Person #选中Firstname中的不同的值    
  • Top子句,用来限制返回的数据条数,对于与表中数据行数很多的时候特别有用
SELECT TOP 2 * FROM Person    #返回表中的前两行数据 
SELECT TOP 30 PERCENT * FROM Person #返回表中前30%的数据行  
  • select into 复制表
SELECT * INTO Persons_backup FROM Persons
SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
  • WHERE

|操作符|描述|
|–|
|= |等于|
|<>或者!= |不等于
|> |大于
|< |小于
|>=| 大于等于
|<= |小于等于
|BETWEEN| 在某个范围内
|LIKE| 搜索某种模式

SELEECT * FROM Person WHERE City LIKE '%lon%'   #City列里包含字符串lon的行    
SELEECT * FROM Person WHERE City LIKE 'lon%'    #City列里最前面是字符串lon的行
SELEECT * FROM Person WHERE City NOT LIKE 'lon%'    #City列里没有字符串lon的行

通配符不止有%(通配一个或多个字符)还有_(一个字符),[charlist](在charlist字符列中的任一单字),[^charlist]或者[!charlist](不在字符列中的任一单字),参看正则表达式。

SELEECT * FROM Person WHERE City LIKE 'londo_'  #City列里除最后一个字符以外是londo的行  
SELEECT * FROM Person WHERE City LIKE '[lnb]%'   #City列里以l或n或b开头的行 
SELEECT * FROM Person WHERE City LIKE '[^lnb]%'   #City列里不以l或n或b开头的行 
  • WHERE…IN (,)操作符|筛选出WHERE指定的列中IN中含有的值
SELEECT * FROM Person WHERE City IN ('london','new york') #City列里的值为london或者new york的行
  • WHERE…BETWEEN value1 AND value2 操作符|筛选出WHERE指定的列中从value1(包含)到value2(不包含)的行
    不同的数据库这种包含关系是不一样的,具体要看使用哪种数据库
SELEECT * FROM Person WHERE City BETWEEN london AND beijing  #返回下表

|ID|Lastname|Firstname|Address|City |
|–|
|01|Adams| John| Oxford Street| London
|02|Bush| George| Fifth Avenue| New York

  • as
    别名,select lastname as la from table_a

INSERT INTO…VALUES…

INSERT INTO Person (Lastname,Firstname) VALUES (value1,value2)

UPDATE…SET…

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 

DELETE

DELETE FROM Person WHERE LastName = 'Wilson'    

结构指令DDL:

  1. CREATE DATABASE
  2. CREATE TABLE
  3. ALTER DATABASE
  4. ALTER TABLE
    ALTER TABLE 用于更改原有表的结构。例如,您可以增加或删减列,创建或取消索引,更改原有列的类型,或重新命名列或表。您还可以更改表的评注和表的类型。您可以在一个ALTER TABLE语句里写入多个ADD, ALTER, DROP和CHANGE子句,中间用逗号分开。这是MySQL相对于标准SQL的扩展。在标准SQL中,每个ALTER TABLE语句中每个子句只允许使用一次。 要使用ALTER TABLE,您需要获得表的ALTER, INSERT和CREATE权限。
/*在表Persons中添加Birthday列,数据类型为int,date,str;改变Birthday列的数据类型为year*/    
ALTER TABLE Persons ADD Birthday datatype(int,date,str),ALTER COLUMN Birthday year;

改变一个表的默认字符集:
ALTER TABLE tbl_name DEFAULT CHARACTER SET utf-8;

  1. DROP TABLE
  2. CREATE INDEX
  3. DROP INDEX

join 链接

用于将两个表链接显示多个表的结果
现在有另外一个表Order:

Id_OOrderNoID
1778953
2446783
3224561
53476465

ID是外键,链接了两个表。现找出谁订购了产品,订购了哪些产品

SELECT Person.Lastname,Person.Firstname,Order.OrderNO FROM Person,Order WHERE Person.ID=Order.ID

返回结果:

LastName| FirstName| OrderNo
—-|
Adams| John| 22456
Adams| John| 24562
Carter| Thomas |77895
Carter| Thomas| 44678

  • .JOIN: 如果表中有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行
    上述返回还可以通过下面的JOIN表示法表示:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders(FULL JOIN Orders,LEFT JOIN Orders,RIGHT JOIN Orders)
ON Persons.ID = Orders.ID
ORDER BY Persons.LastName

union

返回多个表的值

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

函数

  • group by
  • having 跟 group by 配套使用,代替 where 用法
  • ucase 大写
  • lcase 小写
  • mid 提取部分字符串

索引 (index)

索引是表中一列或多列数据和指向这些数据页的逻辑指针清单。创建索引时,将这些数据这些排序,用关联的指针直接定位要查找的值,从而提升了查询速度。 所以索引的创建是为数据库的执行速度和性能服务的,他具体的好处有:

  1. 加速数据的检索速度
  2. 创建唯一性索引能保证数据库表中每一行数据的唯一性
  3. 加速表之间的连接速度
  4. 加快分组和排序的速度

由于索引的创建要消耗物理空间,所以过多的索引会引出如下问题:

  1. 占据空间
  2. 反而会降低增删改查的速度,同时数据改变的时候,因为他要更新关联的索引,也会影响性能
CREATE INDEX PersonIndex    #在person表的LastName,Fistname列创建索引,以Lastname降序排序
ON Person (Lastname DESC,Firstname)     

DROP INDEX Person.PersonIndex  #删除索引

视图(views)

视图就是一个虚拟的表,其内容由查询定义。对表能够进行的一般操作(增删改查)都可以应用于视图。 视图内其实没有存储任何数据,它只是对表的一个查询。

优点:

  1. 安全,提供了另外一种级别的表安全性
  2. 虚拟,隐藏的数据的复杂性
  3. 简化,简化的用户的SQL命令
  4. 重命名,通过重命名列,从另一个角度提供数据
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

存储过程(Stored Procedure)

是一组为了完成特定功能的SQL语句集,由流控制和SQL语句书写构成。

优点:

  1. 加快执行速度。存储过程只在创建时编译,而sql语句每次执行都要编译
  2. 可以重复使用
  3. 安全性高,可设定使用权。
    原文作者:和牛
    原文地址: https://www.jianshu.com/p/e7efbe977512
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞