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

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;