MySQL数据库-初始数据库,库操作,表操作
初识数据库
数据库管理软件的由来:
我们在编写任何程序之前,都需要事先写好基于⽹络操作⼀台主机上⽂件的程序(socket服务端与客户端程序),于是有⼈将此类程序写成⼀个专门的处理软件,这就是mysql等数据库管理软件的由来,但mysql解决的不仅仅是数据共享的问题,还有查询效率,安全性等⼀系列问题,总之,把程序员从数据管理中解脱出来,专注于⾃⼰的程序逻辑的编写。
数据库概述
1 什么是数据(Data)
描述事物的符号记录称为数据
2 什么是数据库(DataBase,简称DB)
数据库即存放数据的仓库,只不过这个仓库是在计算机存储设备上,⽽且数据是按⼀定的格式存放的
3 什么是数据库管理系统(DataBase Management System 简称DBMS)
在了解了Data与DB的概念后,如何科学地组织和存储数据,如何⾼效获取和维护数据成了关键
这就⽤到了⼀个系统软件---数据库管理系统
4 数据库服务器、数据管理系统、数据库、表与记录的关系
记录:1 刘海龙 324245234 22(多个字段的信息组成⼀条记录,即⽂件中的⼀⾏内容)
表:student,scholl,class_list(即⽂件)
数据库:oldboy_stu(即⽂件夹)
数据库管理系统:如mysql(是⼀个软件)
数据库服务器:⼀台计算机(对内存要求⽐较⾼)
总结:
数据库服务器-:运⾏数据库管理软件
数据库管理软件:管理-数据库
数据库:即⽂件夹,⽤来组织⽂件/表
表:即⽂件,⽤来存放多⾏内容/多条记录
5 数据库管理技术的发展历程
⼀⼈⼯管理阶段⼆⽂件系统阶段三数据系统阶段
mysql介绍
MySQL是⼀个关系型数据库管理系统,由瑞典MySQL AB 公司开发,⽬前属于 Oracle 旗下公司。
mysql是什么
#mysql就是⼀个基于socket编写的C/S架构的软件
#客户端软件
mysql⾃带:如mysql命令,mysqldump命令等
python模块:如pymysql
数据库管理软件分类
#分两⼤类:
关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通⽤
⾮关系型:mongodb,redis,memcache
#可以简单的理解为:
关系型数据库需要有表结构
⾮关系型数据库是key-value存储的,没有表结构
mysql密码设置与破解
1.官⽹下载 mysql安装
2.启动mysql
3.设置环境编程
vim ~/.zshrc
PATH=/usr/local/mysql/bin:$PATH
export PATH
暴⼒破解密码
1.停⽌mysql服务
2.通过命令打开
sudo mysqld_safe __skip-grant-tables (⼀会要杀死)
3.这样不⽤密码也能登陆进来,然后设置密码
update mysql.user set authentication_string=password('') where user='root' and host=‘localhost’;
flush privileges; 刷新权限表
4.杀死mysqld_safe __skip-grant-tables
ps aux | grep mysql
kill -9 pid
统⼀字符编码
1.切换到管路员⾝份
sudo su
2.先设置密码,设置了密码才让看字符编码
sh-3.2# mysqladmin -uroot -p password ‘112233'
3.进⼊mysql按 \s
4.在/etc⽬录下创建myf⽂件
vim /etc/myf
5.复制以下配置到⽂件⾥
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
6.重启mysql查看,编码已经变了
初识sql语句
sql(Structured Query Language 即结构化查询语⾔)
SQL语⾔主要⽤于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语⾔由IBM开发。SQL语⾔分为3种类型:
#1、DDL语句数据库定义语⾔:数据库、表、视图、索引、存储过程,例如CREATE DROP ALTER
#2、DML语句数据库操纵语⾔:插⼊数据INSERT、删除数据DELETE、更新数据UPDATE、查询数据SELECT
#3、DCL语句数据库控制语⾔:例如控制⽤户的访问权限GRANT、REVOKE
#1. 操作⽂件夹
增:create database db1 charset utf8;
查:show databases;
改:alter database db1 charset latin1;
删除: drop database db1;
#2. 操作⽂件
先切换到⽂件夹下:use db1
增:create table t1(id int,name char);
查:show tables
改:alter table t1 modify name char(3);
alter table t1 change name name1 char(2);
删:drop table t1;
#3. 操作⽂件中的内容/记录
增:insert into t1 values(1,'May1'),(2,'May2'),(3,'May3');
查:select * from t1;
改:update t1 set name='shell' where id=2;
删:delete from t1 where id=1;
清空表:
delete from t1; #如果有⾃增id,新增的数据,仍然是以删除前的最后⼀样作为起始。
truncate table t1;数据量⼤,删除速度⽐上⼀条快,且直接从零开始,
auto_increment 表⽰:⾃增
primary key 表⽰:约束(不能重复且不能为空);加速查
库相关操作
系统数据库
information_schema:虚拟库,不占⽤磁盘空间,存储的是数据库启动后的⼀些参数,如⽤户表信息、列信息、权限信息、字符信息等performance_schema: MySQL 5.5开始新增⼀个数据库:主要⽤于收集数据库服务器性能参数,记录处理查询请求时发⽣的各种事件、锁等现象mysql:授权库,主要存储系统⽤户的权限信息
test: MySQL数据库系统⾃动创建的测试数据库
创建数据库
1 语法(help create database)
CREATE DATABASE 数据库名 charset utf8;
2 数据库命名规则:
可以由字母、数字、下划线、@、#、$
区分⼤⼩写
唯⼀性
不能使⽤关键字如 create select
不能单独使⽤数字
最长128位
数据库相关操作
1 查看数据库
show databases;
show create database db1;
select database();
2 选择数据库
USE 数据库名
3 删除数据库
DROP DATABASE 数据库名;
4 修改数据库
alter database db1 charset utf8;
表相关操作
存储引擎介绍:
存储引擎就是如何存储数据、如何为存储的数据建⽴索引和如何更新、查询数据等技术的实现⽅
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)
mysql⽀持的存储引擎介绍
MariaDB [(none)]> show engines\G #查看所有⽀持的存储引擎
MariaDB [(none)]> show variables like 'storage_engine%'; #查看正在使⽤的存储引擎
#InnoDB 存储引擎
⽀持事务,其设计⽬标主要⾯向联机事务处理(OLTP)的应⽤。其
特点是⾏锁设计、⽀持外键,并⽀持类似 Oracle 的⾮锁定读,即默认读取操作不会产⽣锁。从 MySQL 5.5.8 版本开始是默认的存储引擎。
InnoDB 存储引擎将数据放在⼀个逻辑的表空间中,这个表空间就像⿊盒⼀样由 InnoDB 存储引擎⾃⾝来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的表单独存放到⼀个独⽴的 ibd ⽂件中。此外,InnoDB 存储引擎⽀持将裸设InnoDB 通过使⽤多版本并发控制(MVCC)来获得⾼并发性,并且实现了 SQL 标准的 4 种隔离级别,默认为 REPEATABLE 级别,同时使⽤⼀种称为 netx-key locking 的策略来避免幻读(phantom)现象的产⽣。除此之外,InnoDB 存储引擎还提供了插⼊缓对于表中数据的存储,InnoDB 存储引擎采⽤了聚集(clustered)的⽅式,每张表都是按主键的顺序进⾏存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每⼀⾏⽣成⼀个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常⽤的⼀种引擎,Facebook、Google、Yahoo 等公司的成功应⽤已经证明了 InnoDB 存储引擎具备⾼可⽤性、⾼性能以及⾼可扩展性。对其底层实现的掌握和理解也需要时间和技术的积累。如果想深⼊了解 I #MyISAM 存储引擎
不⽀持事务、表锁设计、⽀持全⽂索引,主要⾯向⼀些 OLAP 数据库应⽤,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统与⽂件系统⼀个很⼤的不同在于对事务的⽀持,MyISAM 存储引擎是不⽀持事务的。究其根本,这#NDB 存储引擎
2003 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是⼀个集存
储引擎,类似于 Oracle 的 RAC 集,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集架构,因此能提供更⾼级别#Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重启或发⽣崩溃,表中的数据都将消失。它⾮常适合于存储 OLTP 数据库应⽤中临时数据的临时表,也可以作为 OLAP 数据库应⽤中数据仓库的维度表。Memory 存储引擎默认使⽤哈希索引#Infobright 存储引擎
第三⽅的存储引擎。其特点是存储是按照列⽽⾮⾏的,因此⾮常适合 OLAP 的数据库应⽤。其官⽅⽹站是 /,上⾯有不少成功的数据仓库案例可供分析。
#NTSE 存储引擎
⽹易公司开发的⾯向其内部使⽤的存储引擎。⽬前的版本不⽀持事务, 但提供压缩、⾏级缓存等特性,不久的将来会实现⾯向内存的事务⽀持。
#BLACKHOLE
⿊洞存储引擎,可以应⽤于主备复制中的分发主库。
MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常⽤的⼀些引擎。如果你喜欢,完全可以编写专属于⾃⼰的引擎,这就是开源赋予我们的能⼒,也是开源的魅⼒所在。
表介绍
表相当于⽂件,表中的⼀条记录就相当于⽂件的⼀⾏内容,不同的是,表中的⼀条记录有对应的标题,称为表的字段,其余内容称为记录
创建表
#语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
#注意:
1. 在同⼀张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
MariaDB [(none)]>create database db1 charset utf8;
MariaDB [(none)]>use db1;
MariaDB [db1]>create table t1(
-> id int,
-> name varchar(50),
-> sex enum('male','female'),
-> age int(3)
-> );
MariaDB [db1]> show tables; #查看db1库下所有表名
MariaDB [db1]>desc t1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type |Null|Key|Default| Extra |
+-------+-----------------------+------+-----+---------+-------+
| id |int(11) | YES ||NULL||
| name |varchar(50) | YES ||NULL||
| sex | enum('male','female') | YES ||NULL||
| age |int(3) | YES ||NULL||
+-------+-----------------------+------+-----+---------+-------+
MariaDB [db1]>select id,name,sex,age from t1;
Empty set (0.00 sec)
MariaDB [db1]>select*from t1;
Empty set (0.00 sec)
MariaDB [db1]>select id,name from t1;
Empty set (0.00 sec)
插⼊数据
MariaDB [db1]>insert into t1 values
MariaDB [db1]>select*from t1;
MariaDB [db1]>insert into t1(id) values
-> (3),
-> (4);
MariaDB [db1]>select*from t1;
查看表结构
MariaDB [db1]> describe t1; #查看表结构,可简写为desc 表名
+-------+-----------------------+------+-----+---------+-------+
| Field | Type |Null|Key|Default| Extra |
+-------+-----------------------+------+-----+---------+-------+
| id |int(11) | YES ||NULL||
| name |varchar(50) | YES ||NULL||
| sex | enum('male','female') | YES ||NULL||
| age |int(3) | YES ||NULL||
+-------+-----------------------+------+-----+---------+-------+
MariaDB [db1]> show create table t1\G; #查看表详细结构,可加\G
数据类型
数值类型
整数类型
整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT
作⽤:存储年龄,等级,id,各种号码等
========================================
tinyint[(m)][unsigned][zerofill]
⼩整数,数据类型⽤于保存⼀些范围的整数数值范围:
有符号:
-128~127
⽆符号:
0~255
PS: MySQL中⽆布尔值,使⽤tinyint(1)构造。
========================================
int[(m)][unsigned][zerofill]
整数,数据类型⽤于保存⼀些范围的整数数值范围:
有符号:
-2147483648~2147483647
⽆符号:
0~4294967295
========================================
bigint[(m)][unsigned][zerofill]
⼤整数,数据类型⽤于保存⼀些范围的整数数值范围:
有符号:
-9223372036854775808~9223372036854775807
⽆符号:
0~18446744073709551615
注意:为该类型指定宽度时,仅仅只是指定查询结果的显⽰宽度,与存储范围⽆关,存储范围如下其实我们完全没必要为整数类型指定显⽰宽度,使⽤默认的就可以了
默认的显⽰宽度,都是在最⼤值的基础上加1
2、浮点型
定点数类型 DEC等同于DECIMAL
浮点类型:FLOAT DOUBLE
作⽤:存储薪资、⾝⾼、体重、体质参数等
======================================
#FLOAT[(M,D)][UNSIGNED][ZEROFILL]
定义:
单精度浮点数(⾮准确⼩数值),m是数字总个数,d是⼩数点后个数。m最⼤值为255,d最⼤值为30
有符号:
-3.402823466E+38to-1.175494351E-38,
1.175494351E-38to3.402823466E+38
⽆符号:
1.175494351E-38to3.402823466E+38
精确度:
****随着⼩数的增多,精度变得不准确****
======================================
#DOUBLE[(M,D)][UNSIGNED][ZEROFILL]
sql软件长什么样定义:
双精度浮点数(⾮准确⼩数值),m是数字总个数,d是⼩数点后个数。m最⼤值为255,d最⼤值为30
有符号:
-1.7976931348623157E+308to-2.2250738585072014E-308
2.2250738585072014E-308to1.7976931348623157E+308
⽆符号:
2.2250738585072014E-308to1.7976931348623157E+308
精确度:
****随着⼩数的增多,精度⽐float要⾼,但也会变得不准确****
======================================
decimal[(m[,d])] [unsigned][zerofill]
定义:
准确的⼩数值,m是数字总个数(负号不算),d是⼩数点后个数。 m最⼤值为65,d最⼤值为30。
精确度:
****随着⼩数的增多,精度始终准确****
对于精确数值计算时需要⽤此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。
⽇期类型
DATE TIME DATETIME TIMESTAMP YEAR
作⽤:存储⽤户注册时间,⽂章发布时间,员⼯⼊职时间,出⽣时间,过期时间等
YEAR
YYYY(1901/2155)
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS('-838:59:59'/'838:59:59')
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-0100:00:00/9999-12-3123:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-0100:00:00/2037年某时)
字符串类型
#char类型:定长,简单粗暴,浪费空间,存取速度快
字符长度范围:0-255(⼀个中⽂是⼀个字符,是utf8编码的3个字节)
存储:
存储char类型的值时,会往右填充空格来满⾜长度
例如:指定长度为10,存>10个字符则报错,存<10个字符则⽤空格填充直到凑够10个字符存储
检索:
在检索或者说查询时,查出的结果会⾃动删除尾部的空格,除⾮我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)
#varchar类型:变长,精准,节省空间,存取速度慢
字符长度范围:0-65535(如果⼤于21845会提⽰⽤其他类型。mysql⾏最⼤限制为65535字节,字符编码为utf-8:sql/doc/refman/5.7/en/column-count-limit.html)
存储:
varchar类型存储数据的真实内容,不会⽤空格填充,如果'ab ',尾部的空格也会被存起来
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀⽤来表⽰真实数据的bytes字节数(1-2Bytes最⼤表⽰65535个数字,正好符合mysql对row的最⼤字节限制,即已经⾜够使⽤)
如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最⼤表⽰的数字为255)
如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最⼤表⽰的数字为65535)
检索:
尾部有空格会保存下来,在检索或者说查询时,也会正常显⽰包含空格在内的内容
InnoDB存储引擎:建议使⽤VARCHAR类型
单从数据类型的实现机制去考虑,char数据类型的处理速度更快,有时甚⾄可以超出varchar处理速度的50%。
但对于InnoDB数据表,内部的⾏存储格式没有区分固定长度和可变长度列(所有数据⾏都使⽤指向数据列值的头指针),因此在本质上,使⽤固定长度的CHAR列不⼀定⽐使⽤可变长度VARCHAR列性能要好。因⽽,主要的性能因素是数据⾏使⽤的#其他字符串系列(效率:char>varchar>text)
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 BINARY VARBINARY
text:text数据类型⽤于保存变长的⼤字符串,可以组多到65535 (2**16 − 1)个字符。
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选只能在给定的范围内选⼀个值,如性别 sex 男male/⼥female
set 多选在给定的范围内可以选择⼀个或⼀个以上的值(爱好1,爱好2,爱好3...)
枚举类型(enum)
An ENUM column can have a maximum of65,535distinct elements. (The practical limit is less than 3000.)
⽰例:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
集合类型(set)
A SET column can have a maximum of64distinct members.
⽰例:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
完整性约束
约束条件与数据类型的宽度⼀样,都是可选参数
作⽤:⽤于保证数据的完整性和⼀致性
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯⼀的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯⼀的
AUTO_INCREMENT 标识该字段的值⾃动增长(整数类型,⽽且为主键)
DEFAULT为该字段设置默认值
UNSIGNED ⽆符号
ZEROFILL 使⽤0填充
1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插⼊记录时不给字段赋值,此字段使⽤默认值
sex enum('male','female') not null default'male'
age int unsigned NOT NULL default20必须为正值(⽆符号)不允许为空默认是20
3. 是否是key
主键primary key
外键foreign key
索引 ()
not null与default
是否可空,null表⽰空,⾮字符串
not null - 不可空
null - 可空
默认值,创建列时可以指定默认值,当插⼊数据时如果未主动设置,则⾃动添加默认值
mysql>create table t1(id int); #id字段默认可以插⼊空
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论