初识MySQL(2)

1.条件查询

  使用where子句对表中的数据筛选,结果为true的行会出现在结果集中。

select * from 表名 where 条件;
  • 比较运算符

  等于=,大于>,大于等于>=,小于<,小于等于<=,不等于!=

  查询id>2的学生

  • 逻辑运算符,and 、or、not。

  • 模糊查询

  模糊查询关键字like,%表示任意多个任意字符,_表示一个任意字符。

  • 范围查询
  1. in表示一个非连续的范围内查询
  2. between ... and ...表示在一个连续的范围内

  • 优先级
  1. 小括号>not>比较运算符>逻辑运算符
  2. and比or先运算,如果同时出现并希望先算or,需要结合()使用

2.聚合

为了快速得到统计数据,提供了5个聚合函数。

  • count(*)表示计算总行数,括号中写星与列名,结果是相同的
  • max(列)表示求此列的最大值
  • min(列)表示求此列的最小值
  • sum(列)表示求此列的和
  • avg(列)表示求此列的平均值

查询id最小值得学生,并显示这个id具体信息:

聚合查询只能查询一个结果,所以需要嵌套一个子查询。

3.分组

  按照字段分组,表示此字段相同的数据会被放到一个组中;分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中;可以对分组后的数据进行统计,做聚合运算。分组的目的是为了更好的聚合。

select 列1,列2,聚合... from 表名 group by 列1,列2,列3...

 

对分组后的数据筛选。where是对from后面指定的表进行数据筛选,属于对原始数据的筛选;having是对group by的结果进行筛选。

4.排序

  为了方便查看数据,对数据进行排序。asc从小到大排列,即升序;desc从大到小排序,即降序。

select * from 表名 order by 列1 asc|desc,列2 asc|desc,...

5.分页

  当数据量过大时,需要分页显示。一次性加载太多数据加大了服务器内存负载;网络中传输的数据过大;同是对用户游览器加载也是一个考验。

select * from 表名 limit start,count

 从start开始,获取count条数据start索引从0开始。

6.外键约束

  • 外键

    给表A添加一个外键,这个外键是表B中的字段,那么表A是主表,表B是子表。

  • 外键的作用

    为了使表记录的数据不要太冗余,同时保持数据的一致性、完整性。

  • 外键使用前提

         1. 表储存引擎必须是innodb,否则创建的外键无约束效果。

    2. 字表的字段类型必须与主表的外键类型完全一致,外键必须是主表的唯一键。

    3. 外键的名字不能重复。

    4. 已经存在数据的字段被设为外键时,必须保证字段中的数据与主表的主键数据对应起来。

  • 创建外键约束表(便于后面连接查询)
create table scores(
id int primary key auto_increment,
stuid int,
subid int,
score decimal(4,1),
foreign key(stuid) references students(id),
foreign key(subid) references subjects(id));

  • 外键的级联操作

    在删除students表的数据时,如果这个id值在scores中已经存在,则会抛异常

    推荐使用逻辑删除,还可以解决这个问题

    可以创建表时指定级联操作,也可以在创建表后再修改外键的级联操作

alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;

级联操作类型:

  外键操作是建立多张表之间的关系,如何确定表之间的关系是关键,表之间是一对多关系字段存储在“多”中,表之间是一对一关系字段存储均可,表之间是多对多则需新建一张表存储关系字段。

 7.连接查询

  在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询。

 

以上三张表分别是students,scores,subject,查询每个学生每个科目的分数,学生姓名来源于students表,科目名称来源于subjects,分数来源于scores表,当查询结果来自多张表时,需要建立连接查询。students表的id对应scores表的stuid,subjects表的id对应scores表的subid,因此我们可以使用内连接查询。

  • 内连接查询
表A inner join 表B:表A与表B匹配的行会出现在结果集中
select students.sname,subjects.stitle,scores.score
from scores
inner join students on scores.stuid=students.id
inner join subjects on scores.subid=subjects.id;

#查询男学生平均分,用到聚合时考虑分组
select students.name,avg(scores.score)
from scores
inner join students on scores.stuid=students.id
where students.gender=1
group by students.name;

  • 外连接查询
表A left join 表B:表A与表B匹配的行会出现在结果中,外加表A中独有的数据,B未对应的数据使用null填充
#左外连接
select * from scores 
left join students on scores.stuid = students.id;

表A right join 表B:表A与表B匹配的行会出现在结果中,外加表B中独有的数据,A未对应的数据使用null填充
#右外连接
select * from scores 
right join students on scores.stuid = students.id;

在查询或条件中推荐使用“表名.列名”的语法,如果多个表中列名不重复可以省略“表名.”部分,如果表的名称太长,可以在表名后面使用' as 简写名'或' 简写名',为表起个临时的简写名称。

 8.视图

视图是select语句查询返回的结果集,用于解决多次使用复杂查询的场景,视图本质就是对查询的一个封装。

#定义视图
create view stuscore as 
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;

#视图用于查询
select * from stuscore;

9.事物

  MySQL 事务主要用于处理操作量大,复杂度高的数据,如果其中某条sql语句出错,则希望整个操作都退回;使用事务可以完成退回的功能,保证业务逻辑的正确性;在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

事物四大特征(ACID):

  • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
  • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
  • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
开启begin;
提交commit;
回滚rollback;

当进行事物开始时begin就会创建一个内存级的临时表,只有操作提交commit或者回滚才能真正修改物理表。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update subjects set title='c++' where id = 6;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update subjects set title='Mongodb' where id=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from subjects;

 在begin之后进行操作表,然后在提交(commit)或者回滚(rollback)之前在同一个Linux终端查询发现操作的表变化了;但是当打开第二个终端时发现表数据并没有变化。这种现象就是关于内存级的临时表(终端1)和物理表(终端2)之间的区别。

10.索引

原文地址:https://www.cnblogs.com/jsnhdream/p/10231355.html