mysql笔记
1. 发展历史
网状数据库 -> 层次性数据库 -> 关系型数据库(RDBMS)-> 非关系型数据库(NOSQL)
2. 关系型数据库的逻辑结构
SERVER -> DataBase -> Table -> Row -> Column
SQLite,MySQL,PostgreSQL,SQL Server,Oracle,DB2
3. MySQL
(1)MySQL部署结构
服务器端:负责存储,维护数据
mysqld.exe 启动mysql
客户端:负责连接数据库
mysql.exe 客户端文件
(数据库范式,设计个人项目数据库)
(2)常用管理命令
书写规范:
关键字大写
错误行停止
可以跨越多行
单行注释:# SHOW DATABASES;
多行注释:/*SHOW DATABASES;*/
- mysql.exe -h127.0.0.1 -P3306 -uroot -p
-h host 主机 服务器的IP/域名 127.0.0.1 localhost
-P port 3306
-u user root
-p password 默认为空
- mysql -uroot //登录
- QUIT;
- SHOW DATABASES;
- USE 数据库名; use test;
- SHOW TABLES;
- DESC 表名称; 描述指定数据表下都有哪些列
- show variables like ‘%char%’;
(3)SQL命令
结构化查询语言,用于操作关系型数据库,主要是对数据进行增删改查。
交互模式
脚本模式 mysql -uroot<拖拽脚本文件至此
1 | SET NAMES utf8; |
(4)列类型
1.数值型(不加引号)
- tinyint 1byte
smallint 2byte
int 4byte
bigint 8byte
float 4byte 浮点 3.4e38
double 8byte
decimal(M,D) 定点小数,M总有效位,D小数位 99999.99
boolean/bool TRUE和FALSE 不能加引号
2.日期时间型(必须加引号)
- date 2021-03-02
- time 14:56:30
- datetime 2021-03-02 14:56:30
3.字符串型(必须加引号)
- varchar(m) 变长字符串,m-长度 最大值65535
- char(m) 定长字符串 m-最大值255
- text 大型变长字符串 最大值2G
(5)列约束
六种约束
- primary key(主键约束); // 禁止列中出现重复的值。通常加在编号上,自动排序,会增快查找速度
- NOT NULL(非空约束)
- UNIQUE(唯一约束) // 允许插入NULL;
- DEFAULT 值 //两种方法插入
- INSERT INTO laptop VALUES(4,’惠普暗影精灵6代【2021新品】’,7599.00,’GTX1650Ti’,’PCI-e固态’,’2021-01-01’,DEFAULT,30);
- INSERT INTO laptop(lid,title,price,spec,detail,shelfTime,familyId) VALUES(2,’联想(LENOVO)拯救者R7000 15.6英寸游戏笔记本电脑’,5899.00,’GTX1650’,’全新锐龙7nm’,’2020-11-01’,10);
- INSERT INTO laptop(lid,title) VALUES(7,’华硕坠机堡垒’);// 其他为NULL
- check()(检查约束)//mysql 不支持检查约束,因为严重影响数据的插入速度
- FOREIGN KEY(外键约束)
- 允许插入NULL,外键列要和对应表的主键列,列类型要保一致
- 写法:…,familyId INT , FOREIGN KEY(familyId) references family(fid)
- AUTO_INCREMENT(增列)
- 自增列必须在PRIMARY KEY列
- 允许手动赋值
INSERT INTO family VALUES(10,’联想’),(20,’戴尔’),(30,’小米’),(NULL,’惠普’); *//* *一次性插入多条对列约束有影响*
(6)简单查询
- 查询特定列 : SELECT 列名 FROM 表名
- 查询全部列: SELECT * FROM 表名
- 起别名:select 列名 as 别名 from 表名
- 显示不同的记录:SELECT DISTINCT SEX FROM EMP; //相同记录只显示一次
- 查询时计算排序: select ename as 姓名,(salary+2000)*12+30000 as 年薪,birthday as 生日 from emp order by 年薪 desc,生日 asc; //asc(升序) descendant(降序)
- 条件查询:
- SELECT * FROM emp WHERE sex=FALSE;
- SELECT * FROM emp WHERE salary>=15000;
- SELECT * FROM emp WHERE deptid IS NULL;
- SELECT * FROM emp WHERE deptid IS NOT NULL;
- SELECT * FROM emp WHERE salary>10000 AND salary<20000;
- SELECT * FROM emp WHERE salary BETWEEN 12000 AND 22000; //等效于SELECT * FROM emp WHERE salary>=12000 AND salary<=22000;
- SELECT * FROM emp WHERE salary<15000 OR salary>20000;
- SELECT * FROM emp WHERE birthday >= ‘1996-01-01’ AND birthday <= ‘1996-12-31’;
- SELECT * FROM emp WHERE deptid IN (2,3) ; //等效于SELECT * FROM emp WHERE deptid=2 or deptid=3;
- SELECT * FROM emp WHERE deptid NOT IN (2,3) ;
- 模糊条件查询:
- SELECT * FROM emp WHERE ename LIKE ‘%e%’; // % 匹配任意0个或多个字符 _ 匹配任意一个字符
- 分页查询
- SELECT * FROM emp LIMIT0,2;
- select ename as 姓名,birthday as 生日,salary as 工资 from emp where sex=1 order by salary desc limit 0,3;//查询出男员工中工资最高的的前3个人的姓名,生日,工资
(7)复杂查询
1)聚合查询/分组查询
- select count(eid) from emp where sex=1; // count sum avg max min 聚合函数
- select * from emp where year(birthday)=1993;
- select count(eid) , sex from emp group by sex;
2)子查询
- select ename ,salary from emp where salary>(select salary from emp where ename=’Tom’); // > ,>=,!=,=,<,<=
- select * from dept where not exists (select * from emp where emp.deptid=dept.did); // exists, not exists
- select * from emp where year(birthday)=(select year(birthday) from emp where ename=’tom’) and ename!=’tom’;
3)多表查询,前提是两个表外键和主键建立了关联
- select ename,dname from emp,dept where emp.deptid=dept.did;
- select * from emp inner join dept on emp.deptid=dept.did; //内连接
- select * from emp left join dept on emp.deptid=dept.did; //外连接
- select ename, dname from emp right join dept on emp.deptid=dept.did; //外连接
- (select ename,dname from emp left join dept on emp.deptid=dept.did) UNION (select ename,dname from emp right join dept on emp.deptid=dept.did);//全连接,UNION ,UNION ALL
4. cmd改utf8
默认 chcp 936 //gbk
chcp 65001 //utf8 每次启动重设
注册表 “计算机\HKEY_USERS\S-1-5-21-4012883165-3823145716-963249972-1001\Software\Microsoft\Command Processor” 新建字符串autorun=chcp65001
5. 注意
- 密码加密 md5(‘123’); VARCHAR(32); // md5(‘’)不足够安全怎么办,(对前端来说)强制用户输入健壮密码 8位以上大写小写数字符号
- 在linux 下严格区分大小写 //老师要求:库名,表名,列名全部小写
6. 数据库范式(自学整理)
一张数据表的表结构所符合的某种设计标准的级别
- 1NF:符合1NF的关系中的每个属性都不可再分,是所有关系型数据库的最基本要求
- 2NF:
- 3NF
- BCNF
- 4NF
- 5NF