一、MySQL概述
1、什么是数据库 ?
答:数据的仓库。
2、什么是 MySQL、Oracle、SQLite、Access、MS SQL Server等 ?
答:他们均是一个软件,都有两个主要的功能:(mysql是用于管理文件的一个软件)
- a. 将数据保存到文件或内存
- b. 接收特定的命令,然后对文件进行相应的操作
- PS:如果有了以上软件,无须自己再去创建文件和文件夹,而是直接传递 命令 给上述软件,让其来进行文件操作,他们统称为数据库管理系统(DBMS,Database Management System
3、关系型数据库:mysql,SQL server, Oracle,db2,sqllite,access
非关系型数据库:MongoDB,redis
二、数据库操作
可以认为对数据库进行操作就是对文件进行操作
文件夹---->【数据库】
文件------>【表】
数据行------>【行】
1、显示数据库
show databases; (注意加s,以及分号)
2、创建数据库
# utf-8 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8;(创建文件,文件夹时后面都要加DEFAULT CHARSET utf8,否则不能插入中文。 # gbk CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk;
3、使用数据库
USE db_name;(相当于进入文件夹)
显示当前使用的数据库中所有表:SHOW TABLES;
4、用户管理
注意:在mysql command line client切换用户方法:mysql>system mysql -u 另一个用户名 -p;
创建用户:
create user '用户名'@'IP地址' identified by '密码';
create user 'peng'@'192.168.1.1'identified by '123456';
create user 'peng'@'192.168.1.%'identified by '123456';(%表示任意,即只要IP是192.168.1前缀的都可以登录)
create user 'peng'@'%'identified by '123456';(同理表示在所有机器上都能登录)
删除用户: drop user '用户名'@'IP地址'; 修改用户: rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';; 修改密码: set password for '用户名'@'IP地址' = Password('新密码') PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
5、授权管理
(规定用户只能看哪个目录、或者只能看哪个目录下的哪个文件...)
思考:权限是什么?针对于哪个目录下的哪个文件授权?给哪个用户授权?
1 show grants for '用户'@'IP地址' -- 查看权限 2 grant 权限 on 数据库.表 to '用户'@'IP地址' -- 授权 关键字:grant同意,准予,允许 3 revoke 权限 on 数据库.表 from '用户'@'IP地址' -- 取消权限 关键字:revoke:取消,废除;使无效 4 grant select,insert,update on db1.t1 to 'peng'@'%';(能查能插能更新,而且对于任意用户) on db1.t1-->表示只能看db1文件夹下的t1文件 5 grant all privileges on db.t1 to 'peng'@'%';
对于目标数据库以及内部其他: 数据库名.* 数据库中的所有 数据库名.表 指定数据库中的某张表 数据库名.存储过程 指定数据库中的存储过程 *.* 所有数据库
用户名@IP地址 用户只能在改IP下才能访问 用户名@192.168.1.% 用户只能在改IP段下才能访问(通配符%表示任意) 用户名@% 用户可以再任意IP下访问(默认IP地址为%)
grant all privileges on db1.tb1 TO '用户名'@'IP' grant select on db1.* TO '用户名'@'IP' grant select,insert on *.* TO '用户名'@'IP' revoke select on db1.tb1 from '用户名'@'IP'
三、学习SQL语句规则
操作文件夹
显示:show databases;
创建:Create database 数据库名 default charset utf8;
删除:drop database 数据库名;
DROP用于删除表,数据库等.
TRUNCATE和DELETE都是删除表数据.
但是TRUNCATE相当于初始化,比如如果有自增长ID,用TRUNCATE删除后,自增长Id会从
1开始,(truncat会释放表所占的空间)而delete则不会
操作文件
显示:show tables;
创建:
create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8;
示例:
create table t1(id int,name char(10)) default charset=utf8; (第一列的名称是id,数字类型,第二列是name,字符串类型,只能有十个字符,如果超过10个就只取10个)
create table t1(id int,name char(10))engine=innodb default charset=utf8;
create table t3(id int auto_increment,name char(10))engine=innodb default charset=utf8;
create table t1(
列名 类型 null,
列名 类型 not null, (是否可以为空,如果为空,这一列就可以不用插入数据)
列名 类型 not null auto_increment primary key,(加auto_increment,这一列就会自增)要搭配primary key
id int,
name char(10)
)engine=innodb default charset=utf8;
# innodb 支持事务,原子性操作 会回滚
# myisam myisam
★ 一个表里面只能有一个自增列,并且也只能有一个主键。并且auto_increment和primary key两者还有绑定关系,
如果设置是auto_increment就必须是primary key,否则就报错。
auto_increment 表示:自增
primary key: 表示: 1、一个约束(约束的条件是不能重复且不能为空); 2、加速查找
not null: 是否为空
删除:
清空表里面的内容: delete from t1; # 表示把这张表里面的内容清空,下次再插入,它那个自增id会根据原来的继续往后走。 truncate table t1; # 下次再插入,它那个自增id会从1开始。 删除表: drop table t1;
数字: tinyint int bigint FLOAT(不精准) 0.00000100000123000123001230123 DOUBLE(不精准) 0.00000000000000000000100000123000123001230123 0.00000100000123000000000000000 decimal(永远是精准的)推荐 0.1 decimal(总位数,小数点后面最多有的位数) 字符串: char(10) 速度快() 10表示字符不是表示字节 root char不管写没写到10个位置都占了十个位置(没写的地方用空格占位) root varchar(10) 节省空间 root varchar如果没有写到10个位置,其他位置不会被占用 PS:以后,创建数据表把 定长 列往前放,相对来说会快一些,这也是SQL优化的手段 比如填手机号,把手机号的长度规定死了用char。 比如地址,用varchar 把varchar放在列的最后面,变长的都放最后面。 char和varchar最多包含255个字符。 ★char和varchar区别面试可能会问到 text 上传文件: 文件存硬盘 db(数据库)存路径 时间类型 DATETIME(最常用)其他不一一列举 enum 枚举 # 选中之后只能拿它其中的一个 选项固定并且不经常修改的时候用枚举 示例: 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 集合类型 (了解即可) set是去里面找任意组合 示例: CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); # 只能填abcd的任意组合,不一定四个都要用上 INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); create table t1( id int signed not null auto_increment primary key, # 以后自增列按这个方式写就行,它是作为这一张表里面每一行数据的唯一表示。 num decimal(10,5), # decimal(总位数,小数点后面最多有的位数) name char(10) )engine=innodb default charset=utf8;
操作文件中的内容
增删改查
插入数据: insert into t1(id,name) values(1,'alex'); #(往表里面插into) 删除: delete from t1 where id<6 # (delete from t1是清空整张表,要指定地点删除用where) 修改:(更新) update t1 set age=18; # 把t1表里面所有age列都等于18 update t1 set age=18 where age=17; # 就把age是17的改成18 查看数据: select * from t1;
外键
外键:(存在两张表之间的关系) 节省空间 、约束 外键一对多 create table userinfo( uid bigint auto_increment primary key, name varchar(32), department_id int, # 外键加在第一张表,因为第一张才有department_id,写这个id才依赖另外一张表的id xx_id int, constraint fk_user_depar foreign key (department_id) references department(id), # constraint约束;限制 constraint fk_xxx foreign key (xx_id) references XX(id) # 还想添加约束就再写一遍,可以有1,2,3,4...个约束,逗号隔开 )engine=innodb default charset=utf8; create table department( id bigint auto_increment primary key, title char(15) )engine=innodb default charset=utf8;