SHOW STATUS,用于显示广泛的服务器状态信息;
SHOW CREATE DATABASE和SHOW CREATE TABLE,分别用来显示创 建特定数据库或表的MySQL语句;
SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;
SHOW ERRORS和SHOW WARNINGS,用来显示服务器错误或警告消息。
检索数据
SELECT DISTINCT COLUMN FROM TABLE_NAME 检索出列中出现的不同数值的数据(列中的数据不重复)
不能部分使用DISTINCT
如:
SELECT DISTINCT COLUMN_1, COLUMN_2 FROM TABLE_NAME 是不行的, 除非指定的两个列都不同,否则所有的行都被检索出来
SELECT COLUMN_NAME FROM TABLE_NAME LIMIT NUM; 指示SQL返回多少行的数据(不多于NUM行)
SELECT COLUMN_NAME FROM TABLE_NAME LIMIT NUM1, NUM2; NUM1-- > 从第NUM1+1行开始 (因为数据库是从0开始的)
NUM2 --> 取多少行
排序
SELECT COLUMN1 ,COLUMN2, … FROM TABLE_NAME ORDER BY COULUMN1, COLUMN2;
先按照COLUMN1排列,如果COLUMN1一样的话就按照COLUMN2排列
降序排列
SELECT COLUMN1 ,COLUMN2, … FROM TABLE_NAME ORDER BY COULUMN1, COLUMN2,
DESC;
BETWEEN操作符
SELECT COLUMNS FROM TABLE_NAME WHERE COLUMN BETWEEN START_NUM AND END_NUM 检索位于两个值之间的列
检索空值
SELECT COLUMNS FROM TABLE_NAME WHERE COLUMN IS NULL;
检索某个列为空时的数据
AND 用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
SELECT COLUMNS FROM TABLE_NAME WHERE COLUMN1 CONDITION1 AND COLUMN2 CONDITION2
OR指示MYSQL检索匹配任一条件的行
SELECT COLUMNS FROM TABLE_NAME WHERE COLUMNS CONDITION1 OR COLUMN2 CONDITION2;
MYSQL在进行OR和AND操作符的运算时,优先计算AND,如果想要实现OR先进行运算的话,就需要加上()
IN操作符
SELECT COLUMNS FROM TABLE_NAME WHERE COLUMN IN (CONDICTION)
NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
通配符
最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数
SELECT * FROM TABLE_NAME WHERE COLUMN LIKE ‘XXX%’; 检索以XXX开头的数据,不管它后面有多少个数据,都适用。
下划线(_)通配符
下划线通配符只匹配单个字符而不是多个字符
SELECT * FROM TABLE_NAME WHERE COLUMN LIKE ‘_XXX’;
正则 REGEXP
SELECT * FORM TABLE_NAME WHERE COLUMN REGEXP ‘XXX’ 寻找列值中含有XXX的数据
LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用 通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一 个非常重要的差别。
使用^和$定位符可以使REGEXP实现LIKE的效果
|为正则表达式的OR操作 符。它表示匹配其中之一
SELECT prod_name
FROM products
WHERE proc_price
REGEXP ’ 1000|2000|3000’ ORDER BY price_name
;
字符集合被否定:
在集合的开始处放置一个^即可。因此,尽管[123] 匹配字符1、2或3,但[^123]却匹配除这些字符外的任何东西。 (在PYTHON中,”"是表示行首,‘[]’用于标示一组字符,如果是第一个字符,则标示的是一个补集。比如[0-9]表示所有的数字,[^0-9]表示除了数字外的字符。)
正则表达式
\([0-9] sticks?\)需要解说一下。\(匹配), [0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick 和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出 现) ,\)匹配)。没有?,匹配stick和sticks会非常困难
Concat连接 拼接字段
SELECT CONCAT(vend_name
, ‘(’, vend_country
, ‘)’) FROM vendors
ORDER BY vend_name
;
Concat()需要一个或多个指定的串,各个串之间用逗号分隔。
去除字段中的空格(LTRIM 去除左边的空格 ; RTRIM 去除右边的空格 ; TRIM 去除两端的空格
SELECT CONCAT(RTRIM(vend_name
), ’ (’, RTRIM(vend_country
), ‘)’) FROM vendors
ORDER BY vend_name
;
检索日期在某个时间段内的字段
SELECT cust_id
, order_num
FROM orders
WHERE YEAR(order_date
) = “2005” AND MONTH(order_date
) = “09”;
GROUP BY 分组
SELECT vend_id
, COUNT(*) AS num_prod
FROM products
GROUP BY vend_id
;
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
WITH ROLLUP 对分组的数目进行汇总
SELECT vend_id
, COUNT(*) AS num_prod
FROM products
GROUP BY vend_id
WITH ROLLUP;
HAVING : 对数据分组后进行过滤
HAVING和WHERE的差别 这里有另一种理解方法,WHERE在数据 分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重 要的区别,WHERE排除的行不包括在分组中。这可能会改变计 算值,从而影响HAVING子句中基于这些值过滤掉的分组
SELECT vend_id
, COUNT() AS num_prod
FROM products
WHERE prod_price
>= 10 GROUP BY vend_id
HAVING COUNT() > 2;
GROUP BY (分组) ------> HAVING(过滤组) --------> ORDER BY(排序后输出)
SELECT COLUMN 聚集函数() FROM TABLE_NAME WHERE COLUMN CONDITION GROUP BY COLUMN HAVING 聚集函数()CONDITION ORDER BY COLUMN | 聚集函数()
输出按某个列进行条件过滤、汇总后的分组并排序
全文本搜索
Match()指定被搜索的列,Against()指定要使用的搜索表达式。
MyISAM支持全文本搜索,InnoDB不支持
SELECT note_text FROM productnotes WHERE MATCH(note_text) AGAINST(‘rabbit’);
全文本扩展搜索
SELECT note_text
FROM productnotes WHERE MATCH(note_text
)AGAINST(‘anvils’ WITH QUERY EXPANSION);
联结
SELECT
vend_name
,
prod_name
,
prod_price
FROM
vendors
INNER JOIN products
ON vendors.vend_id = products.vend_id
UNION规则
UNION必须由两条或两条以上的SELECT语句组成,语句之间用关 键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个 UNION关键字)
UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以 隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
UNION 会自动取消查询结果中重复的行,如果想要将重复的行也一起查询出来的话,可以使用UNION ALL
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 UNION SELECT vend_id, prod_id, prod_price FROM products WHERE
vend_id IN(1001, 1002) ORDER BY vend_id, prod_price;
查询语句的执行顺序:
FROM --> ON --> (JOIN_TYPE) JOIN --> WHERE --> GROUP BY --> HAVING – > SELECT --> DISTINCT --> ORDER BY --> LIMIT
首先,执行FROM语句,如果是两个表,则使用笛卡尔积得到一个虚拟表VT1.
第二步, 执行ON语句,执行万能FROM语句后,ON语句在VT1的基础上进行过滤,根据ON中的条件将符合的信息筛选出来,得到VT2,此时的VT2是 INNER JOIN的数据。
第三步,添加外部行。如果是OUTER JOIN的语句,需要在执行完ON语句后,保留左表(或右表),将左表(或右表)的数据全部查询出来,若右表(或左表)没有对应的数据就为NULL,此时为VT3
第四步:执行WHERE 语句。按照WHERE 中的条件从VT2(INNER JOIN) 或者VT3(OUTER JOIN)中将符合条件的信息查询出来,得到虚拟表VT4
第五步:执行GROUP BY 语句,将VT4中的数据进行分组。得到虚拟表VT5
第六步:执行HAVING语句。将VT5中的数据进行过滤,得到虚拟表VT6
第七步:执行SELECT 语句,从VT6中查询出所需要的数据,得到VT7。
第八步:执行DISTINCT 语句,对VT7中的数据进行过滤,得到VT8
第九步: 执行ORDER BY 语句,得到VT9
第十步:执行LIMIT语句,按需求从VT9中输出数据
COUNT()、 COUNT(列名)、COUNT(1)
COUNT(1)和COUNT()都 会返回所有存在的行的总数包括NULL行
COUNT(*) 中SQL会自动帮你完成优化,全表查询
COUNT(列名)会返回表格中除去NULL以外的所有行的总数(有默认值的列也被计入)