数据库管理软件分类
mysql就是一个基于socket编写的C/S架构的软件
分两大类: 关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用 非关系型:mongodb,redis,memcache 总结两句话: 关系型数据库需要有表结构 非关系型数据库是key-value存储的,没有表结构
存储引擎
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 ps: 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎
单表查询注意点
where约束
where子句中可以使用 1.比较运算符:>、<、>=、<=、<>、!= 2.between 80 and 100 :值在80到100之间 3.in(80,90,100)值是10或20或30 4.like ‘xiaomagepattern‘: pattern可以是%或者_。%小时任意多字符,_表示一个字符 5.逻辑运算符:在多个条件直接可以使用逻辑运算符 and or not
group by 分组查询
#1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的 #2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等 #3、为何要分组呢? 取每个部门的最高工资 取每个部门的员工数 取男人数和女人数 小窍门:‘每’这个字后面的字段,就是我们分组的依据 #4、大前提: 可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
继续验证通过group by分组之后,只能查看当前字段,如果想查看组内信息,需要借助于聚合函数
聚合函数
max()求最大值 min()求最小值 avg()求平均值 sum() 求和 count() 求总个数 #强调:聚合函数聚合的是组的内容,若是没有分组,则默认一组 # 每个部门有多少个员工 select post,count(id) from employee group by post; # 每个部门的最高薪水 select post,max(salary) from employee group by post; # 每个部门的最低薪水 select post,min(salary) from employee group by post; # 每个部门的平均薪水 select post,avg(salary) from employee group by post; # 每个部门的所有薪水 select post,sum(age) from employee group by post;
HAVING过滤
HAVING与WHERE不一样的地方在于 #!!!执行优先级从高到低:where > group by > having #1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。 #2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
order by 查询排序
按单列排序 SELECT * FROM employee ORDER BY age; SELECT * FROM employee ORDER BY age ASC; SELECT * FROM employee ORDER BY age DESC; 按多列排序:先按照age升序排序,如果年纪相同,则按照id降序 SELECT * from employee ORDER BY age ASC, id DESC;
limit 限制查询的记录数
示例: SELECT * FROM employee ORDER BY salary DESC LIMIT 3; #默认初始位置为0 SELECT * FROM employee ORDER BY salary DESC LIMIT 0,5; #从第0开始,即先查询出第一条,然后包含这一条在内往后查5条 SELECT * FROM employee ORDER BY salary DESC LIMIT 5,5; #从第5开始,即先查询出第6条,然后包含这一条在内往后查5条
多表查询
语法:
SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
inner join
内连接:只连接匹配的行
找两张表共有的部分,相当于利用条件从笛卡尔积结果中筛选出了匹配的结果
left join
外链接之左连接:优先显示左表全部记录
本质就是:在内连接的基础上增加左边有,右边没有的结果
right join
外链接之右连接:优先显示右表全部记录
本质就是:在内连接的基础上增加右边有,左边没有的结果
子查询
#1:子查询是将一个查询语句嵌套在另一个查询语句中。 #2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。 #3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字 #4:还可以包含比较运算符:= 、 !=、> 、<等
命中索引
- like ‘%xx‘ select * from userinfo where name like ‘%al‘; - 使用函数 select * from userinfo where reverse(name) = ‘alex333‘; - or select * from userinfo where id = 1 or email = ‘alex122@oldbody‘; 特别的:当or条件中有未建立索引的列才失效,以下会走索引 select * from userinfo where id = 1 or name = ‘alex1222‘; select * from userinfo where id = 1 or email = ‘alex122@oldbody‘ and name = ‘alex112‘ - 类型不一致 如果列是字符串类型,传入条件是必须用引号引起来,不然... select * from userinfo where name = 999; - != select count(*) from userinfo where name != ‘alex‘ 特别的:如果是主键,则还是会走索引 select count(*) from userinfo where id != 123 - > select * from userinfo where name > ‘alex‘ 特别的:如果是主键或索引是整数类型,则还是会走索引 select * from userinfo where id > 123 select * from userinfo where num > 123 - order by select email from userinfo order by name desc; 当根据索引排序时候,选择的映射如果不是索引,则不走索引 特别的:如果对主键排序,则还是走索引: select * from userinfo order by nid desc; - 组合索引最左前缀 如果组合索引为:(name,email) name and email -- 使用索引 name -- 使用索引 email -- 不使用索引
最左前缀:
最左前缀匹配: create index ix_name_email on userinfo(name,email); select * from userinfo where name = ‘alex‘; select * from userinfo where name = ‘alex‘ and email=‘alex@oldBody‘; select * from userinfo where email=‘alex@oldBody‘; 如果使用组合索引如上,name和email组合索引之后,查询 (1)name和email ---使用索引 (2)name ---使用索引 (3)email ---不适用索引 对于同时搜索n个条件时,组合索引的性能好于多个单列索引 ******组合索引的性能>索引合并的性能*********
索引注意事项
(1)避免使用select * (2)count(1)或count(列) 代替count(*) (3)创建表时尽量使用char代替varchar (4)表的字段顺序固定长度的字段优先 (5)组合索引代替多个单列索引(经常使用多个条件查询时) (6)尽量使用短索引 (create index ix_title on tb(title(16));特殊的数据类型 text类型) (7)使用连接(join)来代替子查询 (8)连表时注意条件类型需一致 (9)索引散列(重复少)不适用于建索引,例如:性别不合适
原文地址:https://www.cnblogs.com/hnlmy/p/10561436.html
时间: 2024-10-18 05:31:36