MySQL进阶

一、MySQL函数

1、聚合函数

只有 select 子句和 having 子句、order by子句中能使⽤聚合函 数,where 子句不能使用聚合函数。当使用聚合查询以后,不能使用where条件,如果要添加条件,就使用having。

2、其他常用函数 

1.日期函数

2.数字函数

3.字符串函数

二、MySQL分组查询

语法:

select 聚合函数(表头名 1),表头名 2 from 数据表名 group by 表 头名;

select 聚合函数(表头名) 临时表头名,真实表头名 from 数据表名 group by 真实表头名;

若用 group by 分组查询语句,必须加入聚合函数,否则报错(踩坑)。

实例:

mysql> create database test default character set=utf8mb4;
Query OK, 1 row affected (0.01 sec)

mysql> use test;
Database changed

新建⼀个学生表,表头有:序号,数字形式;姓名,文本字符串形式;年龄,数字形式;班级,数字形式。
mysql> create table 学生表(序号 int,姓名 char(16),年龄 int,班级 int);
Query OK, 0 rows affected (0.02 sec)

 向学生表插入信息 

mysql> insert into 学生表 values(1,'tom',15,101);
Query OK, 1 row affected (0.02 sec)

mysql> insert into 学生表 values(2,'mike',16,102);
Query OK, 1 row affected (0.00 sec)

mysql> insert into 学生表 values(3,'john',16,102);
Query OK, 1 row affected (0.00 sec)

mysql> insert into 学生表 values(4,'lili',15,103);
Query OK, 1 row affected (0.00 sec)

mysql> insert into 学生表 values(5,'jack',15,103);
Query OK, 1 row affected (0.01 sec)

mysql> insert into 学生表 values(6,'xiaoming',16,101);
Query OK, 1 row affected (0.00 sec)

查看表内学生信息 

 

计算所有学⽣平均年龄,avg:计算平均值,计算⾮数字,结果为0

mysql> select avg(年龄) from 学生表; 

 

通过group by语法计算每个班的学⽣平均年龄

 mysql> select avg(年龄) from 学生表 group by 班级;

“平均年龄”:这个是⾃⼰临时命名的表头名,也可以不写 

mysql> select avg(年龄),班级 from 学生表 group by 班级; 

avg也可以改成min最⼩值、max最⼤值、sum加法函数等运算⽅式

mysql> select min(年龄) 最小年龄,班级 from 学生表 group by 班级; 

也可以⽤count统计函数计算每个班的总⼈数 #这些count、avg、max、min、sum就是聚合函数,分组查询必须 有这些函数的其⼀。

 mysql> select count(*) 总人数,班级 from 学生表 group by 班级;

 三、MySQL子查询语句

子查询是指一个查询语句嵌套在另⼀个查询语句内部的查询; 该查询语句可以嵌套在⼀个 SELECT、SELECT...INTO、 INSERT...INTO 等语句中。

在执行查询时,⾸先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。

在子查询中通常可以使用比较运算符和 IN、EXISTS、ANY、 ALL 等关键字。 例如:select * from class where cid=(select classid from student where sname='张三');

1.比较运算符的子查询

也就是用“=”、“、“>”这类比较运算符

创建班级表

mysql> create table class(cid int(4) not null primary key, cname varchar(20)); 
Query OK, 0 rows affected, 1 warning (0.01 sec)

创建学生表

mysql> create table student (sid int(4) not null primary key, sname varchar (20), sage int (2),  classid int (4) not null); 
Query OK, 0 rows affected, 3 warnings (0.02 sec)

向班级表插入数据 

mysql> insert into class values(1001, 'Java');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(1002, 'C++');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(1003, 'Python');
Query OK, 1 row affected (0.01 sec)

mysql> insert into class values(1004, 'PHP');
Query OK, 1 row affected (0.00 sec)

mysql> insert into class values(1005, 'Android');
Query OK, 1 row affected (0.00 sec)

 向学生表插入数据

mysql> insert into student values(1, '张三',20,1001);
Query OK, 1 row affected (0.00 sec)
insert into student values(2, '李四' ,21,1002);

insert into student values(3, '王五' ,24,1003);

insert into student values(4, '赵六' ,23,1004);

insert into student values(5, '⼩明' ,21,1001);

insert into student values(6, '⼩红' ,26,1001);

insert into student values(7, '⼩亮' ,27,1002);

查询张三同学所在班级的信息

 查询⽐张三同学所在班级编号还⼤的班级的信息

2.exists 关键字的子查询 

 exists 关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回 true 或 false。⽽当返回值为 true 时外层查询才会执行。相当于内层句子是一个判断句式。

假如王五同学在学生表中则从班级表查询所有班级信息

mysql> select * from class where exists (select * from student where sname='王五');

 四、MySQL多表联合查询

1.交叉连接查询

交叉连接返回的结果是被连接的两个表中所有数据⾏的笛卡尔 积;⽐如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为 {(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)。所以,交叉连接也被称为笛卡 尔连接。 语法: select * from 表1 cross join 表2;

两个表交叉连接,class表的cid和student表的classid相乘 

两个表交叉连接,class表的cid和student表的classid相乘

 2.多表联合查询

语法:select 查询字段1,查询字段2, ... from 表1 join 表2 join ... on 表1.关系字段=表2.关系字段=...;

join:联合 on:条件

查询学生姓名及其所学习的学科

mysql> select sname,cname from student inner join class on student.classid=class.cid;

五、MySQL 授权

1.MySQL基础权限

2.权限语法 

为客户机授权:

grant all on 库.* to 用户@客户机地址 identified by '密 码';all:表示所有权限,可替换为其他权限库.*:表示某个数 据库下所有数据表用户@客户机地址:表示希望给予哪个用户权限,前面的用户是临时自建用户,当客户机登录时,用该用户登录'密码':临时自建用户的密码,也是临时自写的

客户机地址可以有以下表现形式: %:表示所有地址 192.168.33.%:表示 33 网段下所有主机,⼀般为你想为哪个网段授权,或为自己网段下的主机授权。

mysql> grant all on *.* to haha@'192.168.100.%' identified by '123456';

# 为haha⽤户进⾏授权

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;

# 刷新权限

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for haha@'192.168.100.%';

# 查看 haha的权限

+------------------------------------------------- ------+

| Grants for haha@192.168.100.% |

+------------------------------------------------- ------+

| GRANT ALL PRIVILEGES ON *.* TO 'haha'@'192.168.100.%' |

+------------------------------------------------- ------+

1 row in set (0.00 sec)

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值