最近在读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