一、数据库介绍
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。
主要应⽤范围:互联⽹领域,⼤中⼩型⽹站,游戏公司,电商平台等等。
二、数据库操作
1.结构化查询语句分类
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库,比如创建的用户会存在库里的表里去,用户的权限也会存在库里的某些表,这是最核心的库,初始化之后的库,平时不能动,除非做权限有关的东西。能看见目录的才是真实的库。
创建数据库:DDL
两种方法
1.在shell里,用mysqladmin去创建
#mysqladmin -u root -p1 create db1 (-p后面不能加空格)
2.在客户端连到服务器里边之后,用sql语句创建
#mysql> create database k; #k是数据库名称
数据库命名规则:
区分大小写,库的名字要有意义。,唯一性,不能使用关键字如 create select,不能单独使用数字,每条sql语句都要以;结尾,但是如果列比较多,想看的清楚一点,可以以\G结尾
翻转显示:\G
sql语句后面跟\G,一般适合查看字段比较多的东西,会翻转 select * from user\G,行变成了列,一条记录一个row。
select * from mysql.user\G 绝对路径,加一个库的名字,它就会去mysql库里找user表。把这个写在脚本里,就不用写两条指令了,就不用先切库,再去找表了。直接一条指令就行。
命令行操作数据库(脚本)
在脚本里这样写,mysql -e ‘show databases;’ e执行,执行后面跟引号,引号里面写sql语句。 能在shell执行也能在脚本里执行,还可以写多条语句用分号隔开就行了。
mysql -e 后面可以跟sql语句,sql语句直接用分号隔开,这种方法大部分情况没什么问题,但是有的时候需要往里面传变量可能就会有问题了。
这样传变量非常容易传,因为外面没有双引号单引号。这些东西完全可以写到脚本里面 ,写到 vim a.sh bash执行
平时sql语句比较少的情况下,不用怎么传变量,直接-e,sql语句比较多就用<<eof
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 <<eof
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; 逗号隔开就行