最近在读MySQL必知必会,关于这本书打算写点读后感,大概是两篇博客的体量。
 
其实对于测试岗来说,不管是面试还是实际工作中,最重要的自然当属SELECT。
下面我把书里关于SELECT的知识点简单记一下吧。
首先在MySQL中其实是不区分大小写的,但为了规范,我们在写SQL语句的时候还是注意要将关键字大写。
比如与mysql有关的操作如SELECT,FORM之类的关键词。
首先是SELECT的基础知识
1.DISTINCT关键字
  SELECT DISTINCT pro_id 
  FROM  xxxx;    代表从表中搜索pro_id整列,distinct剔除重复项
2.LIMIT 限制查询出来的行数
  SELECT  ****
  FROM ***
  LIMIT 3,4;     代表检索从第三行开始的后4行,
  				如果只有一个数字代表从第一行的后n行
3.ORDER   检索出来的行按照指定的规则排序
   SELECT **
   FROM ***
   ORDER BY 111   222;     搜索结果按列排序,111的优先级大于222
   ORDER BY 1111  DESC,222;     按111降序排列,随后考虑222
例:找出最贵的一个物品
SELECT  aaa_price,product_name 
FROM ***
ORDER BY aaa_price DESC           根据price倒序排列
LIMIT 1;
4.WHERE
过滤数据用WHERE  <,>,!=,=,between  and,<>(代表!=),IS NULL,IS NOT NULL
多组过滤:  WHERE......AND/OR.......    (在有多个AND/OR的时候,AND被优先处理)
可以用 WHERE (.....or......) AND .......     的方式来组合
还可以用IN操作符来过滤
SELECT  ****  FROM ***
WHERE  *** IN (10,9)     括号内为可选的数据范围
WHERE 后还可以接NOT来否定后续条件
通配符%
WHERE  ... LIKE 'jet%'            %代表通配符,接受jet后为任意字符,注意区分大小写
WHERE  ... LIKE '%jet%'         通配符可以使用多个
还有一个通配符_          功能与%一样,但%可以匹配0个或多个,_一定只匹配一个
%不能匹配NULL
正则表达式
WHERE ... REGEXP '.000'    .代表匹配任何值
WHERE .... REGEXP '1000'    这条语句可以搜索到1000
WHERE  .... LIKE '1000'      这条语句不会搜索到1000,没用通配符,LIKE匹配整个串
REGEXP 匹配不区分大小写,如要区分大小写,用REGEXP BINARY
正则表达式与OR结合  WHERE ... REGEXP '1000|2000'  
匹配多个字符任意一个    WHERE ... REGEXP '[abc]1'    匹配a1/b1/c1 
排除某个字符串用-      -scope*  代表排除以scope开头的任意字符串
如果要使用正则表达式来匹配特殊字符如.   用\\.来匹配.
?号在正则表达式中便是?前面的字符可以出现0/1次
[:alnum:]  匹配任意一个字符
[:digit:]    任意数字
5.字符串拼接CONCAT
在实际SELECT的过程中,我们可能需要一个新的列,即在数据表中原本其实并不存在的列,可以使用CONCAT
SELECT CONCAT(name,'(',age,')')as ...   最终拼成name(age)的形式,形成一个新的列
SELECT  age*height as ....          也可以直接列相乘生成新的一列
6.SELECT中可能使用的一些内置函数
RTrim(name)   删除数据右侧多余的空格
Upper()    将文本中所有字母转换为大写
Date()    将查询语给出的值与列中的数据进行部分筛选
根据日期筛选   WHERE Date(order_date) = '2022-12-16' ,可以与BETWEEN结合使用
Year()/Month()    获取年份,月份
AVG()/SUM()/MAX()/MIN()
这部分中的重点是COUNT函数
COUNT(返回某列的行数,计数函数)   
COUNT(*)计算整个表的行数
COUNT(column)计算特定列的行数,NULL值不计入其中
SELECT COUNT(*) as total_num
FROM 。。。
WGHERE age =5    计算年龄为5的人数个数
7.GROUP
   SELECT  id,COUNT(*) AS pro_num
   FROM...
   GROUP BY id        根据id分组计算,计算不同id的个数,同个id为一组
   HAVING COUNT(*) >2   过滤,只显示数量大于2的id
   ORDER BY id        将最终的分组按照id来排序
这里注意HAVING和WHERE的区别
HAVING过滤组别
WHERE过滤列
8.子查询
若要多次进行查询筛选可用子查询,放到一个Sql语句里
SELECT id 
FROM  ..
WHERE age in (SELECT age  //注意这边的WHERE age 和in后面的SELECT age,要统一
              FROM ...
              WHERE name in ('aa','bb'));
SELECT id ,(SELECT COUNT(*)                  生成新的不存在的列需要另外SELECT
FROM orders    
WHERE  customer.id = order.id) AS order    红字部分为联结查询
FROM customer
ORDER BY id;
9.联结查询
   SELECT a_name,b_age,c_sex
   FROM name,age
   WHERE name.id = age.id AND sex.id = name.id AND age =24    多个表同时联结
   ORDER BY a_name,b_age;
这里还可以给表创建别名以供后续查询的使用
	SELECT 。。。
	FORM name as n, age as a
	WHERE a.xxx = n.xxx;
10.SLEECT中的全文本搜索
使用MATCH()和AGAINST()
SELECT ...
FROM..
WHERE MATCH(列名) AGAINST(xxx表达式)
AGAINST('+aa -bb')   查询包含aa不包含bb
AGAINST('aa  bb')     查询包含aa或者bb
AGAINST( ' “aa bb” ’)   查询包含“aa bb”这个具体字符串
 
视图
视图并不包含任何表中的列或者数据,严格来说,视图其实就是SQL查询
CREATE VIEW  aa AS      把下面这个SELECT包装成为一个名为aa的视图
SELECT ,,,
FROM ...
WHERE   ..
 
为什么使用视图?
 1.简化复杂的SQL操作
 2.保护数据,可以授予部分用户特定部分的访问权限,而不是整个表
视图还可以用来重新组合列,比如你希望组合两个列生成一个新的列,但这个列,表中是没有的,用SELECT CONCAT,然后将这个SELECT封装为一个视图。这样可以简化搜索操作。
注意,视图主要用于检索数据,但很多情况下的视图是无法被更新的
 1.视图里有分组GROUP /HAVING
 2.视图里有联结查询,有子查询
 3.视图里有聚集函数(MIN,SUM,COUNT)等
 4.视图里有DISTINCT



















