MySQL笔记
简介
- 关系型数据库服务器的结构:数据库服务器(server)->数据库(database)->数据表(table)->行(row)->列(column)
- 连接MySQL数据库的代码结束不加
;
,所有控制MySQL数据库的代码结束都加;
- xampp下root的密码默认为空,端口默认为3306,本机IP为
127.0.0.1
或localhost
命令
- 连接数据库:
mysql.exe -h127.0.0.1 -P3306 -uroot -p
- 连接数据库(简写):
mysql -uroot
- 断开数据库连接:
quit;
- 显示所有数据库:
show databases;
- 进入指定数据库:
use 数据库名称
- 显示当前数据库中所有数据表:
show tables
- 查看表头:
desc 数据表名称
- 运行sql文件:
mysql -uroot < 拖拽脚本文件
SQL语句
- 丢弃存在的数据库:
drop database if exists 数据库名称;
- 创建数据库:
create database 数据库名称;
- 进入数据库:
use 数据库名称;
- 创建数据表:
create table 数据表名称(列名称 列类型 列约束,...);
- 插入数据:
insert into 数据表名称 values(值1,值2,default,...);
或insert into 数据表名称 set 列名称=值,... where 条件;
或insert into 数据表名称(列名称1,列名称2,...) values(值1,值2,...)
- 查询所有数据:
select * from 数据表名称
- 修改数据:
update 数据表名称 set 列=值,... where 条件;
- 删除数据:
delete from 数据表名称 where 条件
计算机存储字符
- 英文字符
1. ASCII:对所有英文字符进行了编码,共有128个
1. Latin-1:对欧洲字符进行了编码,共256个,同时兼容ASCII码- 中文字符
1. GB2312:对6000多常用汉字进行了编码,同时兼容ASCII码
1. GBK:对两万多的汉字进行了编码,同时兼容GB2312码
1. BIG5:台湾繁体字编码
1. Unicode:对世界上主流国家常用的语言进行了编码,分为三种存储方案,分别是utf-8,utf-16,utf-32
MySQL中文乱码
- 原因:MySQL默认使用Latin-1编码,没有对中文字符进行编码
- 解决:
1. 确保脚本文件的编码为utf-8
1. 设置客户端连接服务器端编码为utf-8:set names utf8
1. 服务器创建数据库存储字符的编码为utf-8:charset=utf8
- 针对电脑交互模式下依然有乱码:
1. 先退出交互模式
1. 改变命令行的编码为utf-8:chcp 65001
1. 重新连接数据库,进入交互模式,查询数据
列类型
数值型
tinyint
微整型:占1个字节,范围-128~127
smallint
小整型:占2个字节,范围-32768~32767
int
整型:占4个字节,范围-2147483648~2147483647
bigint
大整型:占8个字节,范围-2(8*8-1)~2(8*8-1)-1
decimal(M,D)
定点小数:占16个字节,M代表总的有效位数,D代表小数点后的有效位数
boolean
布尔型:只有两个值,存储时true和false都不用加引号日期时间型
date
日期型:‘2022-11-01’time
时间型:‘14:44:30’datetime
日期时间型:‘2022-11-01 14:44:30’字符串型
varchar(M)
变长字符串:不会产生空间浪费,数据操作速度相对较慢,常用于存储变幻长度的数据,M的最大值为65535char(M)
定长字符串:可能产生空间浪费,数据操作速度相对较快,常用于存储固定长度的数据,M的最大值为255text(M)
大型变长字符串:M的最大值为4G
列约束
primary key
主键约束:不允许插入重复的值,一个表只能有一个主键约束,通常加在ID列上,加快数据的查找速度,主键约束的列不允许插入null(表示一个暂时无法确定的值)not null
非空约束:不允许插入nullunique
唯一约束:不允许插入重复的值允许插入多个null,唯一约束可能会影响排序规则default
默认值约束:使用default关键字设置默认值,插入数据时可以不给值foreign key
外键约束:foreign key(外键列) references 另一个表名称(主键列)
,外键约束的列,插入的值必须在另一个表的主键列中出现过,类型也要保持一致,以确保两个表建立联系check
检查约束:也叫自定义约束,可以自己指定约束条件,mysql不支持检查约束,会极大的影响数据插入速度
自增列
auto_increment
:在插入时赋值为null,就会获取当前列最大值然后加一插入,必须添加在整数形式的主键列,也允许手动设置编号
简单查询
- 查询所有的列:
select * from emp;
- 查询特定的列:
select eid,ename from emp;
- 给列起别名:
select eid as a,ename as b from emp;
- 查询特定的列(不重复):
select distinct ename from emp;
- 查询时执行计算:
select ename,salary*12 from emp;
- 查询结果排序(默认升序):
select * from emp order by eid asc;
或select * from emp order by eid desc;
- 条件查询:
1.select * from emp where eid=7;
或select * from emp where eid!=10;
或select * from emp where eid is not null;
或select * from emp where salary>8000 and sex=0;
或select * from emp where eid not in(20,30);
1. 可用条件:</>/<=/>=/=/!=/is null/is not null/and/&&/or/||/in()/not in()- 分页查询:
1. 需要提供两个条件:当前的页码,每页的数据量
1. 每页开始查询的值=(当前页码-1)*每页的数据量
1.select * from emp limit 开始查询的值,每页的数据量
- 模糊条件查询:
1. 必须结合like关键字使用;%
匹配任意个字符;_
匹配任意一个字符
1. 名字含有e的员工:select * from emp where ename like '%e%';
1. 名字倒数第二个字符是e的员工:select * from emp where ename like '%e_';
复杂查询
聚合查询/分组查询:
- 聚合函数:count()/sum()/avg()/max()/min() eg:
select count(*) from emp;
- 分组查询:通常用于查询聚合函数和分组条件
group by
eg:select count(*),sum(salary),sex from emp group by sex;
year()
:获取日期中的年份部分 eg:select year(birthday) from emp;
md5()
:对一个值进行加密 eg:select md5('123456');
子查询:
是多个查询命令的组合,把一个查询结果作为另一个的条件来使用
查询工资最高的员工:
select * from emp where salary=(select max(salary) from emp);
查询和tom同一年出生的员工有哪些:
select * from emp where year(birthday)=(select year(birthday) from emp where ename='tom') and ename!='tom';
多表查询:
- 查询的列分布在多个表中,前提是表之间建立了联系
- eg:
select emp.ename,dept.dname from emp,dept where emp.deptid=dept.did;