1.数据的存储方式有哪些?
特定的文件(少量的)/内存(临时的,运行速度是最快的)/第三方的云服务器/数据库服务器
2.什么是数据库
数据库按照一定的形式来组织存放数据,目的是便于操作数据 —— 增删改查
2.1数据库的发展历史
网状数据库 -> 层次型数据库 -> 关系型数据库 -> 非关系型数据库(NoSQL)
2.2关系型数据库逻辑结构(RDBMS)
Server -> Database -> Table -> Row -> Column 数据库服务 数据库 数据表 行 列 |
3.mysql
- Oracle: mysql
- 马丁: MariaDB
Xampp:是一个服务器套装,包含多款服务器软件,例如mysql,apache.. |
3.1mysql部署结构
服务器端:负责存储/维护数据 —— 银行的数据库服务器
C:/xampp/mysql/bin/mysqld.exe 启动文件
占用3306端口
客户端:负责连接服务器端,对数据进行增删改查操作 —— ATM机
C:/xampp/mysql/bin/mysql.exe 客户端文件
3.2使用客户端连接服务器端
mysql.exe -h127.0.0.1 -P3306 -uroot -p
-h host IP地址/域名 127.0.0.1/localhost
-P port 端口
-u user 用户名 root 管理员账户
-p password 密码 xampp下root用户对应的密码是空
mysql -uroot 简写形式
注意:连接的结尾不能加分号 |
3.3常用的管理命令
quit; 退出连接
show databases; 显示当前所有的数据库
use 数据库名称; 进入指定的数据库
show tables; 显示当前数据库下所有的数据表
desc 数据便名称; 描述数据表中都有那些列
所有命令都是以英文的分号作为结束 |
4.SQL命令
4.1概念
结构化查询语言,用于操作关系型数据库服务器,主要是对数据的增删改查
4.2执行方式
- 交互模式:在客户端输入一行,点击回车,服务器端就会执行一行,适用于临时性的查看数据
- 脚本模式:客户端把要执行的命令写在一个脚本文件中,一次性提交给服务器执行适用于批量的操作数据
- 如何提交脚本文件:在连接之前 mysql -uroot<拖拽脚本文件过来 回车
4.3SQL命令的语法规范
- 一条SQL命令可以跨越多行,以英文的分号作为结束
- SQL命令不区分大小写,习惯关键字大写,非关键字小写
- 假设某一条SQL命令出现语法错误,则此条命令及以后的命令不再执行
- 分为单行注释(#...)和多行注释(/*...*/),注释的内容不被服务器执行
4.4常用的SQL命令
4.4.1丢弃(删除)数据库,如果存在
drop database if exists 数据库名称;
4.4.2创建新的数据库
create database 数据库名称;
4.4.3进入数据库
use 数据库名称;
4.4.4创建数据表
create table student(
id int, #整型
name varchar(8), #可变化的字符串型,必须指定最大长度
sex varchar(1), #M-男 W-女
score int
);
4.4.5插入数据
insert into student values(‘1’, ’tao’, ’M’, ’61’);
4.4.6查询数据
select * from student;
4.4.7删除数据
-
delete from user where uid=’2’;
4.4.8修改数据
update user set upwd=’666666’,isOnline=’n’ where uid=’3’;
5.计算机如何存储字符
5.1如何存储英文字符
- ASCII:总共有128个,对英文字母及其符号进行了编码
- Latin-1:对欧洲字母及其符号进行了编码,总共有256,兼容ASCII
5.2如何存储中文字符
GB2312:对常用的6千多汉字进行了编码,兼容ASCII
GBK:对两万的汉字进行了编码,兼容GB2312
BIG5:台湾繁体字编码
Unicode:对世界上主流国家常用的语言进行编码,具体分为三种存储方案,分别是utf-8,utf-16,utf-32
5.3mysql中文乱码产生的原因
Mysql默认使用Latin-1编码,没有解决中文的存储
5.4解决mysql中文乱码
脚本文件另存为的编码为UTF-8
客户端连接服务器端的编码为UTF-8
服务器端创建数据库,存储的编码为UTF-8
6.列类型
创建数据表的时候,指定的列所能存储的数据类型
create table news(
nid 列类型
);
6.1数值型 —— 可以不加引号
6.1.1整型
- tinyint 微整型,占1个字节,范围-128~127
- smallint 小整型,占2个字节,范围-32768~32767
- int 整型,占4个字节,范围-2147483648~2147483647
- bigint 大整型,占8个字节
6.1.2浮点型
- float 单精度浮点型,占4个字节,最大的制3.4E38,以牺牲小数点后的若干位为代价,存储的数字越大精度越低
- double 双精度浮点型,占8个字节,存储的数字越大精度越低
- decimal(M,D) 定点小数,小数点的位置不会发生变化,M代表总的有效位数,D代表小数点后的有效位数
6.1.3布尔型
- boolean 布尔型,通常只有两个值,分别是true和false,代表真和假,往往用于保存只有两个值的数据,例如:性别、是否在线…
- 布尔型在使用的时候会自动转换为tinyint,true转为1,false转为0,可以执行插入1或者0
true和false属于关键字,在使用的时候不能加引号 |
6.2日期时间型 —— 必须加引号
date 日期型 ‘2021-6-2’
time 时间型 ’15:19:30’
datetime 日期时间型 ‘2021-6-2 15:19:30’
6.3字符串型 —— 必须加引号
varchar(M) 变长字符串,几乎不会产生空间浪费,数据的操作速度相对慢,M的最大值是65535,常用于存储变化长度的数据,例如:标题、内容、姓名…
char(M) 定长字符串,可能会产生空间浪费,数据的操作速度相对快,M的最大值是255,常用于存储固定长度的数据,例如:手机号码、身份证号码…
text(M) 大型变长字符串,M的最大值是2G
char(5) | varchar(5) | |
a | a\0\0\0\0 | a\0 |
ab | ab\0\0\0 | ab\0 |
一二三 | 一二三\0\0 | 一二三\0 |
create table user(
head varchar(32) #tao.jpg
);
选择合理的列类型
Create table t1(
id int,
age tinyint,
phone char(11),
sex Boolean,
price decimal(6,2), #9999.99
detail varchar(5000),
ctime datetime
);
练习:选择合理的列类型,编写脚本文件02_xuezi.sql,先丢弃再创建数据库xuezi,设置编码为utf-8,进入数据库,创建保存商品数据的表laptop,包含编号lid,标题title,价格price,库存量stockCount,上架时间shelfTime,是否在售isOnsale;插入若干条数据。
7.列约束
mysql可以对要插入的数据进行特定的验证,只有符合条件才允许插入
create table t1(
lid int 列约束
);
7.1主键约束 —— primary key
声明了主键约束的列,不允许插入重复的值,一个表中只能有一个主键约束,通常加在编号列,可以加快数据的查找速度。
null:表示一个暂时无法确定的值,例如:暂时无法确定商品的价格,暂时无法确定商品库存量… null属于关键字,使用的时候不能加引号 |
声明了主键约束的列不允许插入null
练习:给商品的库存量和上架时间设置值为null
练习:给编号列设置值为null
7.2非空约束 —— not null
声明了非空约束的列上禁止插入null
练习:给商品的价格添加非空约束
7.3唯一约束 —— unique
声明了唯一约束的列不允许插入重复的值,允许插入null,甚至多个null,一个表中可以出现多个唯一约束
练习:给商品的标题添加唯一约束,并插入数据测试
7.4默认值约束 —— default
可以使用default关键字来设置默认值,具体有两种应用方式
Insert into laptop values(4, ‘tpe470’,default…);
Insert into laptop(lid, title) values(5, ‘apple’); #没有出现的列自动应用默认值
练习:删除family表中fname列当前的约束,添加默认值约束,设置默认值为’未知’,使用两种方式应用默认值。
7.5检查约束 —— check
也称为自定义约束,用户可以自己制定约束的条件
create table student(
score tinyint check(score>=0 and score<=100)
);
mysql不支持检查约束,认为会极大的影响数据的插入速度,后期需要通过JS来实现。
7.6外键约束
声明了外键约束的列称为外键列,这一个列取值范围到另一个表的主键中,目的是为了让两个表建立关联
外键列和对应的主键列的列类型保持一致
foreign key(外键列) references 另一个表(主键列)
8.自增列
auto_increment:自动增长,声明了自增列,插入数据的时候只需要赋值为null,就会获取最大值然后加1插入
注意事项:
- 自增列必须应用在整数形式的主键列
- 声明了自增列允许手动赋值
9.练习
编写脚本文件tedu.sql,先丢弃再创建数据库tedu,设置编码为utf8,进入数据库,创建保存部门数据的表dept,包含编号did(主键、自增),部门名称dname(唯一约束),插入以下数据
10 研发部 20 运行部 30 市场部 40 测试部
创建保存员工数据的表emp,包含编号eid(主键、自增),姓名ename(非空约束),性别sex(默认值为1),生日birthday,工资salary,所属部门编号deptId(外键约束),插入若干条数据
10.简单查询(以上面练习为实例)
10.1查询特定的列
示例:查询所有员工的编号和姓名
select eid,ename from emp;
练习:查询出所有员工的姓名、性别、生日、工资
select ename,sex,birthday,salary from emp;
10.2查询所有的列
select eid,ename,sex,birthday,salary,deptId from emp;
select * from emp;
10.3给列起别名
示例:查询出所有员工的编号和姓名,使用汉字别名
select eid as 编号,ename as 姓名 from emp;
练习:查询出所有员工的姓名,生日,工资,使用汉字别名
select ename as 姓名,birthday 生日,salary 工资 from emp;
练习:查询出所有员工的姓名,工资,使用一个字母作为别名
select ename a,salary b from emp;
as关键字可以省略,保留空格即可 |
10.4显示不同的记录
示例:查询出都有哪些性别的员工
select distinct sex from emp;
练习:查询出员工都分布在哪些部门
select distinct deptId from emp;
10.5查询时执行计算
示例:计算2+3+4+5-6+8*7.3
select 2+3+4+5-6+8*7.3;
练习:查询出所有员工的姓名及其年薪
select ename,salary*12 from emp;
练习:假设每个员工的工资增加1000,年终奖20000,查询出所有员工的姓名及其年薪,使用汉字别名
select ename 姓名,(salary+1000)*12+20000 年薪 from emp;
10.6查询的结果排序
示例:查询出所有的部门,结果按照编号升序排列
select * from dept order by did asc; #ascendant 升序的
示例:查询出所有的部门,结果按照编号降序排列
select * from dept order by did desc;
describe 描述
descendant 降序
练习:查询出所有员工的数据,结果按照工资降序排列
select * from emp order by salary desc;
练习:查询出所有员工的数据,结果按照年龄从大到小排列(生日从小到大)
select * from emp order by birthday;
练习:查询出所有员工的数据,结果按照姓名升序排列
select * from emp order by ename;
不加排序规则默认是按照升序排列 按照字符串排序是按照首个字符的Unicode码 |
练习:查询出所有员工的数据,结果按照工资的降序排列,如果工资相同按照姓名排列
select * from emp order by salary desc,ename;
练习:查询出所有员工的数据,结果按照年龄从小到大,要求所有女员工显示在前边。
select * from emp order by sex,birthday desc;
10.7条件查询
示例:查询出编号为5的员工
select * from emp where eid=5;
练习:查询出姓名为king的员工
select * from emp where ename='king';
练习:查询出20号部门的员工有哪些
select * from emp where deptId=20;
练习:查询出工资在6000以上的员工有哪些
select * from emp where salary>6000;
比较运算符:> < >= <= = !=(不等于) |
练习:查询出不在20号部门的员工有哪些
select * from emp where deptId!=20;
练习:查询出没有明确部门的员工有哪些
select * from emp where deptId is null;
练习:查询出有明确部门的员工有哪些
select * from emp where deptId is not null;
练习:查询出工资7000以上的男员工有哪些
select * from emp where salary>7000 and sex=1;
select * from emp where salary>7000 && sex=1;
练习:查询出工资在5000~8000之间的员工有哪些
select * from emp where salary>=5000 && salary<=8000;
select * from emp where salary between 5000 and 8000;
练习:查询出工资在5000以下或者8000以上的员工有哪些
select * from emp where salary<5000 or salary>8000;
select * from emp where salary<5000 || salary>8000;
select * from emp where salary not between 5000 and 8000;
练习:查询出1993年出生的员工有哪些
select * from emp where birthday>='1993-1-1' && birthday<='1993-12-31';
select * from emp where birthday between '1993-1-1' and '1993-12-31';
练习:查询出20号部门或者30号部门的员工有哪些
select * from emp where deptId=20 || deptId=30;
select * from emp where deptId in(20,30);
练习:查询不在20号部门并且不在30号部门的员工有哪些
select * from emp where deptId!=20 and deptId!=30;
select * from emp where deptId not in(20,30);
10.8模糊条件查询
示例:查询出姓名中含有字母e的员工有哪些
select * from emp where ename like '%e%';
练习:查询出姓名中以e结尾的员工有哪些
select * from emp where ename like '%e';
练习:查询出姓名中倒数第2个字符是e的员工有哪些
select * from emp where ename like '%e_';
% 匹配任意个字符 >=0 _ 匹配任意1个字符 =1 以上两个匹配符结合着like关键字使用 |
10.9分页查询
查询的结果中有太多的数据,一次显示不完可以做成分页显示
需要两个已知的条件:当前的页码、每页的数据量
开始查询的值 = (当前的页码 - 1) * 每页的数据量 |
select * from emp limit 开始查询的值,每页的数据量;
练习:假设每页显示5条数据,分别查询出前3页
第1页:select * from emp limit 0,5;
第2页:select * from emp limit 5,5;
第3页:select * from emp limit 10,5;
注意事项:开始查询的值和每页的数据量在SQL命令中,必须是数值型,不能加引号,否则报错。 |