1.存储数据的方式有哪些
特定的文件/内存/第三方云服务器/数据库服务器
2.什么是数据库
数据库按照特定的形式来组织存放数据,目的是了更好的操作数据 —— 增删改查
(1)数据库的发展历史
网状数据库 -> 层次型数据库 -> 关系型数据库(RDBMS) -> 非关系型数据库(NoSQL)
(2)关系型数据库的逻辑结构
Server -> Database -> Table -> Row -> Column 数据库服务器 数据库 数据表 行 列
MySQL3.mysql数据库
MariaDB
Xampp:服务器套装,包含多款服务器端软件,例如:MySQL、Apache…
服务器端:负责存储/维护数据 —— 银行的数据库服务器
C:/xampp/mysql/bin/mysqld.exe 启动文件
占用端口3306
客户端:负责连接数据库服务器,对数据执行操作 —— ATM机
C:/xampp/mysql/bin/mysql.exe 客户端文件
(2)使用客户端连接服务器端
mysql.exe -h127.0.0.1 -P3306 -uroot -p
-h host 要连接的服务器的域名或者IP地址 127.0.0.1 / localhost
-P port 端口号
-u user 用户名 root是mysql的管理员用户
-p password 密码 xampp下root的密码是空
mysql -uroot 简写形式
结尾不能加分号
(3)常用的管理命令
quit; 退出服务器的连接
show databases; 显示当前数据库服务器下所有的数据库
use 数据库名称; 进入到指定的数据库
show tables; 显示当前数据库下所有的数据表
desc 数据表名称; 描述数据表中都有哪些列
4.SQL命令
结构化查询语言,用于操作关系型数据库服务器,主要是数据进行增删改查
SQL命令的执行方式
(1)交互模式
客户端输入一行,点击回车,服务器端就会执行一行,适用于临时性的查看数据。
(2)脚本模式
客户端把要执行的命令写在一个脚本文件中,然后一次性的提交给服务器执行,适用于批量的操作数据
在建立连接之前
mysql -uroot<拖拽要运行的脚本过来
(3)SQL命令的语法规范
一行命令可以跨越多行,以英文的分号结束
SQL命令不区分大小写,习惯上关键字大写,非关键字小写
假设某一条命令出现语法错误,则此条命令以及后边所有命令不再执行
分为单行注释(#..)和多行注释(/*…*/),注释的代码服务器不执行
5.SQL命令
(1)丢弃数据库如果存在
drop database if exists web;
(2)创建新的数据库
create database web;
(3)进入数据库
use web;
(4)创建数据表
create table student(
id int,
name varchar(16),
sex varchar(1),
score int
);
(5)插入数据
insert into student values(‘1’, … );
(6)查询数据
select * from student;
(7)修改数据
update user set email=’tao@163.com’,…. where uid=’3’;
(8)删除数据
delete from user where uid=’2’;
6.计算机如何存储字符
(1)如何存储英文字符
ASCII:对所有的英文字母及其符号进行了编码,总共有128个
Latin-1:总共有256,对欧洲字符进行了编码,兼容ASCII码
(2)如何存储中文字符
GB2312:对常用的6000多汉字进行了编码,兼容ASCII码
GBK:对2万多的汉字进行了编码,兼容GB2312
BIG5:台湾繁体字编码
Unicode:对世界上主流国家常用的语言进行了编码,总共有三种存储方案,分别是utf-8,utf-16,utf-32
(3)mysql中文乱码产生的原因
mysql默认使用Latin-1编码
(4)解决mysql中文乱码
脚本文件另存为的编码为utf-8
客户端连接服务器端的编码为utf-8
set names utf8
服务器端创建数据库使用的存储编码为utf-8
charset=utf8
7.列类型
创建表的时候,指定的类所能存储的数据类型
create table news(
nid 列类型
);
(1)数值型 —— 引号可以省略
tinyint 微整型,占1个字节,范围-128~127
smallint 小整型,占2个字节,范围-32768~32767
int 整型,占4个字节,范围-2147483648~2147483647
bigint 大整型,占8个字节,范围很大
float 单精度浮点型,占4个字节,比int存储的大得多,以牺牲小数点后的若干位为代价,存储的值越大精度越低
double 双精度浮点型,占8个字节,比bigint存储的大得多,以牺牲小数点后的若干位为代价,存储的值越大精度越低
decimal(M,D) 定点小数,小数点不会发生变化,M代表总的有效位数,D代表小数点后的有效位数
boolean/bool 布尔型,只有两个值,分别是true(真)和false(假),用于存储只有那个值的数据,布尔型在使用的时候会自动转为tinyint,也可以直接插入1或者0
true和false属于关键字,使用的时候不能加引号
(2)日期时间型 —— 必须加引号
date 日期型 ‘2020-12-25’
time 时间型 ‘15:22:30’
datetime 日期时间型 ‘2020-12-25 15:22:30’
(3)字符串型 —— 必须加引号
varchar(M) 变长字符串,几乎不会产生空间浪费,数据操作速度相对慢,常用于保存变化长度的数据,例如:姓名,标题,详情.. M的最大值是65535
char(M) 定长字符串,可能产生空间浪费,数据操作速度相对快,常用于保存固定长度的数据,例如:手机号码.. M的最大值是255
text(M) 大型变长字符串,M的最大值是2
12345.6789
1234.56789e1
123.456789e2
12.3456789e3
1.23456789e4
TB GB MB KB byte(字节) bit(位)
1byte=8bit
1 2 3 4 5 6 7
2进制
1 10 11 100 101 110 111
选择合理的列类型
create table t1(
id int,
age tinyint,
title varchar(32),
birthday date,
sex boolean,
salary decimal(7,2), #99999.99
phone char(11)
);
4.列约束
mysql可以对要插入的数据进行验证,只有符合条件才允许插入
例如:编号不允许重复、性别只能是男或者女、一个人的成绩在0~100之间…
create table t1(
lid int 列约束
);
(1)主键约束 —— primary key
声明了主键约束的列上不允许出现重复的值,一个表中只能有一个主键约束,通常加在编号列,可以加快数据的查找速度
主键约束的列上不允许插入null
null:空,表示一个暂时无法确定的值,例如:无法确定一个新员工的手机号码、家庭住址
null是关键字,使用的时候不能加引号
(2)非空约束 —— not null
声明了非空约束的列禁止插入null
1.列约束
(1)唯一约束 —— unique
声明了唯一约束的列不允许出现重复的值,一个表中可以使用多次
(2)默认值约束
可以使用default关键字设置默认值,具体两种应用方式
insert into family values(60, default);#通过default关键字调用列的默认值
insert into family(fid) values(70); #没有出现的列自动应用默认值
(3)检查约束 —— check
也称为自定义约束,用户可以根据实际需求添加约束条件
create table student(
score tinyint check(score>=0 and score<=100)
);
mysql不支持检查约束,会严重的影响数据的插入速度,后期可以通过JS实现
(4)外键约束
声明了外键约束的列,要插入的值必须在另一个表的主键列中出现才允许的插入
外键列要和对应的主键列的列类型保持一致
foreign key(familyid) references family(fid)
2.自增列
auto_increment:自动增长,声明了自增列,只需要赋值为null,就会获取最大值然后加1插入
注意事项:
必须添加在主键形式的整数列
允许手动赋值
10 研发部 20 市场部 30 运营部 40 测试部
3.简单查询
(1)查询特定的列
示例:查询出所有员工的编号和姓名
select eid,ename from emp;
select ename,sex,birthday,salary from emp;
(2)查询所有的列
select eid,ename,sex,birthday,salary,deptId from emp;
select * from emp;
(3)给列起别名
示例:查询出所有员工的编号和姓名,使用汉字别名
select eid as 编号,ename as 姓名 from emp;
select ename as a,sex as b,birthday as c,salary as d from emp;
select ename a,sex b,birthday c,salary d from emp;
(4)显示不同的记录
示例:查询出都有哪些性别的员工
select distinct sex from emp;
示例:查询出员工都分布在哪些部门
select distinct deptId from emp;
(5)查询时执行计算
示例:计算1+2+3+4
select 1+2+3+4;
select ename,salary*12 from emp;
select ename 姓名,(salary+2000)*12+10000 年薪 from emp;
(6)查询的结果排序
示例:查询出所有的部门,结果按照编号升序排列
select * from dept order by did asc; #ascendant升序
示例:查询出所有的部门,结果按照编号降序排列
select * from dept order by did desc; #descendant 降序
示例:查询出所有的员工,结果按照工资降序排列
select * from emp order by salary desc;
示例:查询出所有的员工,结果按照生日的升序排列
select * from emp order by birthday;
没有排序规则,默认是按照升序排列
按照字符串排列,是按照首个字符的Unicode码排列
示例:查询出所有的员工,结果按照姓名排列
select * from emp order by ename;
示例:查询出所有的员工,结果按照工资的降序排列,如果工资相同按照姓名排列
Select * from emp order by salary desc,ename;
示例:查询出所有的员工,结果要求女员工显示在前,如果性别相同按照年龄从大到小排列
select * from emp order by sex,birthday;
(7)条件查询
示例:查询出编号为5的员工
select * from emp where eid=5;
示例:查询出姓名为tao的员工
select * from emp where ename='tao';
示例:查询出30号部门的员工有哪些
select * from emp where deptId=30;
比较运算符:> < >= <= = !=(不等于)
示例:查询出不在30号部门的员工有哪些
select * from emp where deptId!=30;
示例:查询出没有明确部门的员工有哪些
select * from emp where deptId is null;
示例:查询出有明确部门的员工有哪些
select * from emp where deptId is not null;
and / && 并且 两个条件都满足才可以
or / || 或者 有一个条件满足就可以
示例:查询出工资在8000以上女员工有哪些
select * from emp where salary>8000 and sex=0;
select * from emp where salary>8000 && sex=0;
示例:查询出工资在6000~8000之间的员工有哪些
select * from emp where salary>=6000 && salary<=8000;
示例:查询出工资在6000以下或者8000以上的员工有哪些
select * from emp where salary<6000 or salary>8000;
select * from emp where salary<6000 || salary>8000;
示例:查询出1993年出生的员工有哪些
select * from emp where birthday>='1993-1-1' && birthday<='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);
(8)模糊条件查询
示例:查询出姓名中含有a的员工有哪些
select * from emp where ename like '%a%';
示例:查询出姓名中以a结尾的员工有哪些
select * from emp where ename like '%a';
示例:查询出姓名中倒数第2个字符是a的员工有哪些
select * from emp where ename like '%a_';
% 匹配任意个字符 >=0
_ 匹配任意1个字符 =1
以上两个匹配的符号必须结合like关键字使用
本文摘自 :https://www.cnblogs.com/