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;