zoukankan      html  css  js  c++  java
  • 初识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.索引

  • 相关阅读:
    HTML5游戏参考资料
    Xcode 4.2 编译 ios5.1
    Const,Const函数,Const变量,函数后面的Const (zz)
    AndroidJNI 通过C++调用JAVA
    android adb shell 命令大全
    《Programming WPF》翻译 目录
    《Programming WPF》翻译 第3章 1.什么是控件
    CLR笔记目录
    《Programming WPF》翻译 第3章 3.内嵌控件
    《Programming WPF》翻译 第3章 2.处理输入
  • 原文地址:https://www.cnblogs.com/jsnhdream/p/10231355.html
Copyright © 2011-2022 走看看