一、LIMIT
- 从 “Websites” 表中选取头两条记录
SELECT * FROM Websites LIMIT 2;
二、LIKE
- 选取 name 以字母 “G” 开始的所有客户
SELECT * FROM Websites WHERE name LIKE 'G%';
- 通过使用 NOT 关键字,您可以选取不匹配模式的记录。
下面的 SQL 语句选取 name 不包含模式 “oo” 的所有客户:
三、通配符
通配符 | 描述 |
---|---|
% | 替代 0 个或多个字符 |
_ | 替代 1 个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或[!charlist] | 不在字符列中的任何单一字符 |
- MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
下面的 SQL 语句选取 name 以 “G”、“F” 或 “s” 开始的所有网站:
SELECT * FROM Websites WHERE name RLIKE '^[FGs]';
- 选取 name 以 A 到 H 字母开头的网站
- 不以A-H开头
四、IN
1. 选取 name 为 “Google” 或 “菜鸟教程” 的所有网站:
五、BETWEEN
- 选取 alexa 介于 1 和 20 之间的所有网站
SELECT * FROM Websites WHERE alexa BETWEEN 1 AND 20;
- 选取 alexa 介于 1 和 20 之间但 country 不为 USA 和 IND 的所有网站
- 选取 name 以介于 ‘A’ 和 ‘H’ 之间字母开始的所有网站
- 选取 name 不介于 ‘A’ 和 ‘H’ 之间字母开始的所有网站
- date 介于 ‘2016-05-10’ 和 ‘2016-05-14’ 之间的所有访问记录:
六、别名
- 指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。提示:如果列名称包含空格,要求使用双引号或方括号:
SELECT name AS n,country AS c FROM Websites;
- 把三个列(url、alexa 和 country)结合在一起,并创建一个名为 “site_info” 的别名:
- 指定表别名 “w” 和 “a”(通过使用别名让 SQL 更简短):
select w.name, w.url, a.count, a.date from Websites AS w,access_log AS a WHERE a.site_id=w.id and w.name='菜鸟教程';
七、JOIN
“Websites” 表中的 “id” 列指向 “access_log” 表中的字段 “site_id”。上面这两个表是通过 “site_id” 列联系起来的。
-
INNER JOIN 关键字在表中存在至少一个匹配时返回行,INNER JOIN 与 JOIN 是相同的。
INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 “Websites” 表中的行在 “access_log” 中没有匹配,则不会列出这些行 -
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
返回所有网站及他们的访问量(如果有的话)。
以下实例中我们把 Websites 作为左表,access_log 作为右表:
select w.name,a.count,a.date from Websites AS w LEFT JOIN access_log AS a ON w.id=a.site_id ORDER BY a.count DESC;
LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。 -
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
RIGHT JOIN 关键字从右表(Websites)返回所有的行,即使左表(access_log)中没有匹配。 -
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.
FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
MySQL中不支持 FULL OUTER JOIN
八、UNION
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
- 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
- UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
- 从 “Websites” 和 “apps” 表中选取所有不同的country(只有不同的值):
select country from Websites union select country from apps;
- 使用 UNION ALL 从 “Websites” 和 “apps” 表中选取所有的country(也有重复的值):
- 使用 UNION ALL 从 “Websites” 和 “apps” 表中选取所有的中国(CN)的数据(也有重复的值)
select country,name from Websites where country='CN' union all select country,app_name from apps where country='CN' order by country;
九、INSERT INTO SELECT
我们可以从一个表中复制所有的列插入到另一个已存在的表中:
INSERT INTO table2
SELECT * FROM table1;
或者我们可以只复制希望的列插入到另一个已存在的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
十、CHECK 约束
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
- 在 “Persons” 表创建时在 “P_Id” 列上创建 CHECK 约束。CHECK 约束规定 “P_Id” 列必须只包含大于 0 的整数。
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CHECK (P_Id>0) )
- 如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes') )
- 当表已被创建时,如需在 “P_Id” 列创建 CHECK 约束,请使用下面的 SQL
ALTER TABLE Persons ADD CHECK (P_Id>0)
- 如需命名 CHECK 约束,并定义多个列的 CHECK 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
- 如需撤销 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons DROP CHECK chk_Person
十一、DEFAULT 约束
- 下面的 SQL 在 “Persons” 表创建时在 “City” 列上创建 DEFAULT 约束
CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) DEFAULT 'Sandnes' )
- 通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders ( O_Id int NOT NULL, OrderNo int NOT NULL, P_Id int, OrderDate date DEFAULT GETDATE() )
- 当表已被创建时,如需在 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
- 撤销 DEFAULT 约束,请使用下面的 SQL:
ALTER TABLE Persons ALTER City DROP DEFAULT
十二、索引 CREATE INDEX
- 在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name ON table_name (column_name)
- 在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值。
Creates a unique index on a table. Duplicate values are not allowed: CREATE UNIQUE INDEX index_name ON table_name (column_name)
希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开
十三、撤销索引、撤销表以及撤销数据库
- DROP INDEX 语句用于删除表中的索引。
ALTER TABLE table_name DROP INDEX index_name
- DROP TABLE 语句用于删除表。
DROP TABLE table_name
- DROP DATABASE 语句用于删除数据库。
DROP DATABASE database_name
- 如果我们仅仅需要删除表内的数据,但并不删除表本身,那么我们该如何做呢?请使用 TRUNCATE TABLE 语句:
TRUNCATE TABLE table_name
十四、ALTER TABLE
- 在 “Persons” 表中添加一个名为 “DateOfBirth” 的列。
我们使用下面的 SQL 语句:
ALTER TABLE Persons ADD DateOfBirth date
- 改变 “Persons” 表中 “DateOfBirth” 列的数据类型。
我们使用下面的 SQL 语句:
alter table Persons modify column DateOFBirth year;
- 删除 “Person” 表中的 “DateOfBirth” 列。我们使用下面的 SQL 语句:
ALTER TABLE Persons DROP COLUMN DateOfBirth
十五、AUTO INCREMENT
-
把 “Persons” 表中的 “ID” 列定义为 auto-increment 主键字段:
CREATE TABLE Persons ( ID int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (ID) )
默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下面的 SQL 语法:ALTER TABLE Persons AUTO_INCREMENT=100
十六、视图
1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。
2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)
3、从而加强了安全性,使用户只能看到视图所显示的数据。
4、视图还可以被嵌套,一个视图中可以嵌套另一个视图。
- 创建
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
- 更新
CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
- 删除
DROP VIEW view_name
十七、Date函数
- MySQL 中最重要的内建日期函数:
NOW() 返回当前的日期和时间
CURDATE() 返回当前的日期
CURTIME() 返回当前的时间
DATE() 提取日期或日期/时间表达式的日期部分
EXTRACT() 返回日期/时间的单独部分
DATE_ADD() 向日期添加指定的时间间隔
DATE_SUB() 从日期减去指定的时间间隔
DATEDIFF() 返回两个日期之间的天数
DATE_FORMAT() 用不同的格式显示日期/时间
- MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
YEAR - 格式:YYYY 或 YY
十八、NULL
无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>。
我们必须使用 IS NULL 和 IS NOT NULL 操作符。
- 在 MySQL 中,我们可以使用 IFNULL() 函数,如下所示:
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products
- 或者我们可以使用 COALESCE() 函数,如下所示:
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products
十九、MySQL 数据类型
1. Text 类型:
- CHAR(size) 保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
- VARCHAR(size) 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。
- TINYTEXT 存放最大长度为 255 个字符的字符串。
- TEXT 存放最大长度为 65,535 个字符的字符串。
- BLOB 用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。
- MEDIUMTEXT 存放最大长度为 16,777,215 个字符的字符串。
- MEDIUMBLOB 用于 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字节的数据。
- LONGTEXT 存放最大长度为 4,294,967,295 个字符的字符串。
- LONGBLOB 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
- ENUM(x,y,z,etc.) 允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。
注释:这些值是按照您输入的顺序排序的。
可以按照此格式输入可能的值: ENUM(‘X’,‘Y’,‘Z’) - SET 与 ENUM 类似,不同的是,SET 最多只能包含 64 个列表项且 SET 可存储一个以上的选择。
2. Number 类型:
- TINYINT(size) 带符号-128到127 ,无符号0到255。
- MALLINT(size) 带符号范围-32768到32767,无符号0到65535, size 默认为 6。
- MEDIUMINT(size) 带符号范围-8388608到8388607,无符号的范围是0到16777215。 size 默认为9
- INT(size) 带符号范围-2147483648到2147483647,无符号的范围是0到4294967295。 size 默认为 11
- BIGINT(size) 带符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。size 默认为 20
- FLOAT(size,d) 带有浮动小数点的小数字。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。
- DOUBLE(size,d) 带有浮动小数点的大数字。在 size 参数中规显示定最大位数。在 d 参数中规定小数点右侧的最大位数。
- DECIMAL(size,d) 作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。
以上的 size 代表的并不是存储在数据库中的具体的长度,如 int(4) 并不是只能存储4个长度的数字。
实际上int(size)所占多少存储空间并无任何关系。int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。就是在显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
例如:
1、int的值为10 (指定zerofill)
int(9)显示结果为000000010
int(3)显示结果为010
就是显示的长度不一样而已 都是占用四个字节的空间
3. Date 类型:
- DATE() 日期。格式:YYYY-MM-DD
注释:支持的范围是从 ‘1000-01-01’ 到 ‘9999-12-31’ - DATETIME() *日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ - TIMESTAMP() *时间戳。TIMESTAMP 值使用 Unix 纪元(‘1970-01-01 00:00:00’ UTC) 至今的秒数来存储。格式:YYYY-MM-DD HH:MM:SS
注释:支持的范围是从 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09 03:14:07’ UTC - TIME() 时间。格式:HH:MM:SS
注释:支持的范围是从 ‘-838:59:59’ 到 ‘838:59:59’
即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。