SQL基础知识笔记整理

在这里插入图片描述

一、检索数据select
1.检索单个列
SELECT 字段1 FROM 表名 
2.检索多个列
SELECT 字段1,字段2 FROM 表名 
3.检索所有列
SELECT * FROM 表名 
4.检索不同的行:
SELECT DISTINCT 字段1 FROM 表名
SELECT DISTINCT 字段1,字段2,字段3 FROM 表名
SELECT DISTINCT * FROM (错误)
5.限制结果:
SELECT * FROM 表名 limit 5   #返回不多于5行
SELECT * FROM 表名 limit 5,3  #返回从行5开始的3行(行索引从0开始)
6.完全限定的表名
二、排序检索数据order by
1.排序数据
SELECT * FROM 表名 ORDER BY  size
SELECT * FROM 表名 ORDER BY  name  #以字母顺序排序
2.按多个列排序
SELECT * FROM 表名 ORDER BY 字段1,字段2
3.指定排序方向

默认升序排序:ASC
降序排序:

SELECT * FROM 表名 ORDER BY  字段 DESC  #(DESC只对前面的字段有效)
SELECT * FROM 表名 ORDER BY  字段1 DESC,字段2  #字段1降序,字段2升序

对多个列降序排序:对每个列指定DESC

三、过滤数据
1.使用where子句
SELECT * FROM 表名 WHERE 子句  --和order by 结合使用时,order by要放在后面
2.where子句操作符

(1)检查单个值:

SELECT name FROM 表名 WHERE name='Alis';  
-- mysql在执行匹配时 默认不区分大小写,返回name为'Alis'和'alis'的所有行

(2)不匹配检查:不等于操作符 <> 、!=

SELECT name,age FROM 表名 WHERE age <> 20; 

(3)范围值检查:操作符BETWEEN

SELECT name,age FROM age BETWEEN 18 AND 24; --包括开始值和结束值

(4)空值检查:无值NULL

SELECT * FROM 表名 WHERE age IS NULL; --返回没有年龄的所有行
四、数据过滤 (使用多个where子句)
1.组合WHERE子句

(1)AND操作符:满足所有给定条件

SELECT name,age FROM WHERE age=18 AND  age=24

(2)OR操作符:匹配任一条件

SELECT name,age FROM WHERE age=18 AND  age=24

(3)计算次序:优先处理AND操作符,可以使用括号进行控制

2.IN操作符
SELECT name,age FROM WHERE age IN(18,20,24); 
-- 用来指定要匹配值的清单的关键字,功能与AND相当,执行更快
-- 可以包含其他select语句,能够动态地建立where子句
3.NOT操作符

否定它之后所跟的任何条件(支持NOT对IN、BETWEEN和EXISTS子句取反)

SELECT name,age FROM WHERE age IN(18,20,24);  #匹配年龄是18,10,14之外的所有行
五、用通配符进行过滤
1.like操作符

like指示,后面跟的搜索模式利用通配符匹配 而不是直接相等匹配

(1)通配符:百分号%:表示任何子串出现任意次数
例如:找出所有以词gao起头的名字

SELECT name FROM WHERE name LIKE 'gao%';  -- 搜索是区分大小写的
SELECT name FROM WHERE name LIKE '%gao%'; 
-- 可以使用多个通配符,可以匹配0个字符,如:gaojie或jiugao


(2)通配符:下划线_:只匹配单个字符

六、用正则表达式进行搜索
1.基本字符匹配
SELECT * FROM 表名 WHERE name REGEXP 'hi100'; --返回name中包含文本100的所有行
SELECT * FROM 表名 WHERE name REGEXP '.100'; --在正则表达式语法中,.表示匹配任意一个字符

匹配不区分大小写,若想要区分大小写使用BINARY关键字:

SELECT * FROM 表名 WHERE name REGEXP BINARY 'hi100';
2.进行OR匹配:搜索两个串之一
| :正则表达式的or操作符,匹配其中之一即可返回
3.匹配几个字符之一:[] 另一种形式的or语句
SELECT * FROM 表名 WHERE name REGEXP '[123] hahah';
-- 可理解为'[1|2|3]' hahah的缩写,最好使用集合匹配
4.匹配范围
[0123456789]:匹配数字0-9
简化:[0-9] 匹配数字0-9
	 [a-z]:匹配任意字母字符
5.匹配特殊字符:具有特殊意义的字符必须转义

想要匹配特殊字符,必须使用\为前导(转义):

\\.表示查找 .   REGEXP '\\.'
\\-表示查找 -
\\\表示查找 \
6.匹配字符类
7.匹配多个实例(使用重复元字符)
*
+
?匹配它前面的任何字符的0次或1次出现   例:apples?  匹配apple和apples
{n}
{n,}
{n,m}
8.定位符:匹配特定位置的文本(定位元字符)
^
$
七、创建计算字段
1.计算字段

是我们需要的、格式化之后的数据;计算字段并不实际存在于数据库表中,计算字段是运行时在select语句内创建的。

2.拼接字段

concat()函数拼接串,把多个串连接起来形成一个较长的串

SELECT Concat(name,age,school) FROM table;
3.使用别名:as
4.算数计算:支持 + - * /
八、使用数据处理函数
1.函数类型

(1)文本函数
(2)数值函数
(3)日期和时间函数
(4)系统函数

2.文本处理函数
Upper() 将串转为大写
Lower() 将串转为小写
	
Left()   返回串 左边的字符
Right()  返回串 右边的字符

Trim(str) 去掉串两边的空格
RTrim(str) 去掉串右边的空格
LTrim(str) 去掉串左边的空格

Length() 返回串的长度
Locate() 找出串的一个子串
SubString() 返回子串的字符

Soundex() 返回串的soundex值 描述其语音表示的字符数字模式的算法 匹配发音相似
3.日期和时间处理函数

首选日期格式:yyyy-mm-dd
在只知道日期格式的情况下,可以仅与日期时间格式中的日期部分 进行比较,否则匹配失败:

Date()函数:返回日期时间的日期部分
Time() 函数:返回日期时间的时间部分
4.数值处理函数:仅处理数值数据 代数、三角或几何运算
abs()
cos()
exp()
mod()
pi()
rand()
sin()
sqrt()
tan()
九、汇总函数
1.聚集函数:汇总数据便于分析和报表生成
avg() 返回所有列/某列的平均值  或特定行的平均值 忽略列值为NULL的行
count() 返回某列的行数
max() 返回某列的最大值 
min() 返回某列的最小值
sum() 返回某列值之和
2.组合聚集函数
十、分组数据
1.创建分组:group by
2.过滤分组:having
3.分组和排序:order by
4.select子句顺序
select
from
where
group by
having
order by
limit
十一、使用子查询

1-10都是简单查询:从单个数据库表中检索数据的单条语句
创建子查询:嵌套在其他查询中的查询

1.利用子查询进行过滤

可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE语句

(1)子查询一般与IN操作符结合使用,也可以用于测试= <>

SELECT id FROM table1
	WHERE age IN (SELECT age FROM table2
				  WHERE sex='man');

​ 子查询总是从内向外处理,上面语句实际执行了两个操作:

	1)首先执行:SELECT age FROM table2 WHERE sex='man'
	2)外部查询:SELECT id FROM table1 WHERE age IN(result)
2.作为计算字段使用子查询
3.相关子查询:涉及外部查询的子查询

只要列名有多义性就必须使用这种语法(表名和列名由一个句点分隔)

十二、联结表
1.联结

(1)关系表、外键:表B的主键是表A的外键,则这两个表关联
(2)如果数据存储在多个表中,怎样利用单条语句检索出数据:使用联结
联结是一种机制,用来在一条SELECT语句中关联表,因此称之为关联表。
使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联正确的行。

2.创建联结
SELECT vend_name,pro_name
FROM vendors,products
WHERE vendors.vend_id=products.pro_id 
ORDER BY vend_name,pro_name;
-- 从商品、供应商两张表中 查找供应商名称和商品名称 然后排序
-- WHERE子句中使用 完全限定列名 联结两张表(如果不 则会出现二义性,因为两张表都有vend_id字段)

联结表必须在运行时构造,所以要写在WHERE子句中。

3.笛卡尔积

笛卡尔积就是没有联结条件的表关系返回的结果,检索出的行数为两张表行数的乘积

SELECT vend_name,pro_name
FROM vendors,products
ORDER BY vend_name,pro_name;
-- 每个供应商匹配了每个商品
4.内部联结(等值联结)
SELECT vend_name,pro_name
FROM vendors INNER JOIN products
ON vendors.vend.id=products.pro_id;
-- 两个表关系由 INNER JOIN指定
5.联结多个表

首先列出所有表,然后定义表之间的关系

SELECT vend_name,pro_name
FROM vendors,products,orderitems
WHERE vendors.vend_id=products.pro_id 
	AND orderitems.pro_id=products.pro_id;

注意:联结的表越多,性能下降越厉害

6.小结

如果在查询中返回数据需要使用多个表,第一种方法是:使用嵌套子查询;第二种方法是使用联结。

十三、高级联结
1.使用表别名
  • 缩短SQL语句
  • 允许在单条SELECT语句中多次使用相同的表
SELECT class_name
FROM students AS st,teachers AS te,classes AS cl
WHERE st.class_id=cl.class_id
	AND te.class_id=cl.class_id
	AND cl.class_id=105

注意:表别名只在查询执行中使用,这与列别名不同,表别名不返回到主机。

2.自联结

自联结通常作为外部语句来替代 从相同表中检索数据时使用的子查询语句。

SELECT p1.pro_id,p1.pro_name
FROM products AS p1,products AS p2
WHERE p1.pro_id=p2.pro_id
	AND p2.pro_id='125';
-- 此查询中需要的两个表实际上是相同的表,如果不对products起别名,则有二义性
-- mySQL不知道引用哪个表中的一列(即使它们实际上是同一列)
十四、组合查询

使用UNION操作符将多条SELECT语句组合成一个结果集。

1.创建组合查询

UNION指示执行两条SELECT语句,并把输出组合成单个查询结果集。
在这里插入图片描述

2.UINION使用规则
  • 必须有两条及以上的SELECT语句组成
  • UNION中的每个查询必须包含相同的列、表达式、聚集函数
  • 列数据类型必须兼容
3.是否去重

UNION默认是自动去重的,如果不想要去重,可以使用UNION ALL

4.对UNION结果集排序

在UNION中不允许对单个SELECt子句排序,只能只用一条ORDER BY子句,那就是必须放在最后一条SELECT子句之后,它将排序所有的SELECT返回的结果。
在这里插入图片描述

十五、全文本搜索

高级的数据查询和选择

1.什么是全文本搜索
2.启用全文本搜索

在创建表时启用全文本搜索FULLTEXT(),下图note_text列可以进行全文本搜索。之后,MySQL自动维护该索引,在增加、删除或更新时,索引随之更新

在这里插入图片描述

3.进行全文本搜索

在索引之后,使用两个函数Match()和Against()进行全文本搜索:

  • Match(): 指定被搜索的列
  • Against(): 指定要使用的搜索表达式
    在这里插入图片描述
    在这里插入图片描述

注意:

  • 全文本搜索不区分大小写
  • 全文本搜索对结果排序(等级高度:结果中第3个词和第20个词)
  • 传递给Match()的值必须FULLTEXT()定义中的相同。如果指定多个列,必须列出他们,且次序正确。
4. 查询扩展

在这里插入图片描述
返回结果对比:
在这里插入图片描述
在这里插入图片描述

第一行包含anvils,所以等级最高。第二行虽然与anvils无关,但是包含了第一行中的两个词customer和recommend…

所以,查询拓展极大的增加了返回的行数。

5.布尔文本搜索

没有FULLTEXT索引也可以使用:

  • 要匹配的词
  • 要排斥的词
  • 排列提示(指定某些词比其他词更重要)
  • 表达式分组
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
十六、插入数据 INSERT

INSERT没有输出

1.数据插入
  • 插入完整的行
  • 插入行的一部分
  • 插入多行
  • 插入某些查询的结果
2.插入完整的行
管理事务处理
1.事务处理

事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。

(用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果)

  • 事务transaction:指一组SQL语句
  • 回退rollback:指撤销指定SQL语句的过程
  • 提交commit:指将未存储的SQL语句结果写入数据库表
  • 保留点savepoint:指事务处理中设置的临时占位符,你可以对他发布回退(与回退整个事务处理不同)

先到这里…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值