MySql(1)......

数据库

数据库的概念: 用于存储以及统计数据的仓库, 永久存储(硬盘)

持久化: 把内存中的数据保存到存储介质过程称为持久化

数据库发展的历史:

  • 没有数据库, IO流操作文件
  • 层次结构模型数据库
  • 网状结构模型数据库
  • 关系结构模型数据库 现在主流, mysql
  • 关系对象型数据库: 未来的

关系型数据库: 使用二维表存储数据, 一旦表结构确定了, 修改表结构比较困难

主流的关系型数据库:

  • Oracle 甲骨文 要钱 大型项目,
  • DB2:IBM;中大型项目 要钱
  • SQL Server:微软; 中大型项目 C# .net 要钱
  • Sybase:赛尔斯; 中大型项目
  • MySQL:甲骨文; 小型 之前开源免费

设计关系型数据库时,遵循3大范式

  • 第一范式(1NF)数据库表中的所有字段值都是不可分解的原子值
  • 第二范式(2NF)在第一范式的基础上,表中只存在一个或一组字段可以推出其他所有字段,不能出现第二个这样的一个或一组字段
  • 第三范式(3NF)在第一,和第二范式的基础上,主键可以直接推出所有字段,而不存在间接推出;

MySQL

mysql介绍
  • mysql是一个开源的关系型数据库管理系统,现在是oracle公司旗下的一款产品,由C和C++语言编写,可移植性高。支持 在多种操作系统上安装,最常见有AIX,linux,window。

  • 默认端口 :3306

  • 登录命令:mysql -u用户 -p密码

  • mysql关系数据库中,库、表概念

  • 库:数据仓库的意思,存储着一定数据结构的数据,关系数据库中,存储的是若干个表,

  • 表:每一张表是由行和列组成,每记录一条数据,数据表就增加一行。列是由字段名 与字段数据属性组成,我们称之列为字段,每一个字段有着多个属性。例如是否允许为空、长度、类型等等

mysql语句分类
  1. DDL 数据定义语言 (Data Defifinition Language) 例如:建库,建表

  2. DML 数据操纵语言(Data Manipulation Language) 例如:对表中的数据进行增删改操作

  3. DQL 数据查询语言(Data Query Language) 例如:对数据进行查询

  4. DCL 数据控制语言(Data Control Language) 例如:对用户的权限进行设置

DDL 数据定义语言

​ 1、创建数据库

# 直接创建数据库 db1
create database db1;
#查看当前在哪个库里边
select database();
#进入库
use db1;
#一般数据库存在再创建,就会报错,可以先判断是否存在,再创建数据库
create database if not exists db1;
#创建数据库并指定字符集为 gbk
create database db3 default character set gbk;
#查看某个库的构造;
show create database XD;
#查看当前mysql使用的字符集
show variables like 'character%';

2、定义表

mysql 中的数据类型

  • 整数型

类型 大小 范围(有符号) 范围(无符号unsigned) 用途

TINYINT 1 字节 (-128,127) (0,255) 小整数值

SMALLINT 2 字节 (-32768,32767) (0,65535) 大整数值

MEDIUMINT 3 字节 (-8388608,8388607) (0,16777215) 大整数值

INT 4 字节 (-2147483648,2147483647) (0,4294967295) 大整数值

BIGINT 8 字节 () (0,2的64次方减1) 极大整数值

  • 浮点型

FLOAT(m,d) 4 字节 单精度浮点型 备注:m代表总个数,d代表小数位个数 ,m-d整数位个数

DOUBLE(m,d) 8 字节 双精度浮点型 备注:m代表总个数,d代表小数位个数 ,m-d整数位个数

  • 定点型

DECIMAL(m,d) 用于大小数,不会丢失精度, 依赖于M和D的值 备注:m代表总个数,d代表小数位个数

  • 字符串类型

类型 大小 用途

CHAR 0-255字节 定长字符串

VARCHAR 0-65535字节 变长字符串

TINYTEXT 0-255字节 短文本字符串

TEXT 0-65535字节 长文本数据

MEDIUMTEXT 0-16777215字节 中等长度文本数据

LONGTEXT 0-4294967295字节 极大文本数据

varchar 和 char 对比:

​ char存取速度比varchar更快,但是比varchar更占用空间

​ char 定长的字符串,不足的位数会拿0补齐,varchar 根据需要调整空间,但不得超过最大位数

​ char(n), varchar(m) , n表示定长的位数,m表示最大位数

  • 时间型

数据类型 字节数 格式 备注

date 3 yyyy-MM-dd 存储日期值

time 3 HH:mm:ss 存储时分秒

year 1 yyyy 存储年

datetime 8 yyyy-MM-dd HH:mm:ss 存储日期+时间

timestamp 4 yyyy-MM-dd HH:mm:ss 存储日期+时间,可作时间戳

# 创建表的语法

#直接创建
CREATE TABLE 表名 (
    字段名1 字段类型1 约束条件1 说明1,
    字段名2 字段类型2 约束条件2 说明2,
    字段名3 字段类型3 约束条件3 说明3 
);

#根据别的表创建,
create table 新表名 as select * from 旧表名 where 1=2;
(where 条件恒不成立,只会复制表结构,条件恒成立,就会整张表复制过来,包括数据)
(注意:建议这种创建表的方式用于日常测试, 因为可能索引什么的会复制不过来)

create table 新表名 like 旧表名;
(复制表结构)

#约束条件:
comment ----说明解释 
not null ----不为空 
default ----默认值 
unsigned ----无符号(即正数) 
auto_increment ----自增 
zerofill ----自动填充 
unique key ----唯一值
primary key---- 主键
foreign key-----外键

#eg:
CREATE TABLE student (id tinyint(5) auto_increment default null comment '学生学号',
                      name varchar(20) default null comment '学生姓名', 
                      age tinyint default null comment '学生年龄',
                      class varchar(20) default null comment '学生班级',
                      sex char(5) not null comment '学生性别', 
                      unique key (id)
                     )engine=innodb charset=utf8;

index、key、unique、unique key、primary key、foreign key 区别:

index ,索引,数据库的物理结构,用来快速查找数据,创建时会在另外的表空间(mysql中的innodb表间) 以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;

key, 一个普通索引,没有额外功能,相当于一个逻辑上的约束,规定吧

unique,对单一字段或多个字段的唯一性约束,

unique key , 在key的基础上,多了唯一性约束,可以为null值,当你插入第二个null值的时候,根据b+树,全 null值不会记录到树上;

primary key,主键,在key的基础上,多了唯一,非空;主键起到唯一标识一行数据的作用,每个表只能有一 个主键;在建表时,只能有一次primary key 关键字,若有多个字段,写成 ’ primary key(字段1, 字段 2…) ’

foreign key,外键,起到规范数据引用完整性的作用,也会建立索引;一个表(子表)的某一个字段是另一表(父 表)的主键,那么这个字段就可以设置为外键。

​ 语法: [ CONSTRAINT ] [ 外键名称 ] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)

​ 当存在外键约束时,删除更新时有不同的行为;

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 RESTRICT 一致) 默认行为
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 NO ACTION 一致) 默认行为
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)
SET DEFAULT父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)
# 修改 删除更新行为
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

上述key,index 中,只有primary key 在一张表中只能有一个存在,其他都可以多个;

key 就是一个特殊的索引,所以我们也称primary key 为主键索引,unique key 为唯一索引;

primary key(字段1,字段 2…) 这种写法为复合索引,复合索引的唯一性是看整个字段列,而非单个字段;

查看表的信息:

​ 查看数据库中的所有表:show tables;

​ 查看表结构:desc 表名;

​ 查看创建表的sql语句:show create table 表名;

​ \G :有结束sql语句的作用,还有把显示的数据纵向旋转90度

​ \g :有结束sql语句的作用

修改表结构:

# 修改表名
rename table 旧表名 to 新表名; 
rename table student to user;

#添加列
给表添加一列:alter table 表名 add 列名 类型;
alter table user add addr varchar(50);

alter table 表名 add 列名 类型 comment '说明'; 
alter table user add famliy varchar(50) comment '学生父母'; 

给表最前面添加一列:alter table 表名 add 列名 类型 first;
alter table user add job varchar(10) first;

给表某个字段后添加一列:alter table 表名 add 列名 类型 after 字段名; 
alter table user add servnumber int(11) after id;
注意:没有给表某个字段前添加一列的说法。

#修改列类型
alter table 表名 modify 列名 新类型; 
alter table user modify servnumber varchar(20);

#修改列名
alter table 表名 change 旧列名 新列名 类型;
alter table user change servnumber telephone varchar(20);

#删除列
alter table 表名 drop 列名; 
alter table user drop famliy;

#修改字符集
alter table 表名 character set 字符集;
alter table user character set GBK;

#mysql表的删除
drop table 表名;
drop table user;



DCL 数据控制语言

用户的确定是由用户名和ip地址一起确定,所以一般在写用户名时 都建议用 “用户名@地址”

# 查询用户
select * from mysql.user;
(用户存放在mysql数据库的user表里面)

# 查询用户权限
show grants for user01;

#创建用户
#创建一个user01用户,只能用本机地址访问
create user user01 @localhost identified by'密码';
#创建一个user02用户,任意地址访问,%表示任意地址
create user user02 @'%' identified by'密码';

#删除用户
#删除用户user01
drop user user01 ;

#修改用户密码
use mysql;
update user set authentication_string=password('密码') where user = '用户名' and host = '地址';
flush privileges;

给用户授权和回收

常用权限:

  • all,all privileges (所有权限)
  • select,insert,update,delete (crud 权限)
  • alter (修改表权限)
  • drop (删除数据库,表,视图权限)
  • create (创建库,表权限)
#授予权限
grant 权限1,权限2... on 数据库.表名 to 用户名;
# 授予对db1数据库所有表的所有的权限给user01用户@地址
grant all on db1.* to user01@localhost;

#回收权限
revoke 权限1,权限2... on 数据库.表名 from 用户名;
# 回收user01 用户对db1的所有权限
revoke all on db1.* from user01@localhost;


DQL 数据查询语言
SELECT selection_list /*要查询的列名称*/

 FROM table_list /*要查询的表名称*/

 WHERE condition /*行条件*/

 GROUP BY grouping_columns /*对结果分组*/

 HAVING condition /*分组后的行条件*/

 ORDER BY sorting_columns /*对结果分组*/

 LIMIT offset_start, row_count /*结果限定*/
  • 学生表 stu
段名称字段类型说明
sidchar(6)学生学号
snamevarchar(50)学生姓名
ageint学生年龄
gendervarchar(50)学生性别
  • 雇员表 emp
字段名称字段类型说明
empnoint员工编号
enamevarchar(50)员工姓名
jobvarchar(50)员工工作
mgrint领导编号
hiredatedate入职日期
saldecimal(7,2)月薪
commdecimal(7,2)奖金
deptnoint部分编号
  • 部门表 dept
字段名称字段类型说明
deptnoint部门编码
dnamevarchar(50)部门名称
locvarchar(50)部门所在地点
基础查询
#查询所有列
select * from stu;

#查询指定列
select 字段1,字段2... from stu;
select sid,sname from stu;

#字段名可以 用 as 取别名, as 也可省略,别名里有特殊字符的,得用""引起来;
select sid as 学号,sname as 姓名 from stu;

# 也可以给stu表取别名s;
select s.sid,s.sname from stu s;
select s.* from stu s;
条件查询

where 关键字

可添加的条件:

  • =、!=、<>(不等于)、<、<=、>、>=
  • between… and 在一个闭区间之内
  • in(set) 在一个集合内
  • is null
  • and 与
  • or 或
  • not 非

null 值与任何值进行计算,结果都为空值, null值与任何数据进行比较,结果都为false;

ifnull() 函数可以转换null值;

#查询性别为女,并且年龄50的记录
select * from stu where gender =  'female' and age <50;

#查询学号为S_1001,S_1002,S_1003的记录
select * from stu where sid in ('S_1001','S_1002','S_1003');

#查询年龄在20到40之间的学生记录
select * from stu where age between 20 and 40;
select * from stu where age>=20 and age<=40;

#查询性别非男的学生记录
select * from stu where gender!='male';
select * from stu where not gender='male';

#查询姓名不为null的学生记录
select * from stu where sname is not null;
select * from stu where not sname is null;
模糊查询

like 关键字,像…样的;

其中"_"匹配任意一个字母,5个"_"表示5个任意字母

其中“%”匹配0~n个任何字母。

#查询名字是3个字的学生
select * from stu where sname like '___';

#查询姓名中第二个字是“俊”的名字
select * from stu where sname like '_俊%';

#去重
# distinct 对查询的结果集去重,而不是对单个字段去重;
select distinct job from emp;

#计算列
#查询雇员的薪水和奖金的总和
#null值转换为0
select ename ,sal+ifnull(comm,0) from emp;

# 常数列, 
select job,'雇员' from emp;
排序

order by 关键字,对查询的结果进行排序;

排序方式

  • ASC : 升序(默认值)
  • DESC: 降序
  • 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
select * from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ,...;

# 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
select * from emp order by sal desc,empno asc;
聚合函数

聚合函数是用来做纵向运算的函数:

将一列数据作为一个整体,进行纵向计算,会忽略null值

返回一个结果集;

  • COUNT() 统计指定列不为NULL的记录行数
  • MAX() 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算
  • MIN() 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
  • SUM() 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0
  • AVG() 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
#查询表行数
#所有列作为查询条件
select count(*) as total from emp;
#主键作为查询条件
select count(empno) as total from emp;
#添加一个常数列'1'进行计算,推荐使用
select count(1) as total from emp;

select avg(sal) from emp;
分组

group by 关键字

对查询的结果进行分组,可接having 字句对分组结果进一步筛选;

select 查询的字段必须为聚合函数,和group by 分组的字段,可以理解为一个组(多个成员)的特性我们用聚合函数来表示,单一字段无法表示一组成员的特性,他们各不相同。

where与having区别

​ 判断条件不同:where不能对聚合函数进行判断,而having可以。

执行顺序: where > 聚合函数 > having 。

SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名1,分组字段名2 [ HAVING 分组 后过滤条件 ];

#查询每个部门的部门编号以及每个部门的人数
select deptno ,count(*) from emp group by deptno;
HAVING字句
#查询工资总和大于9000的部门编号以及工资和
select deptno,sum(sal) from emp group by deptno having sum(sal)>9000;
分页查询

limit m,n ; 用于分页 , m表示起始索引, n表示查询的记录数;

起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数

如果查询的是第一页数据,起始索引可以省略,直接简写为 limit n;

#查询前5行数据
select * from emp limit 0,5;
select * from emp limit 5;

#查询第3页数据,每页10行数据
select * from emp limit 20,10;

mysql 的语句执行顺序:

​ from->where->group by->having->select->order by->limit;

联合查询

将两个表的查询结果集合并,称为联合查询;

union 去重合并

union all 不去重合并

合并的两个结果集,必须列数,列的类型都相同;

#结果集列的显示是谁写前面就显示谁的
select * from test01 union select * from test02;
select * from test02 union select * from test01;
连接查询

连接查询就是多个表的笛卡尔积,即查询结果行数为各表行数相乘;

使用场景:两张表的连接查询有一个主外键关系

# 对emp表和dept表进行连接查询,
select * from emp,dept;

#对笛卡尔积进行筛选,去除多余的无用的结果;
select emp.ename,emp.sal,emp.comm,dept.dname from emp,dept where emp.deptno=dept.deptno;

内连接

select … from 表A inner join 表B on 条件

#两种查询结果一样,只是第一种是标准的写法
select * from emp inner join dept on emp.deptno=dept.deptno;

select emp.ename,emp.sal,emp.comm,dept.dname from emp,dept where emp.deptno=dept.deptno;
外连接

查询出的结果存在不满足条件的可能。

外连接分为两种,分别是:左外连接 和 右外连接

左外连接

select ...  from 表A left [outer] join 表B on 条件

#
select * from emp left outer join dept on emp.deptno=dept.deptno;

右外连接

select ...  from 表 A right [outer]  join 表B on 条件

select * from emp right outer join dept on emp.deptno=dept.deptno;

select * from emp left outer join dept on emp.deptno=dept.deptno;

​ 左表emp 右表dept

​ 左连接:先查左表,然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。

​ 右连接:先查右表,然后查询左表,左表中满足条件的显示出来,不满足条件的显示NULL。

自连接

嵌套查询

select * from 表A 别名a join 表A 别名b on 条件;

#查询员工 及其 所属领导的名字
select a.name , b.name from emp a , emp b where a.managerid = b.id;
子查询
DML 数据操纵语言

insert into 表名(字段1,字段2…)values(值1,值2…);

delete from 表名 where 条件;

update 表名 set (字段1=值1,字段2=值2…);

mysql 事务

什么是事务?

​ 数据库事务通常指对数据库进行读或写的一个操作过程。有两个目的,第一个是为数据库操作提供了一个从失败中恢复 到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法;第二个是当多个应用程序在并发访问数据 库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰

事务的特性(ACID):

  • 原子性(Atomicity):事务必须是原子工作单元,一个事务中的所有语句,应该做到:要么全做,要么一个都不做;

  • 一致性(Consistency):让数据保持逻辑上的“合理性”,比如:小明给小红打10000块钱,既要让小明的账户减少10000,又要让小红的账户上增加10000块钱;

  • 隔离性(Isolation):如果多个事务同时并发执行,但每个事务就像各自独立执行一样。

  • 持久性(Durability):一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)

mysql 事务操作:

​ 事务的开启:begin; start transaction;

事务的提交:commit; 

​ 事务的回滚:rollback;

mysql 存储引擎

什么是数据库存储引擎?

​ 数据库引擎是数据库底层软件组件,不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的数据库引擎,可以获得特定的功能

如何查看引擎?

​ 如何查看数据库支持的引擎

​ show engines;

​ 查看当前数据的引擎:

​ show create table 表名\G

​ 查看当前库所有表的引擎:

​ show table status\G

MyISAM与InnoDB的区别

​ MyISAM:支持全文索引(full text);不支持事务;不支持外键;表级锁;保存表的具体行数;崩溃恢复不好

​ Innodb:支持事务;支持外键;以前的版本是不支持全文索引,但在5.6之后的版本就开始支持这个功能了;行级锁(并非绝对,当执行 sql语句时不能确定范围时,也会进行锁全表例如: update table set id=3 where name like ‘a%’;);不保存表 的具体行数;奔溃恢复好

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值