ENGINE 存储引擎: MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能
常用以下两种:ENGINE=MyISAM 或 ENGINE=InnoDB
- MyISAM:管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。适于并发情况下,对读取速度要求比较快的应用。
- InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。适于大尺寸写多读少的应用中。
Tips:
1. 最初连接到mqsql时,没有任何数据库打开供使用,在执行任意数据库操作前,需要选择一个数据库:
use mysql:
SELECT * FROM products;
必须使用 use 打开数据库,才能读取其中的数据。
2.DISTINCT 检索不同的行。
返回不同的值(过滤重复值),应用于所有列而不仅是前置它的列。但是应用多个列时,所有行都将被检索出来。
3.LIMIT 限制结果
#返回从第一行开始的5行 vend_id,这里的第一行指 行0 而不是 行1
SELECT vend_id FROM products LIMIT 5;
#返回从第5行(行4)开始的6行
SELECT vend_id FROM products LIMIT 4,6;
这里的第一行指 行0 而不是 行1
4. ORDER BY 排序检索数据
order by 子句可以取1个或多个列的名字
1)当使用多个列对结果进行排序时,首先按选择的第一个 列A 进行排序,仅在多个行具有相同的A值时,才对产品按 列B 排序; 如果列A中所有的值是唯一的,则不会按 列B 排序
2)默认升序,升序的关键字是 ASC。要使用降序排列,须制定关键字 DESC
SELECT prod_id,prod_price,prod_name
FROM products ORDER BY prod_price DESC,prod_name;
DESC 关键字只应用到直接位于其前面的列名,如果想在多个列上进行降序排列,必须对每个列制定 DESC 关键字。
5. LIMIT 关键字位于 ORDER BY 之后,ORDER BY 位于 WHERE 之后。
6. NULL无值
与字段包含0、空字符串、仅仅包含空格不同。
空值检查:不用 = ,用 is
SELECT prod_name FROM products WHERE prod_price IS NULL;
7.WHERE 过滤数据
1)AND 检索满足所有给定的条件
2)OR 检索匹配任意条件的行
WHERE 可以包含任意数目的 AND 和 OR 操作符,允许两者结合以进行复杂和高级的过滤,但应该使用圆括号明确的分组操作符,以避免因操作副优先级带来的问题。
3)IN 指定条件范围。IN操作符可以包含 SELECT 语句
SELECT prod_id,prod_price,prod_name
FROM products WHERE vend_id IN (1002,1003)
ORDER BY prod_price;
SELECT prod_id,prod_price,prod_name
FROM products WHERE vend_id=1002 OR vend_id=1003
ORDER BY prod_price;
以上两句都是要选择出供应商1002和1003制造的所有产品。
4)NOT 否定not关键词之后所跟的任何条件
SELECT prod_name FROM products WHERE prod_price IS NOT NULL;
8. 通配符
使用通配符,必须是要LIKE操作符。
LIKE 指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
1)百分号%,表示任何字符出现任何次数,可在搜索模式中任意位置使用,并且可以使用多个。
%匹配给定位置的0个、1个、多个字符
2)下划线_, 只匹配单个字符而不是多个字符。
SELECT prod_id,prod_name FROM products
WHERE prod_name LIKE 'jet%';
9.正则表达式 REGEXP
SELECT prod_name FROM products
WHERE PROD_NAME REGEXP '1000'
ORDER BY prod_name;
使用 REGEXP检索列prod_name 包含文本1000的行。
SELECT prod_name FROM products
WHERE PROD_NAME LIKE '1000'
ORDER BY prod_name;
使用 LIKE 检索列 prod_name 值为1000的行。
- LIKE与 REGEXP区别在于:LIKE 匹配整个列,REGEXP 在列值内匹配
REGEXP 1)使用 | 进行 OR 匹配; 检索出prod_name中包含 1或2或3的行
SELECT prod_name FROM products
WHERE prod_name REGEXP '1|2|3';
2)使用 [ ] 匹配任何单一字符; 检索出 prod_name 中包含 1 Ton 或 2 Ton 或 3 Ton 的行
[ ] 是另一种形式的OR
SELECT prod_name FROM products
WHERE prod_name REGEXP '[123] Ton';
[123] Ton是 [1|2|3] Ton 的缩写
3)使用 ^ 否定集合; [^123]是匹配出123这些字符外的数据。
^在集合中,用来否定该集合。否则,用来指串的开始处。
4)使用-定义一个范围; [1-5] 匹配1到5
SELECT prod_name FROM products
WHERE prod_name REGEXP '[1-5] Ton';
5)使用\\为前导来匹配特殊字符;即转义
10.函数
MySQL使用 Concat( )函数拼接串,即把多个传连接起来形成一个较长的串。
Concat( ) 需要一个或多个指定的串,各个串之间用逗号分隔。
RTrim( ) 函数去掉值右边的所有空格
LTrim( ) 函数去掉左边的所有空格
Trim( ) 函数去掉串左右两边的空格
Now( ) 函数返回当前日期和时间:SELECT Now();
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')')
FROM vendors
ORDER BY vend_name;
11.别名
使用 AS 关键字赋予别名。
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title
FROM vendors
ORDER BY vend_name;
将及那个过计算得到的数据赋予到列名为 ‘vend_title’ 的新列。
12.日期和时间
函数:
Year( ) 返回一个日期的年份部分
Date( ) 返回一个日期时间的日期部分
Time( ) 返回一个日期时间的时间部分
Now( ) 返回当前的日期和时间
SELECT cust_id,order_num FROM orders
WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
Note:日期勿忘使用单引号 ‘ ’
13.数据挖掘公式常用的数值处理函数
函 数 | 说 明 |
---|---|
Abs( ) | 返回一个数的绝对值 |
Exp( ) | 返回一个数的指数值 |
Rand( ) | 返回一个随机数 |
Sqrt( ) | 返回一个数的平方根 |
Mod( ) | 返回除操作的余数 |
14.SQL 聚集函数
函 数 | 说 明 |
---|---|
AVG( ) | 返回某列的平均值 |
COUNT( ) | 返回某列的行数 |
MAX( ) | 返回某列的最大值 |
MIN( ) | 返回某列的最小值 |
SUM( ) | 返回某列值之和 |
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
AVG(prod_price) AS price_avg
FROM products;
注释 SQL 语句
单行注释: -- (双减号)
多行注释:/* ... */