Mysql基础
一、数据库基础知识
1、数据的发展史
a、没有数据库阶段,使用磁盘文件存储数据
b、层次结构模型数据库
c、网状结构模型数据库
d、关系型结构数据库(使用二维表来存储数据)
e、关系-对象模型数据库
2、市面上的数据库
a、Oracle 甲骨文
b、DB2 IBM
c、SQL Server 微软
d、Sybase 赛尔斯
e、MySql 开源-->SUN-->Oracle
f、MongoDB
g、Redis
3、主要学习的数据库(以MySQL来学习)
DBA职位
RDBMS(关系型数据库管理系统)Rational Database Management System 数据管理系统,包括一个管理角色的和多个数据仓库,一个仓库中包含多个数据表,一个数据表中包括两个部分(表结构、表记录),表结构指的是数据表的列名称和列类型,表记录(即表数据)指的是表中的数据。
注意:
管理员与数据库的关系
数据库与数据表、视图、索引、存储过程的关系
数据表与表结构、表记录的关系
4、MySQL的目录结构
a、bin
b、my.ini文件是MySQL的总配置文件,后面需要使用
二、SQL语言
1、ISO国际标准化
国际标准化组织ISO统一SQL语言
C89 C99 --- C语言的ISO标准
ISO发布的版本
SQL-92
SQL:1992
SQL:2003
2、SQL语言分类
a、DDL(Data Definition Language)
数据定义语言,用来定义数据库对象:库、表、列等
b、DML(Data Manipulation Language)
数据操作语言,用来定义数据库记录(数据)
c、DCL(Data Control Language)
数据控制语言,用来定义访问权限和安全级别
d、DQL(Data Query Language)
数据查询语言,用来查询记录(数据)
3、SQL语法
a、SQL可以使用空格和缩进进行格式化
b、每一条sql语句使用分号结尾
c、SQL对于大小写要求不严格,但是建议SQL的关键字使用大写
d、远程连接mysql
mysql -h host -u username -p password
e、mysql的提示符
mysql> 准备好接受新命令。
->等待多行命令的下一行。
'>等待下一行,等待以单引号(“'”)开始的字符串的结束。
">等待下一行,等待以双引号(“"”)开始的字符串的结束。
`>等待下一行,等待以反斜点(‘`’)开始的识别符的结束。
/*>等待下一行,等待以/*开始的注释的结束。
================================================================
###DDL 数据定义语言(DDL的操作存在两部分的操作:对数据库的操作、对表结构的操作)
1、对数据库的操作
a、查看所有的数据库
show databases;
b、切换数据库
use 数据库名称;
c、创建数据库
create database [if not exists] 数据库名 [charset=utf8];
d、删除数据库
drop database [if exists] 数据库名;
e、修改数据库编码
alter database 数据库名 character set utf8;
f、显示数据库的编码格式
show create database 数据库名;
2、对表结构的操作
a、首先介绍一下SQL语言中的数据类型
① int 整型
② double 使用格式double(5,2)表示最多包含五位数字,其中有两位小数,即:表示的最大值为999.99
③ decimal 浮点型 主要使用在金融行业(例如手机支付等)使用格式decimal(5,2)这是一种二进制运算无差错的数据类型
④ char 固定长度字符串类型,使用格式char(x)x的最大取值是255,这里的255等数字表示的是字节数目
⑤ varchar 可变长度字符串类型 使用格式varchar(x),x的最大取值是65535,对于可变长字符串类型,需要使用一部分空间来记录本类型的长度,存在浪费
举例: 2014-12-12 22:10:12 假如存储这个字符串的时候,这个字符串长度为19,那么使用char(20)就足够,但是假如使用varchar(20)的话,可能由于要使用一部分空间来存储数据,导致不能将整个字符串存储下来
⑥ text 字符串类型,表示大字符串,细分为四种:longtext mediumtext text tinytext
⑦ bolb 字节类型,表示大字节,同样分为四种
⑧ date 日期类型,格式为:yyyy-MM-dd
⑨time 时间类型,格式为:hh:mm:ss
⑩、timestamp 时间戳类型 格式为:年月日+时分秒+毫秒
b、查看表结构
desc 表名称;
c、创建表
create table 表名称(列名称 列类型,列名称 列类型,列名称 列类型......)在最后一个列的后面没有逗号
d、查看数据库中所有的表名称
show tables;
e、删除表
drop table 表名称;
f、修改表
① 添加列 alter table 表名称 add(列名 列类型,列名 列类型,列名 列类型......);
② 修改列类型 alter table 表名称 modify 列名 新列名;
③ 修改列名和列类型 alter table 表名称 change 老列名 新列名 列类型;(列类型可以是新的类型也可以是老的类型,若为老类型则表示只更改了列名称)
④ 删除列 alter table 表名称 drop 列名称;
⑤修改表名称 alter table 表名 rename to 新表名称
###DML数据操作语言
注释:主要针对表记录(表数据)的更新操作
1、插入记录
insert into 表名称 (列名称,列名称,列名称...) values(列值,列值,列值...);
当想要插入整条数据的时候,前面部分的列名称列表可以不写,只在后面给值即可
insert into 表名称 values(列值,列值...列值); 这个时候值得顺序要和数据表中定义的列的顺序一致
注意事项:
a、日期型数据和字符型数据必须使用单引号括起来
b、插入空值有两种方式:a、不指定值 b、设置values为null
c、未插入的列的值使用null补充
d、insert操作的时候前后两个部分的顺序要一致,包括数据类型和数据顺序
2、修改表记录
普通修改
update 表名称 set 列名称=列值,列名称=列值,列名称=列值...;
注释:在没有添加条件的时候,会默认修改对应列名称下面的所有记录为上面的列值,这是不合理的
有条件修改,用于局部的修改,根据条件进行修改
update 表名称 set 列名称=列值,列名称=列值...[where 条件];
[注释]:条件一般是结果为boolean类型数据
3、删除表记录
delete from 表名称 [where 条件];
4、一个特殊的删除方式
truncate table 表名称; truncate 方法不是DML的操作,它是DDL的操作,它做的是对表结构的更改
上面的语句包含两个部分:a、drop table 表名称; 删除了表 b、create table 表名称; 创建了名称为之前的名字的新表
5、对上面的c、d两个区别的比较
使用delete操作可以回滚,即:数据可以恢复
使用truncate操作数据不可回滚,即:数据不可恢复
演示:start transaction;
delete * from student;
rollback; 回滚操作
6、对于MYSQL语言的运算符
a、between...and
update tbl_student set s_gender='M' where s_age >= 10 and s_age <= 20;
update tbl_student set s_gender='F' where s_age between 10 and 20;
b、in(.....)
update tbl_student set s_name='xxx' where s_name='zhangsan' or s_name='lisi‘;
update tbl_student set s_name='xxx' where s_name in ('zhangsan','lisi');
c、not
d、is null
update tbl_student set s_name='yyy' where s_age=null;这样操作是错误的-----为什么?=null不会报错,=‘null’也不会报错,但是结果不会被修改。
update tbl_student set s_name='yyy' where s_age is null;
当书写sql语句的时候,当出现了null的时候,不能使用等号,必须使用is null
###DCL数据控制语言
注释:DCL是root这个超级管理员所使用的操作,主要用啦对其他数据库的操作用户进行设置
1、创建用户
create user 用户名@IP地址 identified by 密码;
例:create user zhagsan@localhost identified by ‘1234’;
当想要使用这个账户登录系统的时候
mysql -uzhangsan -p1234
2、给用户授权
grant 权限1,权限2,权限3... on 数据库名称.* to 用户名@'IP地址';
数据库名称.* :表示数据库的所有文件包括记录表、其他文件等等
权限:CREATE/ALTER/DROP/INSERT/UPDATE/DELETE/SELECT
3、撤销授权
revoke 权限1,权限2,权限3... on 数据库名称.* to 用户名@'IP地址';
4、查看权限
show grants for 用户名@'IP地址';
5、删除用户
drop user 用户名@'IP地址';
###DQL数据查询语言
1、基本查询
a、普通查询
select * from 表名称; 查询该表中的所有数据
b、列控制查询,即:查询指定列
select 列名称,列名称。。。 from 表名称;
c、去重复查询,关键字 distinct
select distinct 列名称 from 表名称;
d、使用运算符进行查询
注意:任何数据和null进行操作的时候,都会称为null,应该使用if null (列名称,期望值)
假设情况:当进行工资计算的时候,当需要计算工资和奖金的总和的时候,有的人不存在奖金表单中职位null
这个时候进行计算工资总和的时候,就要使用到if null (列名称,期望值)
select ename,sal + if null(comm,0) from emp;
select ename,sal + if null(comm,0) [as] salary from emp;
e、给结果集起别名
上面的sal + if null(comm,0)得到的结果是一个结果集,可以对这个结果集进行命名使用关键字as---ifnull no " "!!!
select ename,sal + if null(comm,0) as salary from emp; 其中as可省略
f、字符拼接
当想要在输出的内容中,显示更好的输出样式,可以加上文字描述
select ‘我的名字是:’+name from student; 这种方式是错误的,因为在mysql中不能使用”+“作为字符串连接符
应该使用的是concat
select concat('我是一名员工,我叫:',ename)[as aaa] from emp; 在这句话 中concat实现了字符连接的操作
g、基本条件查询
select * from emp where='文员';
select * from emp where sal betwwen 2000 and 3000 anddeptno=30;
h、模糊查询
select * from emp where name like '张_';
select * from emp where name like '张_ _';
select * from emp where name like '_ _亮';
select * from emp where name like '_ _ _';
select * from emp where name like '张%';
select * from emp where name like '%张%';
select * from emp where name like '%';
2、排序查询注释:关键字:order by
a、单列排序
select * from 表名称 order by 列名称 [asc\desc]; 方括号中表示可选择内容,不写的时候默认为asc,表示升序、desc表示降序
b、多列排序
select * from 表名称 order by 第一列 [asc\desc],第二列 [asc\desc];
当经过第一列的排序之后,存在某几个具有相同的值得时候,采用第二列的条件再排序
3、聚合函数查询--UDAF
注释:聚合函数的运算时纵向的运算
a、count()
count(*):*表示所有列,计算有效行的数目,假如一行中所有列都为null,那么这行为无效记录,当括号中放入数字的时候,效果与*相同,表示所有列;
count(xx):xx表示列名称,计算指定列的有效行数目,若在这一列中,某一行存在null,那这一行为无效行
b、sum(列名称) 求某一列的和
c、max(列名称) 求某一列中的最大值
d、min(列名称) 求某一列中的最小值
e、avg(列名称) 求某一列的平均值
4、分组查询
注释:使用哪个条件进行分组,这个条件必须是组信息,当使用非组信息查询的时候,虽然语法上是正确的,但是不符合要求
分组一般和聚合函数一起使用
select 要查询并显示的内容 可以放*或列名称或聚合函数(UDAF)
from 想要查询的表 具体的表
where 分组前条件 不可放聚合函数
group by 分组信息 列名称
having 分组后条件 可以放聚合函数
order by 对最终结果的操作 可放UDAF
5、MySql的特有:limit
注释:对于limit只在MySql中才有,其他数据库中不存在,而且Oracle数据库中也不存在
a、limit语法结构:select * from 表名称 limit m,n;
查询5行记录,从0行开始
select * from 表名称 limit 0,3;
查询10行记录,从3行开始
select * from 表名称 limit 3,10;
注解:对于上面的语法limit后面跟着两个数字,第一个数字m:表示起始行,第二个数字n:表示要查询并显示的行数
b、拓展
问:查询工资最高的员工的信息,在emp表中
SELECT * FROM emp ORDER BY sal DESC LIMIT 0,1;
还可以使用子查询来操作
SELECT * FROM (SELECT * FROM emp ORDER BY sal DESC) e LIMIT 0,1;
c、分页显示
① 关于页数的计算
总页数=总记录条数%每页记录条数==0?总记录条数/每页记录条数:总记录条数/每页记录数+1;
②假如查询某一页数据并显示
select * from 表名称 limit (要查询的页码-1)*每页记录数,每页记录条数;
--------------------- 本文来自 Zzreal 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zonzereal/article/details/78586943?utm_source=copy