MySQL笔记心得(持续更新)
Posted q1427094386
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL笔记心得(持续更新)相关的知识,希望对你有一定的参考价值。
mysql笔记心得
一、什么是数据库
一、什么是数据库
保存数据发展方式:
1、绳子,打结法( 不容易记录内容、不易保存 ) -->
2、石头、龟壳,甲骨文( 不易携带、象形 字 ) -->
3、竹简,文字( 材料不易获取、记录内容少 ) -->
4、造纸术,文字( 容易携带、不易保存 ) -->
5、计算机、硬盘,文件( 不易查找数据 ) -->
6、数据库系统DBS database System ( 更便捷的查找数据 )
根据处理数据和数据之间关系将数据库划分:
- 关系型数据库
- 非关系型数据库**
关系型数据库: SQL所有的数据保存,都是以表的形式进行保存。一般用来保存文字数据
主流软件:MySQL Oracle SQLServer ( 学会一种,其他基本相同,每一种都会 有自己的方言 )
有行 有列 ,
单表(一张表):一行中的数据,每一列都是相关联的;
多表:一张表中的数据,使用的是其他表中的内容来进行编写的
非关系型数据库: NoSQL 数据与数据之间没有任何关系,保存 图片 音频 视频 等等
主流数据库:Redis MongoDB 每一种数据库都是一个独立的新数据库,没有任何相同点;
SQL : 结构化查询语言(Structured Query Language)
数据库: 查询数据、存储数据、修改数据等等; 对数据的增删改查 ;
二.、为什么使用数据库
更加便捷的对数据进行管理、操作;
三、什么时间使用数据库
javaWeb Java的网页开发 ;
页面中展示 html(静态资源文件) <-访问技术JavaWeb-> java程序 <- jdbc -> 数据 库获取新闻数据
当页面中的数据会频繁变化的时候,通过访问数据库来进行修改;
四、如何使用数据库 MySQL
- 安装
安装mysql,详见安装文档; - 卸载
1、打开控制面板找到mysql相关的进行卸载
2、找到mysql的安装路径删除mysql的相关文件夹
3、将文件夹的隐藏文件打开,在C盘找到programData文件夹,找到mysql文件夹 删除;
4、搜索 注册表编辑器 --> Current_User:总用户--> SOFTWARE --> MYSQL相关的 删除
Local_Machine:本地机器 --> SYSTEM --> controlSet001 --> Service --> 搜mysql 相关 干掉 --> CurrentControlSet --> Service -->
搜 mysql相关 干掉 重启电脑,服务会消失掉;
5、如果上述操作不中,打开控制面板,卸载,将Microsoft visual c++ redistribution 干掉 之后重新安装;
五、MySQL语句的分类
保存的数据都是以表的形式,进行存储;
**SQL语句的分类 **
DDL: 数据定义语言 定义数据库中 数据库的名称 数据表的内容;
DCL: 数据控制语言 控制数据库、数据表 谁可以进行编辑、修改、查看、新增
DML: 数据操作语言 对数据表中的内容,进行 增加、修改、删除操作 ;
DQL: 数据查询语言 对数据表中的内容,进行查询 ;
六、操作MySQL
1、登录MySQL程序 ; 输入密码进入;
show databases; 展示当前数据库中所有的文件
use bank ; 使用当前所有文件中bank文件
show tables ; 展示当前文件中 有多少张表
select * from account ; 展示当前account表中的全部内容
七、主机IP地址
IP地址的组成 4个0~255 数字组成 IP会指定一台机器
内网ip: 192.168.xxx(网络字段).xxx 内网可以组成局域网
外网ip:由联通 电信 移动 分配给的网络ip 全球唯一 171.8.201.140
localhost 本机地址 192.168.15.51 等同 127.0.0.1 本机地址
八、端口
与一个程序进行绑定,每个机器中的应用端口都是唯一的; 192.168.15.51:110
二、数据库、表
一、数据库的登录
三种方式
1、通过cmd进入之后,输入 mysql -uroot -p密码 想要使用这种方式,必须配置环境变量 window系统种, .exe文件,表示可执行程序,
2、通过MySQL的客户端进行登录,输入密码即可进入;
3、通过可视化工具,navicat
二、数据语言分类:( 使用学生信息 做举例)
DDL:数据定义语言;用来确定数据库的名称、数据表的结构内容 ;
1、新建一个excel文件(电脑已经开机) 对应 新建一个数据库名称(数据已经安装并且启动—— 在我电脑右键——管理——服务——Mysql右键启动)
create database 数据库名称;
2、打开创建的数据库 打开excel文件
USE students ;
3、设置一个表(表的名称、列的名称、每一列输入内容具体什么 ) 创建数据表
create table student(
id int PRIMARY key ,
`name`varchar(12) not null ,
sex varchar(1) ,
tel int(11) ,
address varchar(32)
);
创建数据表的基本语法
CREATE TABLE 表的名称 (
列名1 当前列的数据类型 [约束] ,
列名2 当前列的数据类型 [约束] ,
列名3 当前列的数据类型 [约束] ,
列名4 当前列的数据类型 [约束] ,
列名5 当前列的数据类型 [约束]
);
三、数据类型:
数字类型 长度 可以设置也可以不设置 ,大小按照类型的最大长度而定
整数型:int
小数型:double float
文字类型 varchar(65535) char(255) **必须要设置长度**
时间类型 timestamp 时间戳 = date( 年-月-日) 日期 + time( 时:分:秒:毫秒) 时间
在创建数据表的时候, 整数类型使用 int 小数型 double 文本类型 varchar(长度) 时间 类型 timestamp
四、约束:
约束: 限制这个列的内容
主键约束:pk primary key 一个表一个主键,唯一非空,
使用将 primary key 放在 (列名 类型) 之后 一般主键会和 自增 auto_increment 搭配使用( 必须是数字类型 )
非空约束:not null 表示当前列中的内容不能够为空 ;可是空格 但不能不输入内容
唯一约束:unique 表示当前列中的内容全部唯一,输入的内容唯一,如果没有内容,则可以,即 可以有多个null值
外键约束:fk
主键自增 pk primary key
# 使用主键自增约束
create table tab(
id int primary key auto_increment
);
非空 not null
# 使用非空约束
create table tab(
id varchar(30) not null
);
唯一 unique
create table tab(
id varchar(30) unique
);
五、sql中的注释
注释:在执行SQL语句的时候,会自动忽略不执行 ,两种分类
单行注释: 只能注释一行内容
# : 后面任意输入都是注释的内容;
-- : 后面必须有一个空格,和#使用相同
多行注释: 可以注释多行内容
/*
... 被注释内容
*/
-- 注释的快捷键
Ctrl + / 快速注释
Ctrl + Shift + / 解除注释
六、编码格式问题:
编码格式就相当于 字典 (新华出版社 人民出版社 )
张三 --> hashcode值(ASCII码表) 180012 123123 --> 00000010100110011001 0101001010101010101
CPU计算,将二进制转换成十进制,再按照字典去找字
常见编码格式:
ISO-8859-1 标准版 英文版 不支持中文 其中1个字符就占1个字节
GBK 支持中文 其中英文占1个字节 中文占2个字节
万国编码 UTF-8 大部分国家的语言都支持 英文占1个字节 中文3个字节
十六进制 0 1 2 3 4 5 6 7 8 9 a b c d e f
修改数据库中的编码
两种方式:
1、通过可视化操作;
将数据库的属性中 字符集修改为 utf8,然后将库中表删除之后,重新创建;
2、指令
通过alter语句,修改每一列的字符集 编码格式 ;
alter table 表名 change 要修改的列名 要修改的列名 列类型 (character set utf8) charset =utf8 [约束] ;
七、数据库的三范式
用来规范创建数据表的,不一定必须遵循,根据情况自己选择遵循与否;
一范式:不可分割
每一列中,要自己单独表示一个内容;设计数据库时,每一列的定义必须要保证最小;
二范式:主键 (非空唯一)
在一范式的基础上,再保证数据库中每一条都是唯一的,并且当前行中所有内容都要和主键相关;
三范式:设计多个表的情况下,除了主键之外,其他列不能和其他表产生关系
两个表之间,需要使用主键来建立关系;
数据库设计的三范式:
一范式:数据库设计时,每个字段(列)必须是单独,不可再分的;
二范式:数据库设计时,每个表要有主键,每个列必须和主键有关系;
三范式:数据库设计时,如果需要和其他表创建关系,必须通过主键;
三范式在数据库设计中,不是必须要遵循的;除非一些特殊情况,一般都要遵循
八、在电脑中 数据的大小问题
1024 *1024 kb = 1024 MB = 1 GB
电脑由二进制组成 0101010101
byte 1字节 -128~127 大小 256 2的8次方 00000011 硬盘中占8位
short 2字节 2的16次方 00000000 00000000 65536 -32768 ~32767
int 4字节 2的32次方 00000000 00000000 00000000 00000000 10位 -1xxx~(1xxx-1)
long 8字节 2的64次方 老大了
三、 MySQL操作数据表记录
一、MySQL语句的分类
DDL:数据定义语言
包含的关键字:
create增
drop删
alter改
DML 数据操作语言
数据库中两个概念
表结构:
通过DDL,进行对数据表的增、删、改;不会对数据的个数产生影响;
表记录:
实际保存在表中的内容,通过DML进行操作 增加表记录、删除表记录、修改表记录
新增
增:
关键字:insert
使用语法:
插入的内容是固定的列:
insert into 表名(列名1,列名2,列名3.... ) values (列1对 应值1 , 列2对应值2 , 列3对应值3 ...) ;
插入全部列:
insert into 表名 values (按照建表的顺序填写对应列的值) ;
删除
删:
关键字: delete
使用语法:
删除当前表中的全部数据
delete from 表名 ;
删除一条、几条数据:
delete from 表名 where 条件( 列名 符号 具体值 ) ;
条件:
符号:
判断符: = != > < >= <=
特殊单词: 列名 in (xx,xx) ; 列名 between xx and xx ;
删除分两种:
delete删除:单纯的删除掉所有的表记录,主键的自增序列任然存在; —— 表记录 删除
truncate删除:不仅删除表记录,还删除自增序列; —— 表结构 删除( drop table ; create table )
删库跑路; rm -rf
修改
改:
关键字: update
使用语法:
update 表名 set 列名 = 值 ; 修改当前数据表中的一个列的内容为其他值; 影响全部记 录
修改一条、几条数据:
update 表名 set 列名 = 值 where 条件(同删除) ;
修改多个列的内容:
update 表名 set 列名= 值 , 列名 = 值 where 条件 ;
案例
# create database db123 ; 创建一个数据库
-- create database db123 ; 创建一个数据库
/*
这是多行注释
*/
-- 注释的快捷键 Ctrl + / 快速注释 Ctrl + Shift + /
-- 使用之前已经创建过的数据库
-- use db4 ;
-- 创建学生信息表
/*
create table student (
id int primary key auto_increment ,
name varchar(12) not null ,
sex varchar(2) ,
tel varchar(11) unique ,
address varchar(32) ,
major varchar(12) ,
class varchar(12) ,
bir timestamp ,
balance double
);
*/
-- 展示创建表 student的 sql语句
-- show create table student ;
/*
CREATE TABLE `student1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(12) NOT NULL,
`sex` varchar(2) DEFAULT NULL,
`tel` varchar(11) DEFAULT NULL,
`address` varchar(32) DEFAULT NULL,
`major` varchar(12) DEFAULT NULL,
`class` varchar(12) DEFAULT NULL,
`bir` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`balance` double DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tel` (`tel`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
*/
-- latin 表示西欧编码格式
/*
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(12) CHARACTER SET latin1 NOT NULL,
`sex` varchar(2) CHARACTER SET latin1 DEFAULT NULL,
`tel` varchar(11) CHARACTER SET latin1 DEFAULT NULL,
`address` varchar(32) CHARACTER SET latin1 DEFAULT NULL,
`major` varchar(12) CHARACTER SET latin1 DEFAULT NULL,
`class` varchar(12) CHARACTER SET latin1 DEFAULT NULL,
`bir` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`balance` double DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tel` (`tel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
*/
-- DDL 删除数据库 删除表
-- drop database db6 ;
-- drop table student1 ;
# 通过sql语句 修改数据库、数据表的编码
-- ALTER table student character set utf8 ;
# 单独修改每一列的编码格式
-- alter table student change major major varchar(12) CHARACTER SET utf8 NOT NULL ;
-- 查询专业为法学的
-- select * from student where major = '法学' ;
-- 直接创建编码格式为 utf8的数据库
CREATE DATABASE db9 CHARACTER SET utf8;
-- create database db10 charset = utf8 ;
-- 使用数据库
USE db9;
-- 创建数据库
CREATE TABLE student (
id INT PRIMARY KEY auto_increment,
NAME VARCHAR (12) NOT NULL,
sex VARCHAR (2),
tel VARCHAR (11) UNIQUE,
address VARCHAR (32),
major VARCHAR (12),
class VARCHAR (12),
bir TIMESTAMP,
balance DOUBLE
);
-- 向student表中添加一条数据 id:3 name:赵四 tel :110
-- 使用语法:
insert into 表名(列名1,列名2,列名3.... ) values (列1对应值1 , 列2对应值2 , 列3对应值3 ...) ;
INSERT INTO student (NAME, tel) VALUES ('赵四', 123121);
-- 添加全部列的内容
INSERT INTO student VALUES(3,'尼古拉斯','男','17612341234','河南郑州','Java','4','2021-3-5 15:36:20',1000000);
-- 删除数据
DELETE FROM student;
-- 带条件的删除 ,删除名称为赵四的数据
DELETE FROM student WHERE NAME = "赵四";
-- 删除余额多余10000元的
DELETE FROM student WHERE balance > 10000;
-- 删除 性别不是男的数据
DELETE FROM student WHERE sex != '男';
-- 删除 没有性别的数据 is null
DELETE FROM student WHERE sex IS NULL;
-- 删除 性别不是男的数据(null 女)
delete from student where sex !="男" or is null ;
-- 特殊单词: 列名 in (xx,xx) ; 列名 between xx and xx ;
-- 删除id为9 和 10 11 的数据
delete from student where id in (9 ,10 ,11 );
-- 删除余额在 10k~100k之间的 包含头和尾的内容;
delete from student where balance between 10000 and 100000 ;
-- 使用修改语句 将余额都设置为10000 ;
update student set balance = 10000 ;
-- 将尼古拉斯 的余额设置为100000 ;
update student set balance = 100000 where name = "尼古拉斯" ;
-- 将赵二 余额减少9999 并且性别改为女
update student set balance = balance -9999 , sex = '女' where name = "赵二";
-- 删除自增记录
truncate table student ;
二、数据库的修改:
1、修改数据库的字符集
语法:alter database 库名 default character set 字符集;
修改数据库字符集:
alter database database_name default character set utf8 COLLATE utf8_general_ci;
2、修改表的字符集
语法:alter table 表名 convert to character set 字符集;
修改数据库表字符集
alter table database_name default character set utf8 collate utf8_general_ci;
3、修改字段的字符集
语法:alter table 表名 modify 字段名 字段属性 character set gbk;
修改字段字符集
alter table table_name change tid tid varchar(64) character set utf8 collate utf8_ge
4、查看数据库建表语句查询到使用的字符集:
show create table table_name
时间日期类型:
Datetime:时间日期,格式是YYYY-mm-dd HH:ii:ss,表示的范围是从1000到9999年,有0值:0000-00-00 00:00:00。
Date:日期,就是datetime中的date部分。
Time:时间段,指定的某个区间之间,-时间到+时间。
Timestamp:时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss 格式与datetime完全一致。
Year:年份,两种格式, year(2)和year(4):1901到2156
四、 MySQL查询
一、DQL :数据查询语言
关键字:select
基础语法:
select 列名1 as '当前列的别名', 列名2 , 列名3 ,... from 表名 ;
as 是可以省略的
查询全部列的数据: select * from 表名 ;
条件查询
带条件查询: selct * from 表名 where 条件 ;
条件 :
精确条件: = > < in between..and
模糊条件: like 必须搭配 通配符使用
通配符:
% : 匹配0~n个字符
_ : 仅匹配1个字符
除重查询
关键字:distinct
select distinct 列名1 , 列名2 ,... from 表名 ;
排序查询:按照数据进行升降序显示
关键字: order by
使用语法:
select * from 表名 order by 列名 desc(降序)/asc(升序,默认值) ;
多个列进行排序
select * from 表名 order by 列名1 desc , 列名2 desc ,... ;
分组查询:将相同的数据归为一组,进行合并展示
分组查询:将相同的数据归为一组,进行合并展示
关键字:group by
使用语法:
select * from 表名 [where 条件] group by 列名 [having 条件];
分组条件:
1、条件使用的列是表的原始列 ,使用where 作为条件关键字
2、条件使用的列是聚合函数生成的列 ,使用 having 作为关键字
搭配 聚合函数 使用
聚合函数: 数学算法,包含 求和 求平均数 求总数count(*) ,单独使用时,只会出现 1 行数 据
SUM(列名) 求当前 列 的总和值,只能对数字列进行操作
AVG(列名) 求当前 列 的全部数据的平均值,只能对数字列进行操作
MAX(列名) 求当前 列 中数据的最大值,如果是数字直接比大小,如果是字符则使用是 hashcode值
MIN(列名) 求当前 列 中数据的最小值,如果是数字直接比大小,如果是字符则使用是 hashcode值
COUNT(列名) 求有多少 行 数据;
当聚合函数和分组搭配使用:数据可能会变成多行;
求的不再是当前列,而是当前组内的列 ;
分页查询:MySQL分页
关键字:limit
基本语法:
select * from 表名 limit 开始数据编号(不包含开始编号) , 显示条数 ;
如果剩余的数据不够显示条数,则有多少显示多少;
利用现有的表创建新的表
基础语法:
CREATE TABLE 新表名 AS SELECT 列名 FROM 旧表名;
总结
MySQL查询语句的汇总:
select 列名1,列名2,... 用展示的列
from 表名 用来获取数据的表
where 条件(原表中的列作为条件) 用来设置查询条件
group by 列名 用来设置分组
having 条件(聚合函数的值条件) 用来设置分组的聚合函数条件
order by 列名 asc/desc 用来进行数据排序的
limit 开始编号 , 显示条数 ; 用来进行数据切割
案例
-- 查询练习
use mydb2 ;
create table exam(
id int primary key auto_increment,
name varchar(20) not null,
chinese double,
math double,
english double
);
insert into exam values(null,'关羽',85,76,70);
insert into exam values(null,'张飞',70,75,70);
insert into exam values(null,'赵云',90,65,95);
insert into exam values(null,'云',90,65,95);
insert into exam values(null,'赵云云',90,65,95);
insert into exam values(null,'赵赵云',90,65,95);
insert into exam values(null,'赵赵云云',90,65,95);
insert into exam values(null,'刘备',97,50,50);
insert into exam values(null,'曹操',90,89,80);
insert into exam values(null,'司马懿',90,67,65);
-- 查询表中全部数据 ;
-- select 列名1, 列名2 , 列名3 ,... from 表名 ;
select id ,name , chinese from exam ;
-- 查询表中全部列的数据
select * from exam ;
-- 查询 姓赵的 学生考试成绩
select * from exam where name like "赵%";
-- 查询 名字中带有云的
select * from exam where name like "%云%" ;
-- 查询 名字以云结尾的
select * from exam where name like "%云" ;
-- 查询名字第二位为 云的;
select * from exam where name like "_云%" ;
-- 查询名字第三位为 云的;
select * from exam where name like "__云%" ;
-- 查询名字倒数第二位为 云的;
select * from exam where name like "%云_" ;
--查询所有姓刘两个字的学生成绩。
SELECT * FROM exam where name like "刘_";
-- 查询全部的语文成绩 ( 不带重复的 )
select distinct chinese , math from exam ;
-- 排序查询
-- 查询学生id name math ,并且按照数学成绩进行排名
select * from exam order by chinese desc ;
-- 查询学生全部信息,按照语以上是关于MySQL笔记心得(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章