数据库MYSQL-查询

发布于:2022-07-24 ⋅ 阅读:(427) ⋅ 点赞:(0)

增删改

insert 把数据插入到数据表中

insert into <list>(字段列表) values(值列表);
insert into student(name,sex) values('好好','女');

update 对数据库表中的数据进行变更

update <tbname> set 字段名=值[字段名,值],... [where 条件表达式]
update student set sname='好好', where sname='哈哈';  #哈哈改成好好
update student set sname='好好', where sname='哈哈' and id=4;  #哈哈id=4改成好好

delete 删除表中数据记录

delete from <tbname> [where子句]
delete from student where sname=''; #删除姓名为空字符
delete from student where sname is null; #删除姓名为空

   DCL命令

访问权限

grant <权限列表> on 数据库.对象名 to '用户名'@'允许登录的地址' identified by '密码'
  • 权限列表:
  1.         分的细:selete,update,delete,insert
  2.         使用all  privilege代替所有权限
  • 对象名:表table,视图view,过程procedure: *.*代表所有的数据库中的所有对象
  • 若用户名不存在,grant可以创建用户

给root用户分配远程访问的权限【重点】

grant all privileges on *.* to 'root'@'%' identified by 'root123';
flush privileges; #刷新权限缓存

revoke 解除权限

revoke <权限列表> on 数据库名.对象名 from '用户名'@'允许登录的地址'

收回dbtester对woniusales数据库的插入数据权限
revoke insert on woniusales.* from 'dbtester'@'%';

三大范式

范式:normal format设计数据库表的标准格式。

  • 第一范式:表(二维表)中的字段不可拆分。

        问题:数据的新增、删除、修改都会产生异常。

  • 第二范式:表中的每一行必须唯一(避免出现重复数据),非主键必须完全依赖主键(可能会使用复合主键)。

        建表时必须设立主键,能用一个主键不用两个。~~第二范式继承第一范式的问题。

  • 第三范式:每列都和主键直接相关,而不是间接相关。

        拆分表格 ~~外键约束表与表之间的完整性。

DQL

单表查询

1、select 筛选数据

select 字段名,字段名,...from 表名 [where子句][group by分组字段][having子句][order by子句][limit分页条件]
#查询2000-1-1之后的女学生姓名
select sname,sbirthday from student where sbirthday>'2000-1-1' and ssex='女';
select * from table where age between 18 and 30;

排序

关键字:order by

排序类型:升序:ASC       降序:DESC

order by 字段名 ASC|DESC
#查询成绩,分数倒序
select * from score order by degree desc;
#查询成绩,学号倒序
select * from student order by sno;

多字段排序

order by 字段名1 ASC|DESC,字段名2 ASC|DESC...
#查成绩,分数倒序,学号升序
select * from score order by degree desc,sno;

模糊查询

where 字段名 like 表达式;

 表达式和通配符

%:代表任意个任意字符

_:代表任意的一个字符

注:表达式中通配符可以放多个,也可以放在字符串的任意位置。

#查询张姓同学
select * from student where sname like '张%';
#查询张姓或李姓同学
select * from student where sname like '张%' or like '李%';

查重

select distinct 字段列表 from tablename [where 子句]
#对被统计字段进行先去重后统计
select count(distinct degree) from tablename;

distinct的位置【难点】

  1. 放在select后面,对筛选出来的记录去重
  2. 放在函数里面,对被统计的字段去重

分页查询

控制查询返回的记录数量

关键字limit

limit x,y
x:表示查询起点的行数,从0开始计数,缺省就是0(可以不写,默认是0),即第一条记录。
y:表示需要返回y行

#查询最高分
select * from score order by degree desc limit 1;
select * from score order by degree desc limit 0,1;
#查询前三
select * from score order by degree desc limit 3;

分组查询和聚合函数

聚合函数:对指定字段进行统计计算,计算的结果只有一个。

sum():求和

#查询表中degree的总和
select sum(degree) from demo;

count(字段名|*|数字):计数

#查询demo中班级的数量,当字段名为参数时,会自动筛选非空记录
select count(class) from demo;
select count(1) from demo where class is not null;

avg():求平均值

max():求最大值

min():求最小值

聚合函数中去掉null记录的简便写法

ifnull(字段名,0) : 如果字段的值为null,则使用0代替

#查询demo表中的degree平均值
select avg(ifnull(degree,0)) from demo;

分组查询

select 分类字段,聚合函数(字段名) from tablename group by 分类字段 [having 子句];
select ssex,count(*) from student group by ssex;

#查询班上男生人数
select count(*) from student where ssex='男';
#查询每科成绩的平均值
select cno,avg(degree) from score group by cno;

having子句

对分组后的记录进行筛选

#查询每个学员的平均分及格的记录
select sno,avg(degree) from score group by sno having avg(degree)>=60;
select sno,avg(degree) from score group by sno having avg(degree)>=60 and sno>102;

having和where的区别

  1. 作用对象不一样:having作用于分组后的数据,where是作用于分组前的数据。
  2. 位置不一样:having只能放在group by后面,where只能放在group by前面。

查询中的别名系统

别名的作用:把复杂的表达式简单化,将子查询的返回的数据作为表使用

select sno,avg(degree) as avgrlt from score group by sno having avgrlt>=60;

别名的两种写法:

  1. 字段名 as 别名
  2. 字段名     别名

别名影响的对象

  1. 字段
select s.sname 姓名,s.sbirthday from student s
select s.sname,s.sbirthday from student s


网站公告

今日签到

点亮在社区的每一天
去签到