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)常用管理命令

书写规范:

  1. 关键字大写

  2. 错误行停止

  3. 可以跨越多行

  4. 单行注释:# SHOW DATABASES;

  5. 多行注释:/*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
2
3
4
5
6
7
8
9
10
11
12
13
SET NAMES utf8;
DROP DATABASE IF EXISTS 数据库名 ;
CREATE DATABASE 数据库名 CHARSET=UTF8;
CREATE TABLE student (
sid INT ,
name VARCHAR(64),
sex VARCHAR(1),
score INT
); //创建表student
INSERT INTO student VALUAS('1','ran','F','60');
SELECT * FROM student;
UPDATE student SET email='lwz@163.com',phone='13712345678' WHERE uid='1';
DELETE FROM student WHERE uid='2';

(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

image

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. 注意

  1. 密码加密 md5(‘123’); VARCHAR(32); // md5(‘’)不足够安全怎么办,(对前端来说)强制用户输入健壮密码 8位以上大写小写数字符号
  2. 在linux 下严格区分大小写 //老师要求:库名,表名,列名全部小写

6. 数据库范式(自学整理)

一张数据表的表结构所符合的某种设计标准的级别

  • 1NF:符合1NF的关系中的每个属性都不可再分,是所有关系型数据库的最基本要求
  • 2NF:
  • 3NF
  • BCNF
  • 4NF
  • 5NF