欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL关于命令的问题、Exists关键字

程序员文章站 2022-09-17 12:57:55
truncate 与 delete 的区别 truncate table :删除内容、不删除定义、释放空间。 delete table : 删除内容、不删除定义、不释放空间。 drop table :删除内容和定义,释放空间。 1、truncate table 表名,只能删除表中全部数据。 dele ......

truncate 与 delete 的区别

truncate table :删除内容、不删除定义、释放空间。

delete table : 删除内容、不删除定义、不释放空间。

drop table :删除内容和定义,释放空间。

1、truncate table 表名,只能删除表中全部数据。

delete from 表名 where...,可以删除表中的全部数据,也可以删除部分数据。

2、delete from 记录是一条条删的,所删除的没行记录都会进日志,而truncate一次性删掉整个页,因此日志里面只记录页释放。

3、truncate删除后,不能回滚。delete可以回滚。

4、truncate的执行速度比delete快。

5、delete执行后,删除的数据占用的存储空间还在,还可以恢复数据。truncate删除的数据占用的存储空间不在,不可以恢复数据。

sql的授权语句和收回权限语句

grant 权限 on 数据库对象 to 用户

  grant insert on scott.employees to user1,user2;

  grant delete on scott.employees to user1,user2;

  grant select on scott.employees to user1,user2;

  grant update on scott.employees to user1,user2;

revoke 权限 on 数据库对象 from 用户

怎么新加一行记录、怎么添加一个列字段,修改列?

插入一行数据:

  insert into stu(stuname,stuage,stusex)values('张三','20','男')

增加列:

  alter table tablename add (column)columnname varchar(30)

删除列:

  alter table tablename drop (column) columnname

select count(*) 和 select count(数字)以及select count(column)区别

  count(*)跟count(1)的结果一样,返回记录的总行数,都包括对null的统计,而count(column)是不包括null的统计。

 执行效果上:

  count(*)包括了所有的列,相当于行数,在统计结果的时候,包含null;

  count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,包含null;

  count(列名)只包括列名那一列,在统计结果的时候,不包含null;

 执行效率上:

  列名为主键,count(列名)会比count(1)快;列名不为主键,count(1)会比count(列名)快;

  如果表多个列并且没有主键,则count(1)的执行效率优于count(*);

  如果有主键,则count(主键)的执行效率是最优的;如果表只有一个字段,则count(*)最优。

exists关键字的使用方法

  exists关键字表示存在。使用exists关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。

  如果内层查询语句查询到符合条件的记录,就返回一个真值(true),否则,将返回一个假值(false):

    当返回的值为true时,外层查询语句将进行查询;

    当返回的值为false时,外层查询语句将不进行查询或者查询不出任何记录。

实例1

  如果department表中存在d_id取值为1003的记录,则查询employee表的记录。select语句的代码如下:

  select * from employee

      where  exists

        (select d_name from department where d_id=1003);

  因为department表中存在d_id值为1003的记录,内层查询语句返回一个true,外层查询语句接收true后,开始查询employee表中的记录。因为没有设置查询employee表的查询条件,所以查询了employee表的所有记录。

实例 2

  exists 关键字可以与其他的查询条件一起使用。条件表达式与exists关键字之间用and或者or进行连接。

  如果department表中存在d_id取值为1003的记录,则查询employee表中age大于24岁的记录。select语句的代码如下:

  select * from employee

      where age>24 and exists

        (select d_name from department where d_id=1003);

  因为,当内层查询语句从department表中查询到记录,返回一个true,外层查询语句开始进行查询,根据查询条件,从employee 表中查询出age大于24岁的两条记录。

实例 3

  not exists 与 exists正好相反。使用 not exists关键字时,当返回的值是true时,外层查询语句不进行查询或查询不到任何记录;当返回值是false时,外层查询语句将进行查询。

  如果department表中不存在d_id字段取值为1003的记录,则查询employee表的记录。select 语句的代码如下:

   select * from employee

      where not exists

        (select d_name from department where d_id=1003);

判断表的字段值是否为空

  1、查询字段为空的语法:where<字段名>is null

  2、查询字段值不为空的语法:where <字段名>is not null 或者 where not(<字段名>is null)

有一个学生表,有三个字段:name、course、score,每一个学生都有三门课程,比如数学、语文、英语,写sql语句,查找出三门课程的成绩都大于80的学生。

  采用逆向思维。求三门成绩都达于80的人,也可以是使先查出有成绩小于80的人,再除去这些人就是三门成绩都大于80的人了。

方法1:

  select distinct a.name from student  a

            where a.name not in

              (select distinct s.name from student s where s.score<80);

方法2:

  select s.name from student  s  group by  s.name  having  min(s.score)>=80;