SHOW语句
显示表列:
SHOW COLUMNS FROM customers;
它对每个字段返回一行,行中包含字段名、数据类型、是狗允许NULL、键信息、默认值以及其他信息。
ps:mysql支持DESCRIBE作为 的一种快捷方式。(DESCRIBE customers;)
所支持的其他SHOW语句:
SHOW STATUS,用于显示广泛的服务器状态信息;
SHOW CREATE DATABASE和SHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;
SHOW GRANTS,用来显示授予用户(所有用户或特定用户)的安全权限;
SHOW ERRORS和SHOW WARNINGS,用来显示服务器错误或警告消息。
SELECT语句
检索单个列:
SELECT pord_name FROM products;
检索多个列:
SELECT prod_id,prod_name,prod_price FROM products;
检索所有列:
SELECT * FROM products;
检索不同的行:
SELECT DISTINCT vend_id FROM products;
DISTINCT告诉MySQL只返回唯一的vend_id行。如果使用DISTINCT关键字,它必须直接放在列名的前面。
DISTINCT关键字应用与所有列而不仅是前置它的列。
限制结果:
SELECT prod_name FROM products LIMIT 5;
为了返回第一行或前几行数据,可使用LIMIT子句。此句为返回前5行数据。
同时可指定要检索的开始行和行数,如下:
SELECT prod_name FROM products LIMIT 5,5;
此句为返回第六到第十条数据。
ps:检索出来的第一行为0而不是1。
使用完全限定的表名:
SELECT product.prod_name FROM products;
ps:关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。
为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出的数据进行排序。
按列排序:
SELECT prod_name FROM products ORDER BY prod_name;
ps:通常,ORDER BY子句中使用的列是为显示的列。但是用为检索的列排序是完全合法的。
按多个列排序:
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;
指定排序方向:
默认排序为升序排序,可指定DESC关键字为降序。
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;
ps:DESC关键字只应用到直接位于启前面的列名。
最大最小值:
使用OREDER BY和LIMIT的组合,能够找出一个列中最高或最低的值。
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
WHERE子句
数据库一般包含大量的数据,很少需要检索表中所有行。通常只会根据特定操作或报表的需要提取表数据的子集。
只检索所需数据需要指定搜索条件,搜索条件也称为过滤条件。
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表明(FROM子句)之后给出。
SELECT prod_name ,prod_price FROM products WHERE prod_price = 2.50;
这个例子用了简单的相等测试,它检查一个列是否具有指定的值,据此进行过滤。
ps:数据也可在应用层进行过滤。通常,这种实现并不令人满意。因此,对数据库进行了优化,以便快捷有效地对数据进行过滤。让客户机应用(或开发语言)处理数据库的工作将会极大的影响应用的性能,影响用户体验。此外,如果在客户机上过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络宽带的浪费。
WHERE子句的位置:在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。
WHERE子句操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN | 在指定的两个值之间 |
例子:
SELECT prod_name,prod_price FROM products WHERE prod_name = 'fuses';
SELECT prod_name,prod_price FROM products WHERE prod_price <=10;
ps:单引号用来限定字符串,如果将值与串类型的列进行比较,则需要限定引号。
范围值检查:
为了检查某个范围的值,可使用BETWEEN操作符。
SELECT prod_name,prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查:
NULL 无值,它与字段包含0、空字符串或仅仅包含空格不同。
SELECT prod_name FROM products WHERE prod_price IS NULL;
NULL与不匹配:
在通过过滤选择出不具有特定值的行时,不会返回具有NULL值的行。因为未知具有特殊含义,数据库不知道它们是否匹配,所以不返回他们。
组合 WHERE子句
AND操作符:
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price<=10;
AND 用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
OR操作符:
SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;
OR WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行。
计算次序:WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。
SQL像多数语言一样,在处理OR操作符qian,优先处理AND操作符。可用圆括号明确地分组相应的操作符。
IN操作符:
SELECT prod_name,prod_price FROM products WHERE vend_id IN(1002,1003) ORDER BY prod_name;
IN WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。
为什么要使用IN操作符?
-
在使用长的合法选项清单时,IN操作符的语法更清楚且直观。
-
在使用IN时,计算的次序更容易管理(因为使用的操作符更少)
-
IN操作符一般比OR操作符清单执行更快。
-
IN最大的优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。
NOT操作符:
WHERE子句中用来否定后跟条件的关键字。
LIKE操作符
通配符:用来匹配值的一部分的特殊字符。为在搜索子句中使用通配符,必须使用LIKE操作符。
LIKE指示MySQL利用通配符匹配而不是直接相等匹配进行比较。
通配符 | 含义 |
---|---|
% | 表示任何字符出现任意次数 |
_ | 匹配任意单个字符 |
通配符许多时候是很有用的。但是通配符搜索的处理一般比其他搜索所花时间更长。
-
不要过度使用通配符。如果其他操作符也能达到同样目的,应该使用其他操作符。
-
在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。十分影响效率。
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE ‘_ ton anvil’;
PS: 通配符不会匹配到NULL
正则表达式
正则表达式是用来匹配文本的特殊的串。
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
REGEXP:它告诉MySQL,REGEXP后所跟的东西作为正则表达式。
MySQL中的正则表达式匹配不区分大小写。为区分大小写,可使用BINARY关键字。
进行OR匹配:为搜索两个串之一,使用|字符。
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
匹配几个字符之一:
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] ton' ORDER BY prod_name;
这里的正则表达式[123]的意思是匹配1或2或3。所以总体来说就是匹配1 ton或2 ton或3 ton。
[123]即为[1|2|3]的缩写。
字符集也可被否定。需要通过^来完成。[^123]表示匹配除这些字符外的任何东西。
匹配特殊字符:为了匹配特殊字符,必须使用\\为前导。\\-表示-,\\.表示.。
计算字段
拼接字段:
将值链接到一起构成单个值。在MySQL的SELCT语句中,可使用Concat()函数来拼接两个列。
SELECT Concat(vend_name,' (',vend_country,')') FROM vendors ORDER BY vend_name;
删除空格:删除数据右侧多余空格,使用MySQL的RTrim()函数来完成:
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') FROM vendors ORDER BY vend_name;
ps:使用Concat()可以很好的拼接字段,但是拼接的字段并不像本身存在的列一样有专属的名字,如果传给客户机则让客户机程序无法引用,SQL使用别名来解决上述问题。
别名:
别名使用AS关键字赋予。
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_country),')') AS vend_title FROM vendors ORDER BY vend_name;
算术计算:
SELECT prod_id,quantity,item_price,quantity*item_price AS expande_price FROM orderitems WHERE order_num = 20005;
结果显示的expande_price列是quantity*item_price计算结果的别名字段。
MySQL支持基本的"+,-,*,/"算术操作符。
数据处理函数
SQL支持利用函数来处理数据。
文本处理函数:
函数 | 说明 |
---|---|
Left() | 返回串左边的字符 |
Length() | 返回串的长度 |
Locate() | 找出串的一个子串 |
Lower() | 将串转换为小写 |
LTrim() | 去掉串左边的空格 |
Right() | 返回串右边的字符 |
RTrim() | 去掉串右边的字符 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
Upper() | 将串转为大写 |
例:SELECT vend_name,Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;
ps:Soundex()考虑了类似的发音字符和音节,是的能对串进行发音比较而不是字母比较。
例:SELECT cust_name,cust_contact FROM customers WHERE Soundex(cust_contace) = Soundex(‘Y Lie’);
日期和时间处理函数:
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(天,周等) |
AddTime() | 增加一个时间(时,分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DatOfWeek() | 对于一个日期,返回对应的星期几 |
Hour() | 返回一个时间的小时部分 |
Minute() | 返回一个时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回一个时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
在WHERE匹配中,如果只想与数据库内数据比较日期的话,需要先使用Date()函数将数据库内日期时间转为日期再比较,就算相应的列只含日期,使用Date()函数依然是个好习惯。
SELECT cust_id,order_num FROM orders WHERE Date(order_date) = ‘2005-09-01’;
匹配一段日期范围内的数据:
SELECT cust_id,order_num FROM orders WHERE Year(order_date) = 2005 AND Mounth(order_date) = 9;
数值处理函数:
函数 | 说明 |
---|---|
Abs() | 返回一个数的绝对值 |
Cos() | 返回一个角度的余弦 |
Exp() | 返回一个书的指数值 |
Mod() | 返回除操作的余数 |
Pi() | 返回圆周率 |
Rand() | 返回一个随机数 |
Sin() | 返回一个角度的正弦 |
Sqrt() | 返回一个数的平方根 |
Tan() | 返回一个角度的正切 |