MySQL必知必会(1-13章)

自动增量式mysql可以自动为每个行为分配一个可用编号,不用再添加一行时手动分配唯一值。
show databases; 显示数据库
use testdb(database);切换数据库
show tables;返回当前选择的数据库内可用表的列表
show columns from defend_log; 显示表的列,也可以用DESCRIBE defend_log,即是前面的快捷方式。
show status;用于显示广泛的服务器状态信息
show create database testdb; 显示数据库testdb的创建语句
show create table defend_log; 显示数据表defend_log的创建语句
show grants; 显示授予用户的安全权限
show errors; show warnings; 显示服务器错误或警告消息
help show; 显示允许的show语句
MySQL 5支持一个新的INFORMATION_SCHEMA命令,可用来获得和过滤模式信息
DISTINCT:显示不同的值,去除相同的值
SELECT prod_name FORM products LIMIT 5; 显示前五行,带一个值得是行数,从第一行开始
SELECT prod_name FROM products LIMIT 5, 5; 后两个值指定要检索的开始行和行数,即从第5行开始的5行。第一个数为开始位置,第二个数为要检索的行数。

DESC:降序,只应用到直接位于其前面的列名。如果想在多个列上进行降序排序,必须对每个列制定DESC关键字。
SELECT proid_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
先以prod_price降序排列,然后再以prod_name升序排序
使用ORDER BY和LIMIT组合,可以找出一个列中最高或最低的值。
SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1; //选出价格最高的一行
在给出ORDER BY子句时,应保证它位于FROM子句之后,且是最后一个子句。如果使用LIMIT,则LIMIT必须位于ORDER BY之后。
同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。
空值检查:可以检查一个列是否包含空值,空值表示为NULL,不包含0,空字符串,或仅仅包含空格
SELECT prod_name FROM products WHERE prod_price IS NULL;  返回价格为空的产品

AND 优先级高于OR
SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;  
返回id为1002 或1003中价格大于10的产品名称,价格
SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
用or也可以实现
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 ORDER BY prod_name;
IN优点:
比OR执行速度快,且可以包含其他SELECT语句

使用通配符和正则表达式进行匹配时,需要用''单引号将其表达式包围起来。
使用通配符的时候要使用LIKE操作符,表示使用通配符匹配而不是相等。
通配符%匹配任何字符出现任何次数  ‘jet%’匹配以jet开头出现的所有字符串
_:匹配一个字符
通配符搜索一般要比前面的其他搜索所花时间更长

正则表达式匹配,将LIKE代替为REGEXP,表示REGEXP后面使用的是正则表达式
LIKE与REGEXP的一个重要区别是:LIKE匹配整个列,如果被匹配的文本在列中出现,LIKE不会找到他,不会返回该行。
REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,该行会被返回。要使REGEXP像LIKE一样匹配整个行,需要使用^(开始)与$(结束)定位符。
如下:
mysql> select prod_name from products where prod_name LIKE '1000';
Empty set (0.00 sec)

mysql> select prod_name from products where prod_name REGEXP '1000';
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)


|:匹配两个串之一,相当于or,如'1000|2000|3000'
[123]匹配1 或2或3
[^123]除1 2 3这几个字符之外的其他任何东西
匹配范围[1-9] [a-z]匹配任意字符
特殊字符用\转义   \\-表示查找-    \\.表示查找.
*:0或多个匹配   +:1或多个匹配相当于{1,}  ?:0个或1个匹配相当于{0, 1}
{n}:指定书目的匹配   {n, }:不少于指定数目的匹配  {n, m}:匹配数目的范围
^: 文本的开始  $:文本的结束   [[:<:]]词的开始   [[:>:]]词的结尾
如果找一个以一个数开始(包括小数点开始的数),[0-9\\.]或[[:digit:]\\.]
select prod_name from products where prod_name REGEXP '^[0-9\\.]' order by prod_name;
^有两种用法:如果在集合中[^]则是找不包含该集合的行,如果不在集合中表示串的开始

创建计算字段:
Concat():拼接字符串,各个串之间用,隔开
SELECT Concat(vend_name, '(', vend_country, ')') FROM vendors ORDER BY vend_name;
RTrim():去掉右边的所有空格;LTrim():去掉左边的所有空格;Trim():去掉左右两边的空格
AS可以表示别名,如果一列太长,可以使用别名(或者也可以省略)。
select Concat(RTrim(vend_name), '(', RTrim(vend_country), ')') AS vend_title FROM vendors order by vend_name;
NOW():返回当前日期和时间,select Now();

数据处理函数:
SubString():找出子串的字符, Upper():串转换为大写, Lower():小写
Locate():找出串的一个子串   Soundex:返回串的SOUNDEX,即对串的发音进行比较而不是字母
SELECT cust_name, cust_contact FROM customers WHERE Soundex(cust_contact) = Soundex('Y.Lie')
找到cust_contact的发音与Y.Lie发音相似的行
Exp():返回一个数的指数  Rand():返回一个随机数
COUNT(): 
使用COUNT(*)对表中行的数目进行计数,不管表中包含的是空值还是非空值
使用COUNT(column)对特定列中具有值得行进行技术,忽略NULL值
sum():返回某列的和
AVG(),COUNT(), MAX(), MIN(), SUM():都可指定ALL和DISTINCT值,ALL表示所有行执行计算,是默认的,DISTINCT表示只对不同的行进行计算,如
select avg(distinct prod_price) as avg_price from products where vend_id = 1003;
DISTINCT不能用于COUNT(*),DISTINCT必须使用列名,不能用于计算或表达式,DISTINCT用于MIN()与MAX()并没有实际意义。
使用这些聚集函数一般比在应用程序中计算要快的多。

Group by对数据进行分组,之后队每个组而不是整个结果集进行聚集,group by经常和聚集函数一起使用,如:
select vend_id, count(*) as num_prods from products group by vend_id;  //按vend_id进行分组,且分别对每个分组进行行数统计,不包括NULL
可以使用WITH ROLLUP关键字,队每个分组以及每个分组汇总级别的值,结果包括了NULL,
使用Group by的一些规定:
1 Group by子句可以包含任意数目的列,使得能对分组进行嵌套,为数据分组提供更细致的控制
2 如果Group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总,
3 Group by子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在select中使用表达式,则必须在group by子句中指定相同的表达式,不能使用别名
4 除聚集语句外(select中可以有聚集函数,聚集函数的列不一定要出现在group by子句中),select语句中的每个列都必须在group by子句中给出(select语句中没有出现在聚集函数中的列必须在group by子句中出现),如
select vend_id, min(prod_price) as min_prods from products group by vend_id WITH ROLLUP;
5 如果分组列中有NULL值,则NULL将作为一个分组返回。如果有多行NULL值,将它们分成一组
6 Group by子句必须出现在Where子句之后,order by子句之前。
group by与order by区别:
order by
order by
group by
排序产生的输出
分组行,但输出可能不是分组的排序
任意列都可以使用(即使非选择的列也可以使用)
只可能使用选择列或表达式列,而且必须使用每个选择列表达式,子句中不能使用聚集函数,select可以出现聚集函数


经常发现group by分组的输出是按照分组顺序输出的,但是并不总是这样,不是SQL规范,如果要保证数据正确分组,则应该和order by子句一起使用,例如检索总计订单价格大于50的订单的订单号和总计订单价格:
select order_num, SUM(quantity*item_price) AS ordertotal from orderitems group by order_num HAVING SUM(ordertotal) >= 50;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
|     20005 |     149.87 |
|     20006 |      55.00 |
|     20007 |    1000.00 |
|     20008 |     125.00 |
|     20009 |      38.47 |
+-----------+------------+
5 rows in set (0.00 sec)
如果要按照ordertotal进行排序,则需要order by:
select order_num, SUM(quantity*item_price) AS ordertotal from orderitems group by order_num HAVING SUM(ordertotal) >= 50 order by ordertotal;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
|     20009 |      38.47 |
|     20006 |      55.00 |
|     20008 |     125.00 |
|     20005 |     149.87 |
|     20007 |    1000.00 |
+-----------+------------+
5 rows in set (0.00 sec)

HAVING:过滤分组,HAVING支持所有WHERE操作,区别是HAVING过滤分组,WHERE过滤行。还有一个区别是WHERE在分组前进行过滤,HAVING在分组后进行过滤,WHERE排除的行不包括在分组中。where子句中不能使用聚集函数。WHERE和HAVING可以一起使用,例如列出具有2个以上,价格为10以上的产品的供应商:
SELECT vend_id, count(*) as num_prods from products where prod_price >= 10 group by vend_id having count(*) >= 2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1003 |         4 |
|    1005 |         2 |
+---------+-----------+
2 rows in set (0.00 sec)
select子句的顺序:select, from, where, group by, having, order by, limit;
当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
--执行where子句查找符合条件的数据;
--使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
--having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.
--having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
--having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值