标签:text cond 替换 prim reference 字符串类型 表达 default 唯一性
数据库是长期存储在计算机内有组织、有共享、统一管理的数据集合
存储位置:
基于磁盘的数据库 mysql sqlserver oracle。数据存储文件中。IO 读写 效率偏慢 数据持久(永久保存)
基于内存的数据库 redis 效率比较快 数据有可能丢失(不影响)
关系上:
关系型数据库 mysql sqlserver oracle 表与表 字段与字段之间 数据与数据之间有关系。
非关系型数据库 redis
优势:
速度:运行速度快
价格:社区版免费
容易使用:相对来说复杂程度低,易于学习
可移植性:能工作在不同系统平台上
接口丰富:提供多种语言的API接口
支持查询语言:可以利用标准sql语法和ODBC(开放式数据库连接)的应用程序
安全性和连接性:
安全灵活的权限和密码系统,允许主机验证,服务器的密码连接加密;
网络化提高数据共享的效率
数据库-->表(table)-->表字段:数据类型,约束,数据
数据库表由横向的行和纵向的列组成:
行称为记录,是组织数据的单位;
列称为字段,每一列表示记录的一个属性;
SQL(Structured Query Language)是“结构化查询语言”,它是对关系型数据库的操作语言。
语法:
SQL语句可以单行或多行书写,以分号结尾;
可以用空格和缩进来来增强语句的可读性;
关键字不区别大小写,建议使用大写;
分类:
DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(Data Query Language):数据查询语言,用来查询记录 select
连接指定计算机上mysql的server:
mysql -uroot [-hip] -p
mysql -uroot -h127.0.0.1 -p
查看mysql的server里面有哪些数据库: show databases;
选择使用特定的数据库: use 数据库的名称;
查看指定数据库下所有的表: show tables;
查看表里面所有的数据: select * from 表名;
查看表的表结构: desc 表名;
数据库操作
创建数据库: create database [if not exists] 数据库名; (数据库名称不可更改)
修改数据库: alter database 库名 character set 字符集名;
删除数据库: drop database 数据库名;(连着表/数据都一块删除,数据无法回滚)
数据表操作
查看创建数据库基本信息 show create database 数据库名;
创建表 create table 表名(
字段1 数据类型 [约束],
字段2 数据类型 [约束],
字段n 数据类型 [约束]
);
添加列 alter table 表名 add column 列名 类型 【first|after 字段名】;
修改列的类型或约束 alter table 表名 modify column 列名 新类型 【新约束】;
修改列名 alter table 表名 change column 旧列名 新列名 类型;
删除列 alter table 表名 drop column 列名;
修改表名 alter table 表名 rename 【to】 新表名;
rename table tname_old to tname_new;
删除表 drop table【if exists】 表名;
复制表的结构 create table 表名 like 旧表;
复制表的结构+数据 create table 表名 select 查询列表 from 旧表【where 筛选】;
2.3.1 整型
tinyint | smallint | mediumint | int/integer | bigint |
---|---|---|---|---|
1B | 2B | 3B | 4B | 8B |
特点: ①都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号 ②如果超出了范围,会报out or range异常,插入临界值 ③长度可以不指定,默认会有一个长度 长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型
2.3.2 浮点型
定点数:decimal(M,D) 参数m<65 是总个数,d<30且 d<m 浮点数: float(M,D) 4B double(M,D) 8B
①M代表整数部位+小数部位的个数,D代表小数部位 ②如果超出范围,则报out or range异常,并且插入临界值 ③M和D都可以省略,但对于定点数,M默认为10,D默认为0 ④如果精度要求较高,则优先考虑使用定点数
2.3.3 字符
char、varchar、binary、varbinary、enum、set、text、blob
char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1 varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略
2.3.4 日期
year年 date日期 time时间
datetime 日期+时间
timestamp 这个字段里的时间数据会随其他字段修改的时候自动刷新
NOT NULL:非空,该字段的值必填
UNIQUE:唯一,该字段的值不可重复
DEFAULT:默认,该字段的值不用手动插入有默认值
CHECK:检查,mysql不支持
PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null
FOREIGN KEY:外键,该字段的值引用了另外的表的字段
任意类型的字段都可以充当主键,一张表有且只有一个主键
1、区别:
①一个表至多有一个主键,但可以有多个唯一
②主键不允许为空,唯一可以为空
2、相同点
都具有唯一性
都支持组合键,但不推荐
alter table 表名 add constrant 外键名 foreign key (外键表的引用列) references 主键表(主键列)
主外键是构成表与表关联的唯一途径
外键是另一张表的主键
用于限制两个表的关系,从表的字段值引用了主表的某字段值
外键列和主表的被引用列要求类型一致,意义一样,名称无要求
主表的被引用列要求是一个key(一般就是主键)
插入数据,先插入主表;删除数据,先删除从表 可以通过以下两种方式来删除主表的记录
级联删除
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
级联置空
ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
SET FOREIGN_KEY_CHECKS = 0; 删除完成后设置 SET FOREIGN_KEY_CHECKS = 1;
1.创建表添加约束
create table 表名( ? 字段名 字段类型 not null,#非空 ? 字段名 字段类型 primary key,#主键 ? 字段名 字段类型 unique,#唯一 ? 字段名 字段类型 default 值,#默认 ? constraint 约束名 foreign key(字段名) references 主表(被引用列)
)
注意: ? 支持类型 可以起约束名 列级约束 除了外键 不可以 表级约束 除了非空和默认 可以,但对主键无效
列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求
2.修改表时添加或删除约束
1、非空 添加非空 alter table 表名 modify column 字段名 字段类型 not null; 删除非空 alter table 表名 modify column 字段名 字段类型 ;
2、默认 添加默认 alter table 表名 modify column 字段名 字段类型 default 值; 删除默认 alter table 表名 modify column 字段名 字段类型 ;
3、主键 添加主键 alter table 表名 add【 constraint 约束名】 primary key(字段名); 删除主键 alter table 表名 drop primary key;
4、唯一 添加唯一 alter table 表名 add【 constraint 约束名】 unique(字段名); 删除唯一 alter table 表名 drop index 索引名;
5、外键 添加外键 alter table 表名 add【 constraint 约束名】 foreign key(字段名) references 主表(被引用列); 删除外键 alter table 表名 drop foreign key 约束名;
auto_increment
特点:
不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
如果要更改起始值:手动插入值
如果要更改步长:更改系统变量
set auto_increment = 值;
一个表至多有一个自增长列
自增长列只能支持数值型
自增长列必须为一个key
创建表时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment
)
修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
删除自增长列
alter table 表 modify column 字段名 字段类型 约束
对所有的字段新增数据
insert into 表名 values (数据1,数据2...数据n),(数据1,数据2...数据n);
对指定的字段新增数据(推荐)
insert into 表名 (字段1,字段2...字段n) values (数据1,数据2...数据n);
编码处理
不能添加中文数据:需要更改mysql服务的编码格式。
mysql的server: 默认的编码格式 latin 改成utf8
mysql的核心配置文件: my.ini
66 default-character-set=utf8
100 character-set-server=utf8
delete from 表名 [where 条件 ]; 清空表数据 多条记录受影响
update 表名 set 字段名1 = 值1,字段名2 = 值2 [where 条件];多条记录受影响
DQL就是数据查询 select 语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
写法顺序:select--from--where--group by--having--order by
执行顺序:from--where--group by--having--select--order by
查询单个字段select 字段名 from 表名;
查询多个字段select 字段名,字段名 from 表名;
查询所有字段select * from 表名
查询常量select 常量值; 注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
查询函数 select 函数名(实参列表);
查询表达式 select 100/1234;
起别名 ①as ②空格
去重 select distinct 字段名 from 表名;
+
作用:做加法运算 select 数值+数值; 直接运算 select 字符+数值;先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算 select null+值;结果都为null
ifnull函数 功能:判断某字段或表达式是否为null,如果为null 返回指定的值,否则返回原本的值 select ifnull(commission_pct,0) from employees;
isnull函数 功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
explain select... 查看语句查询次数
select 查询列表 from 表名 where 筛选条件
筛选条件:
简单条件运算符
< = <> != >= <= <=>安全等于
逻辑运算符
&& and|| or ! not
模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
between and :是否满足一个区间范围 in :条件的集合 is null /is not null:用于判断null值
排序:
select 查询列表 from 表 where 筛选条件 order by 排序列表 【asc/desc】
asc :升序,默认升序 desc:降序
排序列表支持 单个字段、多个字段、函数、表达式、别名
order by的位置一般放在查询语句的最后(除limit语句之外)
SELECT column, group_function(column) FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
WHERE一定放在FROM后面
聚合函数是用来做纵向运算的函数:
不能在WHERE 子句中使用组函数
可以在 HAVING 子句中使用组函数
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
HAVING 过滤分组:
haivng是在分组后对数据进行过滤. where是在分组前对数据进行过滤
满足HAVING 子句中条件的分组将被显示
limit
第一个参数:第一个返回记录行的偏移量,初始记录行的偏移量是 0
第二个参数:返回记录行的最大数目
如果只给一个参数,表示返回最大的记录行数目
假如要显示的页数为page,每一页条目数为size
select 查询列表 from 表 limit (page-1)*size,size;
总条数:all_count = select count(*) from tb;
每页:size
总页数:all_count/size
全相乘是作笛卡尔积,查询效率低,没有使用索引
SELECT table1.column, table2.column FROM table1, table2
WHERE table1.column1 = table2.column2;
在 WHERE 子句中写入连接条件
在表中有相同列时,在列名之前加上表名前缀,否则会报错误
连接 n个表,至少需要 n-1个连接条件
1.内连接 [inner] join on 交集:
select * from table1 inner join table2 on 关联条件;
从table1中取出每一条记录,去table2中与所有的记录进行匹配: 匹配相同最才会保留结果,否则不保留.
2.外连接
左外连接 left [outer] join on 左并集
左连接查询效率相比于全相乘的查询效率快,查询速度快,消耗内存小,而且使用了索引
...from table1
left join table2 on ...
left join table3 on...
多表
table1记录会全保留,而table2中不匹配的为null
右外连接 right [outer] join on 右并集
...from table1 right join table2 on ...
union:连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
union all: 会把所有的记录返回,且效率高于union 。
出现在其他语句内部的select语句,称为子查询或内查询
内层查询结果当作外层查询的比较条件
内层的查询结果当成临时表,供外层sql再次查询。查询结果集可以当成表看待。临时表要使用一个别名。
外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。内层查询是exists后的查询。
只要满足内层查询语句结果的的任意一个,就可以通过该条件来执行外层查询语句
使用all关键字,要满足内层查询语句的所有结果,才可以通过该条件来执行外层查询语句
字符函数
函数 | 功能 |
---|---|
concat(str1,str2,…) | 连接字符串 |
insert(str,pos,len,newstr) | 字符串str从第pos位置开始的len个字符替换为新字符串newstr |
lower(str) | 转成小写 |
upper(str) | 转成大写 |
length(str) | 返回字符串str的长度 |
char_length(str) | 返回字符串str的长度 |
lpad(str,ien,padstr) | 返回字符串str,其左边由字符串padstr填补到len字符串长度 |
rpad(str,len,padstr) | 返回字符串str,其左边由字符串padstr填补到len字符串长度 |
trim(str) | 去掉字符串str前缀和后缀的空格 |
repeat(str,count) | 返回str重复count次的结果 |
replace(str,from_str,to_str) | 用字符串to_str替换字符串str中所有的字符串from_str |
substring(str,pos,len) | 从字符串str的pos位置起len个字符长度的子串 |
数学函数 ceil:向上取整 round:四舍五入 mod:取模 floor:向下取整 truncate:截断 rand:获取随机数,返回0-1之间的小数
日期函数
CURDATE() | 返回当前日期 |
---|---|
CURTIME() | 返回当前时间 |
NOW() | 返回当前的日期和时间 |
WEEK(date) | 返回指定日期为一年中的第几周 |
YEAR(date) | 返回日期的年份 |
HOUR(time) | 返回time的小时值 |
MINUTE(time) | 返回time的分钟值 |
MONTHNAME(date) | 返回date的月份名 |
DATEDIFF(expr,expr2) | 返回起始时间expr和结束时间exrp2之间的天数 |
DATE_FORMAT(date,fmt) | 返回按字符串fmt格式化日期date值 |
from_unixtime(unix_timestamp,”%Y-%m-%d %H:%i:%S”) | 常用来将毫秒数转换为时间格式 |
%M 月名字(January……December) | %I 小时(01……12) |
---|---|
%W 星期名字(Sunday……Saturday) | %l 小时(1……12) |
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) | %i 分钟, 数字(00……59) |
%Y 年, 数字, 4 位 | %r 时间,12 小时(hh:mm:ss [AP]M) |
%y 年, 数字, 2 位 20 | %T 时间,24 小时(hh:mm:ss) |
%a 缩写的星期名字(Sun……Sat) | %S 秒(00……59) |
%d 月份中的天数, 数字(00……31) | %s 秒(00……59) |
%e 月份中的天数, 数字(0……31) | %p AM或PM |
%m 月, 数字(01……12) | %w 一个星期中的天数(0=Sunday ……6=Saturday ) |
%c 月, 数字(1……12) | %U 星期(0……52), 这里星期天是星期的第一天 |
%b 缩写的月份名字(Jan……Dec) | %u 星期(0……52), 这里星期一是星期的第一天 |
%j 一年中的天数(001……366) | %% 一个文字“%”。 |
%H 小时(00……23) | %k 小时(0……23) |
其他函数 version 当前数据库服务器的版本 database 当前打开的数据库 user当前用户 password(‘字符‘):返回该字符的密码形式 md5(‘字符‘):返回该字符的md5加密形式
mysql中的数据用各种不同的技术存储在文件(或内存)中
在mysql中用的最多的存储引擎有:innodb,myisam ,memory 等。其中innodb支持事务,而 myisam、memory等不支持事务
show engines;
建表指定引擎:
create table tb (...) engine=InnoDB auto_increment=11 default charset=utf8;
myisam:管理表(格式文件、数据文件、索引文件)
innodb:默认引擎,支持事务,支持数据库崩溃自动恢复,存储安全
表特征:1.表格式.frm文件 2.表空间存内容
memory:数据及索引存在内存,行固定(查询速度快,不安全)
表格式.frm文件
事务是一个完整的业务逻辑
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。
整个单独单元作为一个不可分割的整体。
如果某条SQL语句执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;
如果单元中的所 有SQL语句均执行成功,则事物被顺利执行。
只限于DML中:insert delete update
InnoDB提供一组记录事务性活动的日志文件
提交事务:事务结束,清空日志,数据写入 commit
回滚事务:撤销操作,清空日志,全部失败 rollback 只能滚回上次提交点
start transaction;关闭自动提交
事务的ACID(acid)属性
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务必须使操作同时成功或失败
隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
读未提交:A可以读取B未提交的数据
----->脏读
读已提交:A只能读B提交的数据
----->不可重复读取:读取随提交而可能不同,数据真实
可重复读:A读取后B再修改提交A也不变
----->幻读:数据不真实
序列化:事务排队,不能并发
不同角度下观察数据
create view tb_view as select * from tb;
drop view tb_view;
DQL语句才能创建view对象
面向视图的操作会改变原数据
简化语句结果为视图对象
字段或多字段联合 添加索引
提高查询效率
主键自动添加索引,unique也自动创建索引
索引是单独对象,不同引擎存储索引方式不同:
以 自平衡二叉树 B-tree形式存在
create index tb_name on tb(name);
drop index tb_name on tb;
索引失效:
模糊查询时以 % 开头
使用OR时,两边都有索引时才使用索引(UNION 不会失效)
使用复合索引时,没有使用左侧列查找时失效
where中索引列参与运算时失效
where中索引列使用函数时失效
索引用于优化数据库
分类:
单一索引
复合索引
主键索引
数据库表设计
第一范式:要求任一表必须有主键,每一个字段原子性
第二范式:第一的基础上,非主键完全依赖主键,不能部分依赖
第三范式:第二的基础上,非主键字段直接依赖主键,不产生传递依赖
一对多,两张表,多的表加外键
多对多,三张表,关系表两个外键
一对一,外键唯一
实际设计存在偏差,以需求为主,冗余换执行速度,减少表连接次数
标签:text cond 替换 prim reference 字符串类型 表达 default 唯一性
原文地址:https://www.cnblogs.com/fremontxutheultimate/p/14674823.html