欢迎光临
我们一直在努力

MySQL基础(第三弹)

目录

MySQL中的一些内置函数

1.日期函数

2. 字符串函数

3.数学函数

4 其他函数

关于复合查询

1.基本查询的回顾

2.多表查询

3.自连接

4.子查询

4.1   单行子查询

4.2 多行子查询

4.3 多列子查询

4.4 在from子句中使用子查询

4.5 合并查询

4.5.1 union

4.5.2 union all

表的内连和外连

1.内连接

2.外连接

2.1左外连接

2.2右外连接

视图

1.基本使用

2.视图规则和限制

用户管理

1.用户

1.1 用户信息

1.2 创建用户

1.3 删除用户

1.4 修改用户密码

1)自己修改自己密码

2)root用户修改指定用户的密码

2. 数据库的权限

2.1 给用户提权

注:特定用户查看现有权限

2.2 回收权限


MySQL中的一些内置函数

1.日期函数

获得年月日

获得时分秒

获得时间戳

在日期的基础上加时间

在日期的基础上减去时间

计算两个日期之间相差多少天

案例1:

创建一张表,记录生日

添加当前日期

案例2:

创建一个留言表

插入数据

显示所有留言信息,发布日期只显示日期,不用显示时间

查询在2分钟以内发布的帖子

2. 字符串函数

charset(str) 返回字符串字符集
concat(string2,【,……】) 连接字符串
instr(string,substring) 返回substring在string中出现的位置,没有返回0
ucase(string2) 转换成大写
lcase(string2) 转换成小写
left(string2,length) 从string2中的左边起取length个字符
length(string) string的长度
replace(str,search_str,replace_str) 在str中用replace_str替换search_str
strcmp(string1,string2) 逐字符比较两字符串大小
substring(str,position,【,length】) 从str的pisition开始,取length个字符
lrtim(string) rtrim(string)trim(string) 去除前空格或后空格

案例:

获取emp表的ename列的字符集

要求显示exam_result表中的信息,显示格式为:“xxx的语文是xxx分,数学xxx分,英语xxx分”

求学生表中学生姓名占用的字节数

注意:length函数返回字符串长度,以字节为单位,如果是多字节字符则计算多个字节数。如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

将emp表中所有名字中有 ‘S’ 的替换成 ‘上海’

截取emp表中ename字段的第二个到第三个字符

以首字母小写的方式显示所有员工的姓名

3.数学函数

函数名称 说明
abs(number) 绝对值函数
bin(decimal_number) 十进制转换成二进制
hex(decimaNumber) 转换成十六进制
conv(number,from_base,to_base) 进制转换
ceiling(number) 向上取整
floor(number) 向下取整
format(number,decimal_places) 格式化,保留小数位数
rand() 返回随机浮点数,范围【0.0,1.0】
mod(number,denominator) 取模,求余

绝对值

向上取整

向下取整

保留2位小数(小数四舍五入)

产生随机数

4 其他函数

user()查询当前用户

md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串

database()显示当前正在使用的数据库

ifnull(val1,val2)如果val1为null,返回val2,否则返回val1的值

关于复合查询

在实际的开发中,不只是对一张MySQL表进行查询。

1.基本查询的回顾

查询工资高于500或者岗位为MANAGER的雇员,同时还要满足他们的姓名首字符为大写的J

按照部门号升序而雇员的工资降序排序

使用年薪进行降序排序

显示工资最高的员工的名字和工作岗位

显示工资高于平均工资的员工信息

显示每个部门的平均工资和最高工资

显示平局工资低于2000的部门号和它的平均工资

显示每种岗位的雇员总数,平均工资

2.多表查询

实际开发中往往数据来自于不同的表,所以需要多表查询。此处我还是用经典的三张表emp,dept,grade来演示。

案例:

显示雇员名,雇员工资以及所在部门的名字因为上面的数据来自于emp和dept表,因此要联合查询

其实我们只要emp表中的deptno=dept表中的deptno字段的记录

显示部门号为10的部门名,员工名和工资

显示各个员工的姓名,工资,以及工资级别

3.自连接

自连接是指在同一张表连接查询

案例:

显示员工ford的上级领导的编号和姓名(mgr是员工领导的编号—empno)

使用的子查询:

使用多表查询(自查询):

使用到表的别名

from emp leader,emp,worker,给自己的表起别名,因为要先做笛卡尔积,所以别名可以先识别

4.子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。

4.1   单行子查询

返回一行记录的子查询

显示SMITH同一个部门的员工

4.2 多行子查询

返回多行记录的子查询

in关键字:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10号自己的

all关键字:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

any关键字:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包括自己部门的员工)

4.3 多列子查询

单行子查询是指子查询只返回单列,单行数据。多列子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。

案例:查询和SMITH的部门和岗位完全相同的所有雇员,不包含SMITH本人

4.4 在from子句中使用子查询

子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。

案例:

显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资

查找每个部门工资最高的人的姓名、工资、部门、最高工资

显示每个部门的信息(部门名、编号、地址)和人员数量

方法1:使用多表查询

方法2:使用子查询

4.5 合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符union,union all

4.5.1 union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。

案例:将工资大于2500或职位是MANAGER的人找出来

4.5.2 union all

该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。

案例:将工资大于2500或职位是MANAGER的人找出来

表的内连和外连

表的连接分为内连和外连

1.内连接

内连接实际上就是利用where子句对两种表形成笛卡尔积进行筛选,也是在开发过程中使用最多的连接查询。

语法:(注:前面使用都是内连接)

SELECT   字段   FROM   表1   inner   JOIN   表2   ON   连接条件  AND   其他条件

案例:显示SMITH的名字和部门名称

使用之前的写法:

使用标准的内连接写法:

2.外连接

外连接分为左外连接和右外连接。

2.1左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接。

语法:

SELECT   字段名   FROM   表名1   LEFT    JOIN   表名2   ON   连接条件

案例:先建立两张表

查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

注意:当左边表和右边表没有匹配时,也会显示左边表的数据

2.2右外连接

如何联合查询,右侧的表完全显示我们就说是右外连接。

语法:

SELECT   字段   FROM   表名1   RIGHT   JOIN   表名2   ON   连接条件;

案例:

对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来。

视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

1.基本使用

创建视图

CREATE  view  视图名称  as  select语句;

案例:

修改了视图,对基表数据有影响

修改基表,也会对视图有影响

删除视图

DROP  view 视图名称;

2.视图规则和限制

1)与表一样,必须唯一命名(不能出现同名视图或者表名)。

2)创建属兔数目无限制,但是要考虑复杂查询创建为视图之后的性能影响。

3)视图不能添加索引,也不能有关联得触发器或者默认值。

4)视图可以提高安全性,必须具有足够的访问权限。

5)order by 可以用在视图中,但是如果从该视图检索数据select中也含有order by,那么该视图中的order by将被覆盖。

6)视图可以和表一起使用。

用户管理

如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。

1.用户

1.1 用户信息

MySQL中的用户,都存储在系统数据库MySQL的user表中。

字段解释:

1.host:表示这个用户可以从哪个主机登录,如果是localhost,表示只能从本机登录。

2.user:用户名。

3.authentication_string:用户密码通过password函数加密后的。

4. *_priv:用户拥有的权限。

1.2 创建用户

语法:

CREATE user  ‘用户名’@‘登录主机/IP’   identified  by   ‘密码’

注:localhost表示本地主机IP,%表示任意主机IP都可以。

案例:

此时便可以使用新账号新密码进行登录啦~~~

关于新增用户这里,大家要注意,不要轻易添加一个可以从任意地方登录的user~~~

1.3 删除用户

语法:

DROP user ‘用户名’@‘主机名’

案例:

此时已经删除这个zhangsan用户~~~

1.4 修改用户密码

语法:

1)自己修改自己密码

ALTER USER  USER()  identified  by  '你的新密码';

2)root用户修改指定用户的密码

ALTER  USER   ‘用户名’@‘主机名’   identified  by  ‘你的新密码’;

2. 数据库的权限

MySQL数据库提供的权限列表:

2.1 给用户提权

刚创建的用户没有任何权限,需要给用户授权。

语法:

grant 权限列表 on 库.对象名 to '用户名'@'登录位置' [identified by '密码'];

说明:

1.权限列表,多个权限用逗号分开。

grant select on ……//单个权限

grant select,delete,create on ……//多个权限

grant all [privileges]  on ……   //表示赋予该用户在该对象上的所有权限

2. *.* :代表本系统中的所有数据库的所有对象(表、视图、存储过程等)。

3.库.*:代表某个数据库中所有数据对象(表、视图、存储过程等)。

4.identified by 可选。如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户~~~


案例:

a)使用root账号,在终端A下面

给用户zhangsan赋予对test_user数据库下所有文件的select权限

b)使用zhangsan账号,在终端B下面

注:特定用户查看现有权限

show grants for ‘用户名’@‘主机名’;

注意:如果发现赋权之后,没有生效,需要执行如下指令:

flush privileges;

2.2 回收权限

语法:

revoke  权限列表  on 库.对象名 from ‘用户名’@‘登录位置’;

案例:

回收zhangsan用户对test_user数据库的所有权限。

以root身份,在终端A下

以zhangsan身份,在终端B下

赞(0)
未经允许不得转载:171主机测评 » MySQL基础(第三弹)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址