可能是漏洞百出的——MySQL(3)

SQL语言(结构化查询语言)

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。可以通过DBMS对数据库进行定义数据,操纵数据,查询数据,数据控制等。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

一:数据定义语言( DDL):

其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人 数据库目录中获得数据有关的保留字。它也是动作查询的一部分。

DDL是数据定义语言,用来创建,删除,修改,清空“数据表结构的”
          包含关键字:creat    drop  alter  truncate

增加表字段   alter table tname add fname type;

删除多余表字段  alter table tname drop fname;

删除表结构         drop table tname

修改字段名同时可以修改类型   alter table tnmae change oldName newName type

修改表名语法:                         alter table oldName rename newName

清空表结构:即清空表中的所有记录,无法回收 truncate table tname;

复制表:         create table tname2 as select * from tname1;

查看表结构     desc tname

二: 数据操作语言(DML:Data Manipulation Language):

其语句包括动词 INSERT, UPDATE和 DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。

包含关键字:insert into     delete   update

insert into:插入字段
语法1:所有字段都赋值    insert into tname values(val1,val2,...valn);
语法2:部分字段赋值,      insert into tname (fname1,fname2)values(v1,v2);

复制表结构:语法:create table newName like oldName


删除表数据:
语法1:删除所有记录 delete from tname;
语法2:删除指定记录 delete from where条件
 

修改表数据
  语法1:修改某一列上的所有数据    update tname set fname1=v1,fname2=v2;
  语法2:按照条件修改数据。        update tname set fname1=v1,fname2=v2 where 条件
 

当null作为条件,或者修改数据为null时的操作
案例1:将生日为null的记录的分数改为80分:update student set score =80 where sbirth is null;
案例2:将张三的性别修改为null:                   update student set sgender=null where sname='张三';

三: 数据查询语言( DQL:Data Query Language):

其语句,也称为“数据检索 语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字 SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。

关键字:select  单词:选择的含义

语法:select fname1,fname2,......fnamen from tname;
           select * from tnmae;
                     *:通配符,表示所有字段。

四: 数据控制语言(DCL):

它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对 数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对 表单个列的访问。

五:事务控制语言(TCL):

DQL语言的学习:数据查询语言

SQL标准语言中的DQL,用于查询数据。其基本语法可以分成六个部分,我们称之为六个子句

1、一个基本的查询语句,至少包含两个部分(每一个部分称之为子句)
   包含:select子句和from子句
2、还可以包含其他子句:
   如: where子句、group by子句、having子句、order by子句
3、六个子句全存在的语法结构
   select..from..[where子句][group by子句][having子句][order by子句]
4、六个子句的执行顺序

  1.    from子句
  2.    where子句
  3.    group by子句
  4.    having子句
  5.    select子句
  6.    order by子句

5、基本查询语句

   select:选择
   语法1:选择部分字段显示       select field1,field2.... from tableName;
   语法2:选择所有字段显示       select * from tableName;
     *:一个通配符,表示所有字段

6、where子句的学习

作用:在对表进行操作时,起到条件约束限制的作用

语法: where  条件表达式 

(1)关系运算符  >,>=,<,<=,=,!=,<>

(2)连接符          and,or,

(3)范围查询

      [not]  between field1 and field2              范围内:  [field1,field2]闭区间
      between .. and .. 相当于连接符的and
      not between..and..相当于连接符的or 

(4)集合操作:[not] in (集合元素)、>all(集合元素)、any(集合元素)、

      in  (集合元素) 相当于 使用连接符or,对同一字段的"="等式 进行多个值的连接。

      not int (集合元素)  相当于使用连接符and,对同一个字段的"!="不等式进行多个值的连接
 

对于>all(集合元素)、any(集合元素)、            >all(..):查询结果为大于集合中最大的值。
                       >any(..):大于集合中最小的即可。
           

PS:mysql不支持all/any后直接写集合元素,支持all/any后写子查询查询出来的集合。


(5)模糊查询

         关键字:like

         通配符 %:匹配0或0个以上的字符。

         占位符 _: 匹配一个字符。

需求1:查询姓名中含有s的员工姓名,职位,入职日期,部门编号
            select ename,job,hiredate,deptno from emp where ename like '%s%';-----单双引号都可以

需求2:查询姓名中第二个字母是a,工资大于1000的员工姓名,职位,入职日期,部门编号
            select ename,job,hiredate,deptno from emp where ename like '_a%' and sal>1000;


7、order by子句
   对于查询的数据,我们可以按照需求来排序,如升序,降序,此时需要使用order by子句。
   关键字:ASC表示升序,DESC表示降序。默认不写时为升序

 语法:
   order by field1 asc|desc[,field2 asc|desc][...]

查询10号部门员工的姓名、职位,工资,奖金   按照工资降序,奖金升序(工资相同时,奖金排序生效)

          mysql > select ename,job,sal,comm from emp where deptno=10 order by sal desc,comm;


8、分组查询和分组函数
   a.用途:有的时候,我们在查询表时,可能会将数据按照某一字段或多个字段进行分组统计。

   b.而在分组查询时,一般都会涉及到分组函数的应用

   c.语法:group by field1[,field2][...]

   d.在做分组查询时,select子句中,除了分组函数只能写分组字段,不能写其他字段
   e.使用分组函数,一定是分组查询。当不使用group by子句,而使用分组函数,则视整张表为一组。

count(colName):统计指定字段的字段值的记录总数,null值会被忽略。 因此在决定字段时,我们使用通配符*来代替

max(colName):返回指定字段的字段值中的最大值,null值会被忽略。

min(colName):返回指定字段的字段值中的最小值,null值会被忽略。

sum(colName):返回指定字段的字段值的和,null值会被忽略。

avg(colName):返回指定字段的字段值的平均值,null值会被忽略。       


 注意:在使用avg()函数时,因为其忽略空值记录,因此要根据需求考虑是否要将null值记录计算在内,如果想要计算在内的话,我们可以使用这个函数:ifnull(colName,value),它的作用是如果指定的colName对应的值有null,我们就使用value值,否则使用其本身


9、having子句
   在做分组查询时,我们可能需要再次过滤,这个时候需要使用having子句。

   PS:having子句一定要跟在group by子句后面。

查询部门工资总和大于10075的部门号,工资总和,最高工资,最低工资,总人数,按照部门号降序

select deptno,sum(sal),max(sal),min(sal),count(*) from emp group by deptno having sum(sal)>10075 order by deptno;

10、去重查询:distinct
    distinct关键字必须放到select关键字之后
11、别名的使用
    a.列别名    select子句中的字段可以使用别名


      格式:select avg(ifnull(sal,0)) [as] nickName,.......


    b.表别名from子句中的表也可以使用别名


      格式:from tableName nickName

TCL语言的学习:事务控制语言

有时我们可能需要使用DML进行批量数据的删除,修改,增加。比如,在一个员工系统中,我们想删除一个人的信息。除了删除这个人的基本信息外,还应该删除与此人有关的其他信息,如邮箱,地址等等。那么从开始执行到结束就会构成一个事务。对于事务,我们要保证事务的完整性。要么成功。要么撤回。

事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

一、事务的ACID特性:

原子性(atomicity)    事务要么成功,要么撤回。不可切割性。事务的个元素是不可分的,事务是一个完整操作。

一致性(consistency)事务开始前和结束后,要保证数据的一致性。

隔离性(isolation)     当涉及到多用户操作同一张表时,数据库为会每一个用户开启一个事务。那么当其中一个事务正在进                                       行时,其他事务应该处于等待状态。保证事务之间不会受影响。

持续性(durability)    事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了                                       数据库

事务的并发性是指多个事务的并行操作轮流交叉运行,事务的并发可能会访问和存储不正确的数据,破坏交易的隔离性和数据库的一致性。

网状数据模型的数据结构 网状模型 满足下面两个条件的基本层次联系的集合为网状模型。

1. 允许一个以上的结点无双亲;

2. 一个结点可以有多于一个的双亲。 

二、事务的语句

  1.  开始事物:BEGIN TRANSACTION
  2.  提交事物:COMMIT TRANSACTION
  3.  回滚事务:ROLLBACK TRANSACTION

PS:mysql数据库每次执行完DML操作时,会默认commit;

commit

    提交指令,当要向数据库插入一条数据时,必须执行commit语句,否则数据插入不到数据库当中,比如PLsql中,插入一条数据,在当前页面的表格中能够显示出来,但并不是真正将数据插入到了数据库中,而只是有缓存而已,当你在另一个界面打开执行查询语句时并不能查询到插入的数据,所以必须执行commit语句才能真正将数据插入到数据库当中。

   数据库<---commit----DBMS<---insert----客户端
 

三、事务的保存点(事务的验证)
     SAVE TRANSACTION 保存点名称 --自定义保存点的名称和位置
     ROLLBACK TRANSACTION 保存点名称 --回滚到自定义的保存点

四、数据库系统支持两种事务模式: 

  • •自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。 
  • •手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。 

            PS:MySQL中数据库表分为3种类型:INNODB、BDB和MyISAM,其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。

五、事务并发引起的问题: 
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:


1、脏读(dirty read):一个事务读取了另一个事务尚未提交的数据。 
2、幻读(phantom read):一个事务的操作导致另一个事务前后两次读取到不同的数据。 
3、不可重复读(no-repeatable read):一个事务的操作导致另一个事务前后两次读取到不同的数据。 
4、第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。 
5、第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。 

你可能感兴趣的:(可能是漏洞百出的——MySQL(3))