1.什么是数据库
数据库就是⼀个存放计算机数据的仓库,这个仓库是按照⼀定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进⾏组织和存储的,可以通过数据库提供的多种⽅法来管理其中的数据。
2、数据库的种类
最常⽤的数据库模式主要有两种,即关系型数据库和⾮关系型数据库。
3、⽣产环境常⽤数据库
⽣产环境主流的关系型数据库有 Oracle、Microsoft SQL Server、MySQL/MariaDB等。
⽣产环境主流的⾮关系型数据库有 Mongodb Memcached Redis
4、MySQL 数据库
MySQL 数据库是⼀个中⼩型关系型数据库管理系统,软件开发者为瑞典 MySQL AB 公司。在
2008年1⽉16号被 Sun 公司收购,后 Sun 公司⼜被 Oracle 公司收购。⽬前MySQL 被⼴泛地应⽤
在 Internet 上的⼤中⼩型⽹站中。由于其体积⼩、速度快、总体拥有成本低,尤其是开放源码这
⼀特点,许多⼤中⼩型⽹站为了降低⽹站总体拥有成本⽽选择了 MySQL 作为⽹站数据库,甚⾄国
内知名的淘宝⽹也选择弃⽤ Oracle ⽽更换为更开放的 MySQL。
主要应⽤范围:互联⽹领域,⼤中⼩型⽹站,游戏公司,电商平台等等。
SQL(Structured Query Language 即结构化查询语言)SQL是⽤于访问数据库的标准化语⾔。 | |||
名称 | 解释 | 命令 | |
DDL语句 | 数据库定义语言 | 定义和管理数据对象,如数据库、表等 | CREATE DROP ALTER |
DML语句 | 数据库操纵语言 | 用于操作数据库对象中所包含的数据 | 插入数据INSERT、删除数据DELETE、更新数据UPDATE |
DCL语句 | 数据库控制语言 | 用于管理数据库的语言,包括管理权限及数据更改 | 例如控制用户的访问权限GRANT、REVOKE |
DQL语句 | 数据库查询语言 | 用于查询数据库数据 | 查询数据SELECT |
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。 |
MySQL所使⽤的 SQL 语⾔是⽤于访问数据库的最常⽤标准化语⾔。MySQL 软件采⽤了双授权政策,分为社区版和商业版,由于其体积⼩、速度快、总体拥有成本低,尤其是开放源码这⼀特点,⼀般中⼩型⽹站的开发都选择 MySQL 作为⽹站数据库。
什么是库?
在操作系统里它的本质就是一个目录。
例如:在mysql里创建一个库create database db3;它在文件系统里就是多了一个目录,cd /var/lib/mysql/(yum安装数据库数据存储的位置) 在这里面有一个db3目录,这就是刚刚create database db3做出来的。cd db3,ls 有个初始文件,db.opt。
在数据库创建一张表create table t3(id int);再切过去看会发现多了一个t3.frm。这个是表文件,frm里面存的是表结构,表结构就是一张表一共有几个字段,每个字段叫什么,他把这些东西存到这里了。
数据并没有存到frm,比如要往里面插一条记录/数据,并没有存到这里,存到外面了在cd /var/lib/mysql/,ls ibdata1,不管现在有几张表,表里的所有数据都会在这里存储,都合到一个文件了。
假如数据库里有一张表,每一列的第一行叫表头/字段名称,每一列称为字段,假如有五列,就是有五个字段,这五个字段就是表结构。数据就是从第二行开始,每一行称它为记录,记录里存储的就是数据。一整条数据我们就称它为一个记录。有第一个记录也可以有第二个记录,这些数据全部都存在ibdata1文件里,一张表的数据存在这里了,再创建一张表它的数据也是存到这里了。
ibdata1存储数据的文件,也称为表空间/表空间文件。
数据库里面就是由库和表组成。库就是目录,比如有一个db1的库,在目录里面会有表,表创建出来之后,它的表结构文件会存在库里面,数据会存在外面统一的表空间文件里。数据文件。
系统数据库 | |
information_schema | 虚拟库,文件系统根本没有这个库,主要存储了系统中的一些数据库对象的信息,例如用户表信息、列信息、权限信息、字符信息等 |
performance_schema | 主要存储数据库服务器的性能参数 |
mysql | 授权库,主要存储系统用户的权限信息 |
sys | 主要存储数据库服务器的性能参数 |
这都是系统已经创建好的,默认库,不同的版本,里面的系统库不一样,有的版本是sys。有的是test。最没用的就是test,是空库,做测试用的。也可以自己创建,剩下三个不能改,也不能用。必须知道msyql库,比如创建的用户会存在库里的表里去,用户的权限也会存在库里的某些表,这是最核心的库,初始化之后的库,平时不能动,除非做权限有关的东西。能看见目录的才是真实的库。
两种方法
1、在shell里,用mysqladmin去创建
#mysqladmin -u root -p1 create db1 (-p后面不能加空格)
2、在客户端连到服务器里边之后,用sql语句创建
mysql> create database kai; #kai是数据库名称
区分大小写,库的名字要有意义。,唯一性,不能使用关键字如 create select,不能单独使用数字,每条sql语句都要以;结尾,但是如果列比较多,想看的清楚一点,可以以\G结尾
sql语句后面跟\G,一般适合查看字段比较多的东西,会翻转 select * from user\G,行变成了列,一条记录一个row。
mysql> select * from mysql.user\G 绝对路径,加一个库的名字,它就会去mysql库里找user表。把这个写在脚本里,就不用写两条指令了,就不用先切库,再去找表了。直接一条指令就行。
命令行操作数据库(脚本)
在脚本里这样写,mysql -e ‘show databases;’ e执行,执行后面跟引号,引号里面写sql语句。 能在shell执行也能在脚本里执行,还可以写多条语句用分号隔开就行了。
mysql -e 后面可以跟sql语句,sql语句直接用分号隔开,这种方法大部分情况没什么问题,但是有的时候需要往里面传变量可能就会有问题了。
这样传变量非常容易传,因为外面没有双引号单引号。这些东西完全可以写到脚本里面,bash执行
[root@mysql mysql]# vi a.sh
平时sql语句比较少的情况下,不用怎么传变量,直接-e,sql语句比较多就用< echo后面跟sql语句,比如select * from mysql里面的user表通过管道符交给msyql客户端运行,(要是有用户和密码,加上)。这种方法不大好,因为这个想传变量也会有麻烦,最好的方法是直接写到脚本用eof, # cat a.sh #! /bin/bash /usr/local/mysql/bin/mysql -u root -p'Helloworld123!' 2>/dev/null < select 5-2; use test; select * from t1; eof 查看数据库 mysql> show databases; 查看现有数据库 mysql> show create database db1; 可以看到数据库里面比较详细的一些信息 mysql>select database(); 查看当前所在库或者show tbales;根据里边的表判断一下所在库 切换库 use db1;切换库 删除数据库 drop database db1; drop 丢弃 drop删掉的都是大物件 delet 删掉的都是小文件比如删一条记录就用delet,删表删库用drop 字段属大记录小 表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。 使用编辑器编辑指令 mysql> edit (这是一个vi编辑器) mysql> \e edit (这是一个vi编辑器)在里面可以写很多语句,\e和edit是一样的写法 三条指令直接执行了,可以用这种方法去批量的执行各种语句, 在mysql客户端内执行系统命令 mysql> system ls mysql> \! ls 类似在vim执行系统命令一样,vim a 打开一个a文件,在里面可以编辑,但是编辑中途,想查看系统根目录下面有什么东西,又不想保存退出,就输入:! 后面跟上系统命令。 这种一般都是我们在没有其他终端可用的情况下,又不想退出当前这个东西,才使用这种方法。 这种看起来高大上,用处不大,可以直接复制标签,也不用退出去。 创建表 create table class22(id int(10)); create table 表名(字段名称 属性信息[(宽度) 约束条件], create table固定语法 表的名称小括号里面是字段全都拿逗号隔开 字段名称自己定义,有意义就行,字段名称后面一般都会跟约束或描述都行,有的时候需要设置一些特殊的属性信息,可能需要在后面再跟一些什么什么属性, 查看表 show tables; 查看表 show create table t1; 查看表的创建过程 show table status like 't1'\G 查看表的详细的一些信息,(后面跟表的名字,或者表名里的关键字,它会查看多张表,查看固定的表,把表名写全就好了) 查看表结构 desc t1; 查看有几个字段,desc t10; 数据少的可以用select * from t10; 【注意】在公司不要这样做,因为在公司数据可能会有上千万条,比如mysql早期的版本,一张表最多支持4千万条记录。这么执行,机器直接爆了,占资源,在公司不要这么干,如果想查字段,最好用desc,这个只查看表结构的文件,不查看数据文件,这个占用的资源不会太多,是可以随便用。 插入数据 1.insert into t1 set id=1,name="k",grade=3; 给一个字段或者两个字段添加数据,(数字不加引号,字符串必须加引号) 2.insert into t1(id,name,grade) value(2,"lilei","4"); 表名的后面加小括号,小括号里面写想要插入数据的字段,分别给他们什么样的值。 同时插入多条记录,接着写小括号,用逗号隔开。 单引号,双引号在这里一样的用法 3.insert into t1 values(4,"dd",50,100);省略了表后面的小括号,要给所有的字段设置值,后面的会依依赋值给所有字段 查看表的内容 select * from t1; *表示所有的字段 查看所有 select id,name from t1; 查看单独的某一列或者两列,把字段名称写上,用逗号隔开 修改表的名称 1.rename table t1 to t2; 2.alter table t2 rename t1; 添加新的字段 先查看有几个字段,desc t2; alter table t2 add grade int(20); 删除字段 alter table t2 drop grade; 修改字段数据类型、修饰符 alter table t10 modify name char(10); 修改属性 alter table t10 change name xingming char(10); 修改名字 修改字段的位置 first after 修改它的位置 比如;原来是第三个字段现在想把它变成第二个字段 mysql> alter table t1 modify xingming varchar(10) after id; xingming到中间 after后面跟id的名字 mysql> alter table t1 modify name varchar(10) first; 字段name到第一个 对于平时sql语句的查询来讲,它在哪个位置根本无所谓,因为到时候是按条件查询,它在第几个字段,根本不重要,影响的只是观感。 更新记录 update t2 set name="lili" where id=5; 只能用set,因为更新是更新其中某一个。不加条件改所有 删除记录 delete from t1 where id=6; 不加条件删所有 mysql> delete from t1; //删除所有记录 表复制:key不会被复制: 主键、外键和索引 复制一张表 mysql> create table t10(select * from t3);把t3复制到t10 看起来非常像,但是字段的有些属性是复制不过来的,只把名称复制过来 mysql> create table t10(select id,name from t3); 复制表结构 mysql> create table t10(select * from t3 where 1=8); 加一个永远不成立的条件,这种情况复制的东西只有表结构 单独复制表结构,不复制记录,加一个永远不成立的条件。 mysql> create table t4(select id,name from t3 where 5=4); 复制记录 mysql> insert into t3(select * from t10 where id=9);只复制一条记录 删除单张表 drop table t2; 删除多张表 mysql> drop table t1,t2,t3; 逗号隔开就行 【注意】不要拖延要积极,不要心动要行动。表操作