MySQL学习

数据库

请不要假装很努力,因为结果不会陪你演戏。

typora快捷键 //blog.csdn.net/weixin_30619101/article/details/97707926

1. 认识数据库

1.1 数据库分类

类型 关系型数据库 非关系型数据库
举例 MySQL,Oracle,SQL server,DB2,SQLite Redis,MongDB
特征 通过表和表之间,行和列之间的关系进行数据的存储。 非关系型数据库,对象存储,通过对象的自身属性来决定

1.2 Mysql数据库

MySQL是一个关系型数据库管理系统,由瑞典[MySQL AB](//baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。

MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。

2. 操作数据库

2.1 连接数据库

  • 连接到服务器
$> mysql -h host -u user -p
Enter password: ********
  • 断开连接

    QUIT(或\q或exit)来断开连接:

mysql> QUIT
Bye
  • 单行注释
--
  • 多行注释
/*
xx
*/

结构化语言(CURD)

DDL(Data DefinitionLanguage) 数据库定义语言

DML(Data Manipulation Language) 数据库操作语言

DQL(Data QueryLanguage) 数据库查询语言

DCL(Data Control Language) 数据库控制语言

2.2 操作数据库

  1. 创建数据库
create database[if not exists] 数据库名;
  1. 删除数据库
drop database[if exists] 数据库名;
  1. 使用数据库(如果表名是特殊字符,则需要加“)
use 数据库名--;可以省略
  1. 查看数据库
show databases;--查看所有的数据库
  1. 查看创建数据库
show create database 数据库名;

2.3 数据表的列类型

数值

类型 特征 大小
tinyint 十分小的数据 1个字节
smallint 较小的数据 2个字节
mediumint 中等大小的数据 3个字节
int 标准的整数 4个字节
bigint 较大的数据 8个字节
float 浮点数 4个字节
double 浮点数(双精度) 8个字节
decimal 字符串形式的浮点数(金融行业)

字符串

类型 特征 大小
char 字符串固定大小 0~255
varchar 可变字符串(string) 0~6553
tingytex 微型文本 2^8-1
text 文本串(保存大文本) 2^16-1

时间日期

类型 格式 备注
date YYYY-MM-DD 日期格式
time HH:mm:ss 时间格式
datetime YYYY-MM-DD HH:mm:ss 最常用的格式
timestamp 1970-1-1至今 时间戳
year YYYY 年份表示

null

空值,未知

  • 不要使用null运算,结果为null

2.4 数据表的字段属性

Unsigned:

  • 无符号整数
  • 声明了该列不能为负数

Zerofill(无符号):

  • 0填充
  • 不足位数,用0填充

自增:

  • 自动在上一条记录的基础上加1
  • 通常用来设计唯一主键–index,必须是整数
  • 可以自定义初始值和步长

不是Null:

  • 如果设置为not null,不赋值则为空
  • null,如果不填写值,默认为nnull

默认(default):

  • 设置默认值

表的定义规则

***每一个表,都必须存在以下五个字段!表示一个记录存在的意义!

id			主键
`version`	乐观锁
is_create	伪删除
gmt_create	创建时间
gmt_update	修改时间

2.5 创建数据表

create table [if not exists] `表名`(
	`字段名` 列类型[属性][索引][注释],
	`字段名` 列类型[属性][索引][注释],
	…………
	`字段名` 列类型[属性][索引][注释]
)[表类型][字符集设置][注释]
  • 格式
create table if not exists `student`(
`id` int(4) not null auto_increment primary key,
`name` varchar(10) not null,
`gender` varchar(2) not null,
`birthdy` datetime not null
)engine=innodb default charset=utf8
  • 查看创建数据表
show create table 表名;
  • 查看表的结构
desc 表名;	--describe 表名;
  • 删除表
drop table [if exists] 表名;

数据库引擎

myisam innodb
事物支持 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间的大小 较小 较大,约为2倍

常规使用操作:

  • myisam 节约空间,速度较快
  • innodb 安全性高,事务的处理,多表用户操作

数据库的物理空间

在安装目录的data文件夹下!

本质还是文件的存储

MySQL引擎在物理文件上的区别

  • innodb在数据库表中只有一个*.frm文件,以及上机目录下的ibdata1文件
  • myisam对应文件
    • *.fram 表结构的定义文件
    • *.myd 数据文件(data)
    • *.myi 索引文件(index)

字符集编码

设置数据库表的字符集编码

charset=utf8

默认编码格式latin1(不支持中文)

在my.ini中修改默认配置

2.6 修改数据表

  1. 修改表名
alter table 旧表名 rename as 新表名;
  1. 增加表的字段
alter table 表名 add 字段名 列属性;
  1. 修改表的字段
修改字段约束

alter table 表名 modify 字段名 列属性;
修改字段名

alter table 表名 change 字段名 列属性;

modify和change区别

  • modify不能用来字段重命名,只能修改字段类型和约束

  • change用来字段重命名,不能修改字段类型和约束

  1. 删除表的字段
alter table 表名 drop 字段名;

3. MySQL数据管理

3.1 外键

方法一 (创建的时候添加外键约束)

定义外键key,添加外键添加约束

create table `grade`(
`gradeid` int(4) not null auto_increment,
`gradename` varchar(10) not null,
primary key (`gradeid`)
)engine=innodb default charset=utf8

create table if not exists `student`(
`id` int(4) not null auto_increment ,
`name` varchar(10) not null,
`gradeid`  varchar(10) not null,  
`gender` varchar(2) not null,
`birthdy` datetime not null.
primary key (`id`),
key `fk_gradeid` (`gradeid`),    
constraint `fk_gradeid` foreign key (`gradeid`) references `grade` (`gradeid`)
)engine=innodb default charset=utf8

方法二 (表创建完添加外键约束)

alter table 表名 
add constraint `fk_gradeid` foreign key(`gradeid`) references `grade` (`gradeid`)

以上操作为物理外键,通常使用程序来实现外键

3.2 DML语言(数据库操作语言)

insert 插入

update 修改

delete 删除

3.3 添加

insert

插入语句(字段和值对应 )

inert into 表名([字段1][字段2][...]) values([值1][值2[...]);

INSERT INTO `student`(`name`,`age`)VALUES('李四','18')

3.4 修改

update

指定条件

update 表名 set colnum_name=value where 条件;

不指定条件(会改动所有表)

update 表名 set colnum_name=value;

修改多个属性

update 表名 set colnum_name1=value1,[colnum_name2=value2] where 条件;

UPDATE `student` SET `name` = '王五' WHERE id = 2

操作符返回 布尔值

操作符 含义 范围 结果
= 等于 5=6 false
<> 或 != 不等于 5<>6 true
> 大于 5>6 false
< 小于 5<6 true
>= 大于等于 5>=6 false
<= 小于等于 5<=6 true
between…and… 区间 [5,6]
and 与(&&) 5 and 6
or 或(||) a>5 or b< 6
通过多个条件定位语句

UPDATE `student` SET `name` = '屿龙' WHERE `id` >= 2 OR `name` != '屿龙'

注意:

  • colnum_name 是数据库的列要加上“

  • value可以是具体值,也可以是变量

3.5 删除

delete

语法:delete from 表名 [where 条件]

-- 删除数据库
delete from `student`

-- 删除指定数据
delete from `student` where `id` = 1 

truncate 命令

作用:完全清空一个数据库,表的约束和结构不变

-- 清空数据库
truncate `student`

delete 和truncate区别

  • 相同点:都能删除数据,都不会删除表的结构
  • 不同点:
    • truncate 重新设置自增列 计数器归零
    • truncate 不会影响事物

4.DQL查询数据

4.1DQL(数据库查询语言)

所有查询 语句 select

4.2 查询指定字段

语法:select 字段 1,…from 表

-- 查询全部学生
select * from student

-- 查询指定字段
select `name`,`age` from student

-- 别名:给结果/表起一个名字 as
select `name` as 姓名,`age` as 年龄 from student from student as a

-- sql函数 concat拼接字符串
select concat('姓名:',`name`) as 新名字 from student

注:当字段名不能很好的表示数据本来的意思,可以给字段起别名以便于理解

distinct 去重

作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条

-- 查询一下有哪些同学参加了考试,成绩
SELECT * FROM resu1t -- 查询全部的考试成绩
SELECT `studentNo` FROM result -- 查询有哪些同学参加了考试
SELECT DISTINCT `studentNo` FROM resu1t -- 发现重复数据,去重

数据库的列(表达式)

select version() -- 查询数据库的版本(函数)
selcet 1*55-1 as 计算结果 -- 用来计算(表达式)
select @@auto_increment_increment -- 查询自增的步长(变量)

-- 成绩+1分
SELECT `studentNo`, `studentResult` +1 AS `提分后` FROM result

数据库中的表达式:文本值,列,NUl,函数,计算表达式,系统变量

select 表达式 from 表

4.3 where条件子句

作用:检索数据中符合条件的值

搜索的条件由一个或多个组成

逻辑运算符

运算符 语法 描述
and && a and b a&&b 逻辑与,同为真时为真
or || a or b a||b 逻辑或,同为假时假
not ! not a !a 逻辑非,取反
SELECT studentNo. `studentResult` FROM result

-- 查询考试成绩在95~100分之间
SELECT studentNo, `studentResult` FROM result WHERE StudentResult>=95 AND StudentResult<=100
-- and&&
SELECT studentNo, `studentResult` FROM result WHERE studentResu1t>=95 && studentResult<=100
-- 模糊查询(区间)
SELECT studentNo, `studentResult` FROM result WHERE StudentResu1t BETWEEN 95 AND 100
-- 除了1000号学生之外的同学的成绩
SELECT studentNo, `studentResult` FROM result WHERE studentNo!=1000
-- !=not
SELECT studentNo, `studentResult` FROM result WHERE NOT studentNo = 1000
Tags: