MySql数据库
"""
1、什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件
2、存储数据的位置:内存、硬盘
3、什么是系统:运行在硬件基础上,管理其他软件
"""
# 数据库的组成
"""
库:存放多张表 - 文件夹
表:包含多条相同结构的记录 - 文件
记录:包含多个key-value键值对的一条数据 - 二进制数据
字段:描述信息 - 信息本身 == key-value - 二进制数据
stu
id name age gender
1 Bob 18 男
2 Tom 17 女
...
teacher
...
"""
数据库的分类
# 1)关系与非关系
# 关系:数据库中表与表之间有联系 - mysql
# 非关系:没有表概念 - redis、mongodb(介于关系与非关系)
# 2)内存与硬盘
# 硬盘:数据可以永久存储 - mysql、mongodb
# 内存:数据的存取效率极高 - redis、memcache
# 3)sql与nosql
# sql:数据库操作通过sql语句
# nosql:数据库操作就是key-value形式(value就是一条记录)
# stu - {'name': 'Bob', 'age': 18}
# stus - [{'name': 'Bob', 'age': 18}, {'name': 'Tom', 'age': 18}]
# name - 'Jerry'
安装
"""
1、解压免安装版本(5.6 - 没有初始密码)
2、配置环境变量:数据库绝对路径下的bin
3、配置服务:
启动管理员终端:mysqld --install [nmysql] #安装服务端
"""
卸载
"""
前提)启动终端,输入 mysql,如果不是提示 不是内部或外部命令,代表已安装数据库
1)直接连入
i 搜索:服务,检索mysql服务,有
停止服务,并移除服务 - 启动管理员终端:mysqld --remove
ii 搜索:服务,检索mysql服务,无 (mysql使用命令启动)
停止服务,启动管理员终端
tasklist | findstr mysql
taskkill /pid 进程pid /f
2)连接超时
搜索:服务,检索mysql服务,移除服务即可
3)移除环境变量
总结:如果能连入,先停止服务 | 如果添加了服务,就移除服务 | 取消环境变量配置
"""
连接数据库
1)游客登陆(不一定能登入,登入了也啥都不能干)
>: mysql
2)账号密码登录
>: mysql -u root -p[密码]
再输入密码,没有任何提示,没有密码直接回车
3)连接指定服务器的mysql
>: mysql -h ip地址 -P 端口号 -u 账号 -p[密码]
回车后敲入密码
eg:
>: mysql -hlocalhost -P3306 -uroot -p[密码]
4)退出数据库
>: quit
>: exit
用户信息查看
1)查看当前登录的用户
mysql>: select user();
mysql>: select version(); 查看mysql版本:
2)root权限下可以查看所有用户信息
mysql>: select * from mysql.user; #查看所有用户的所有信息
mysql>: select * from mysql.user G; #查看所有用户的权限
mysql>: select user,password,host from mysql.user; #查看所有用户的(user,password,host)
3)root登录下,删除游客(操作后要重启mysql服务)
mysql>: delete from mysql.user where user='';
4)root登录下,修改密码(操作后要重启mysql服务)
mysql>: update mysql.user set password=password('12345678') where host='localhost';
updata mysql.user set password=password('root') where host='localhost';
5)没有登录
>: mysqladmin -u用户名 -p旧密码 -h域名 password "新密码"
eg>: mysqladmin -uroot -p12345678 -hlocalhost password "root"
6)root登录下,创建用户
mysql>:grant 权限们 on 数据库名.表名 to 用户名@主机名 identified by '密码';
数据库的基本操作
1)查看已有数据库(当前用户可以操作的)所有数据库
mysql>:show databases;
2)选择某个数据库
mysql>:use 数据库名 #进入某个具体的数据库,可以直接对该数据库下的表进行操作,不需要用 .
3)查看当前所在数据库
mysql>:select database(); #需要通过 use 进入具体数据库,并查看当前数据库锁拥有的表
4)创建数据库
mysql>:create database 数据库名 [charset=编码格式]; #不指定编码格式的话,默认为latin1
eg>: create database owen;
eg>: create database zero charset=utf8;
eg>: create database tank;
5)查看创建数据库的详细内容
mysql>:show create database 数据库名;
eg>: show create database owen;
6)删除数据库
mysql>: drop database 数据库名;
eg>: drop database tank;
7)修改字符编码
mysql>: alter database 数据库名 charset=编码格式;
SQL语句、语句扩展
top:TOP 子句用于规定要返回的记录的数目。
列(s) = *
sql top 语法
select top number|precent 列(s) from table_name; # 列(s) 表示 所有的列名称
top number例:select top 2 * from table_name; 或 select * from table_name limit 2;
top precent例:select top 50 precent * from table_name; # 选取表中50%的记录
like:LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式
sql like 语法
select 列(s) from table_name where 列 like pattern;
例:select * from table_name where 列 like 'A%'(在表中搜寻以A开头的)|'%B'(以B结尾的)|'%AB%'(包含AB的);
in:IN 操作符允许我们在 WHERE 子句中规定多个值
sql in 语法
select * from table_name where 列 in(值1,值2,...);
between:操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
sql between 语法
select * from table_name where 列 between 值1 and 值2; # 范围取头不取尾
alias:为列名称和表名称指定别名(Alias)。
sql alias 语法
表:select * from table_name as alias_name;
表别名例:select p.列1,p.列2,p.列3 from table_name1 as p,table_name2 as po where p.列1='值1' and p.列2='值2';
列:select 列 as alias_name from table_name;
列别名例:select 列1 as alias_name1,列2 as alias_name2 from table_name;
join:用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
sql join 语法
select tb1.列1,tb1.列2,tb2.列 from tb1 inner join tb2 on tb1.列3=tb2.列3 order by tb1.列1;
或
select tb1.列1,tb1.列2,tb2.列 from tb1,tb2 where tb1.列3=tb2.列3;
备注:不同的 SQL JOIN
除了在上面的例子中使用的 INNER JOIN(内连接),还可以使用其他几种连接。
下面列出了可以使用的 JOIN 类型,以及它们之间的差异。
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
inner join 关键字语法:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
select * from tb1 inner join tb2 on tb1.列=tb2.列; # inner join 与join是相同的
left join 关键字语法:LEFT JOIN 关键字会从左表(tb1)那里返回所有的行,即使在右表(tb2)中没有匹配的行。
select * from tb1 left join tb2 on tb1.列=tb2.列;
right join 关键字语法:RIGHT JOIN 关键字会右表(tb2)那里返回所有的行,即使在左表(tb1)中没有匹配的行。
select * from tb1 right join tb2 on tb1.列=tb2.列;
full join 关键字语法:只要其中某个表存在匹配,FULL JOIN 关键字就会返回行
select * from tb1 full join tb2 on tb1.列=tb2.列;
11、union:用于合并两个或多个 SELECT 语句的结果集(UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同)
sql union 与 union all 语法
select * from table_name1 union select * from table_name2;
select * from table_name1 union all select * from table_name2;
备注:默认地,union 选取不同的值,如果允许重复的值,就使用 union all(列出所有的值)
select into:从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。
sql select into 语法
select * into new_table_name [in externaldatabase] from old_table_name; # 所有列插入新表
select 列 into new_table_name [in externaldatabase] from old_table_name; # 某一列插入新表
例:备份某张表 select * into tb1_backup from tb1;
向另一个数据库中拷贝表 select * into tb1 in 'backup.mdb' from tb1;
多表查询存入到新表 select tb1.列1,tb2.列2 into new_table_name from tb1 inner join tb2 on tb1.列3=tb2.列3;
create index:用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
sql create index 语法
create index index_name on table_name(列); # 简单的索引,允许使用重复的值
create index index_name on table_name(列1 desc,列2); # 默认是升序,希望降序在列名称后添加保留字 desc,索引不止一个列可以逗号隔开
sql create unique index 语法 # 唯一的索引
create unique index index_name on table_name(列); # 唯一的索引意味着两个行不能拥有相同的索引值
alter table : 语句用于在已有的表中添加、修改或删除列。
sql alter table 语法
添加列:alter table table_name add 列 数据类型;
删除列:alter table table_name drop column 列;
改变列中数据类型:alter table table_name modify column 列 需要修改的类型;
只修改列的数据类型的方法:
通常可以写成 alter table 表名 modify column 列名 新的列的类型
例如:student表中列sname的类型是char(20),现在要修改为varchar(20),SQL语句如下
alter table student modify column sname varchar(20);
同时修改列名和列的数据类型的方法:
通常可以写成 alter table 表名 change column 旧列名 新列名 新的列类型
例如:student表中列sname的类型是char(20),现在要修改为stuname varchar(20),SQL语句如下
alter table student change column sname stuname varchar(20);
alter table table_name add <新列名> <数据类型> [约束条件][FLRST(添加列到表的最前面)|AFTER(指定列后面) <已存在的列>]; # 添加列
alter table table_name <旧列名> <新列名> <新数据类型>; # 修改列名
alter table table_name modify <列名> <数据类型>; # 修改列的数据类型
alter table table_name modify <列1(想要改变的列)> <数据类型> FLRST|AFTER <列2>; # 修改列的位置
alter table table_name drop <列>; # 删除列
alter table <旧表名> rename to <新表名>; # 修改表名
view(视图): 视图是可视化的表。视图包含行和列,就像一个真实的表
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
sql create view 语法
create view view_name as select 列(s) from table_name where 条件;
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
更新视图:create or replace view view_name as select 列(*) from table_name where 条件;
删除视图:drop view view_name;
数据库配置
# 通过配置文件统一配置的目的:统一管理 服务端(mysqld) 、客户端(client)
# 配置了 mysqld(服务端) 的编码为utf8,那么再创建的数据库,默认编码都采用utf8
# 配置流程
# 1)在mysql安装根目录下,创建配置文件:my.ini
# mac下配置文件名叫 my.cnf
# 2)设置配置文件内容并保存
[mysqld] # 服务器配置
port=3306 # 可以修改数据库默认端口(如果数据库端口被其他软件占用)
character-set-server=utf8 # 编码格式
#非安全模式
sql_mode = no_engine_substitution
#安全模式
#sql_mode = strict_trans_tables
#设置引擎
default-storage-engine=INNODB
collation-server=utf8_general_ci # 排序方式(默认跟编码格式走)
#utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
#utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
#utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容
[client] # mysql自己的客户端叫[mysql],配置[client]即配置了[mysql],也配置了其他存在方式的客户端,比如Navicat可视化客户端
default-character-set=utf8 # 编码格式
# 3)重启数据库服务
用户操作:重点
# 为特定的数据库分配有该数据库 操作权限 的用户
mysql>: grant 权限们 on 数据库.表 to 用户名@'主机名' identified by '密码';
# 1)all:所有权限
# 2)oldboy.*:oldboy数据库下所有表
# 3)oldboy@'localhost':本机可以通过oldboy用户登入
# 4)identified by 'Oldboy123':密码为Oldboy123
eg>: grant all on oldboy.* to oldboy@'localhost' identified by 'Oldboy123';
# 1)select,delete,update,insert,drop,alter:指定的权限
# 2)oldboy.*:oldboy数据库下所有表
# 3)oldboy@'%':任何机器可以通过oldboy用户登入
# 4)identified by 'Oldboy123':密码为Oldboy123
eg>: grant select,delete,update,insert,drop,alter on oldboy.* to oldboy@'%' identified by 'Oldboy123';
# 撤销权限
mysql>: revoke 权限1,权限2,... on 数据库名.表名 from 用户名@'主机名';
# 禁掉本地oldboy用户对oldboy数据库的所有表的drop权限
eg:> revoke drop on oldboy.* from oldboy@'localhost';
# 删除用户
drop user 用户名@'主机名';
数据库表的引擎:驱动数据的方式 - 数据库优化
# 前提: 引擎是建表是规定, 提供给表使用的, 不是数据库
# 展示所有引擎
mysql> show engines;
# innodb(默认): 支持事务, 行级锁, 外键
mysql>: create table t11(id int)engine=innodb;
# myisam: 查询效率要优于innodb, 当不需要支持事务, 行级锁, 外键, 可以通过设置myisam来优化数据库
mysql>: create table t12(id int)engine=myisam;
# blackhole:黑洞,存进去的数据都会消失(可以理解不存数据)
mysql>: create table t13(id int)engine=blackhole;
# memory:表结构是存储在硬盘上的,但是表数据全部存储在内存中
mysql>: create table t14(id int)engine=memory;
数据库的模式
# mysql 5.7 以后默认都是安全模式
# mysql 5.6 版本
sql_model=no_engine_substitution # 非安全性,默认
sql_model=strict_trans_tables # 安全性
# 查看当前数据库模式:
show variables like "%sql_mode%"; # %匹配0~n个任意字符 => 模糊查询
# 临时设置为安全模式,服务重启后会被重置
mysql>: set global sql_mode="strict_trans_tables"; # 在root用户登录状态下
# 在设置后,quit断开数据库连接后(服务器不重启)就会进入安全模式
# 安全模式下,非安全模式下sql执行的警告语句,都会抛异常
eg>: create table t1(name char(2));
eg>: insert into t1 values ("ab") # 正常
eg>: insert into t1 values ("owen") # 错误 Data too long for column 'name' at row 1
表的基本操作
##前提:先选取要操作的数据库
1)查看已有表
mysql>:show tables;
2)创建表
mysql>:create table 表名(字段1 类型, ..., 字段n 类型);
eg>: create table student(name varchar(16), age int);
eg>: create table teacher(name varchar(16), age int);
3)查看创建表的sql
mysql>:show create table 表名;
eg>: show create table student;
4)查看创建表的结构
mysql>:desc 表名;
5)改表结构
# 修改表名
mysql>: alter table 旧表 rename 新表;
# 修改字段名
mysql>: alter table 表名 change 旧字段 新字段 类型(长度);
# 修改字段属性
mysql>: alter table 表名 modify 字段 新类型(长度);
6)删除表
mysql>: drop table 表名;
eg>: drop table teacher;
创建表的完整语法
# 长度和约束在某些情况下是可以省略的
mysql>: create table 表名 (
属性名1 类型(长度) 约束,
...
属性名n 类型(长度) 约束
) engine=引擎 default charset=utf8;
记录的基本操作
1)查看某个数据库中的某个表的所有记录,如果在对应数据库中,可以直接查找表
mysql>: select * from [数据库名.]表名;
注:*代表查询所有字段
2)给表的所有字段插入数据
mysql>: insert [into] [数据库名.]表名 values (值1,...,值n);
eg:如果给有name和age两个字段的student表插入数据
1条>:insert into student values ('Bob', 18);
多条>:insert into student values ('张三', 18),('李四', 20);
指定库>:insert owen.student values ('张三', 18),('李四', 20);
3)根据条件修改指定内容
mysql>: update [数据库名.]表名 set 字段1=新值1, 字段n=新值n where 字段=旧值;
eg:> update student set name='王五', age='100' where name='张三';
注:i) 可以只修改部分字段 ii) 没有条件下,所有记录都会被更新
eg:> update student set name='呵呵';
4)根据条件删除记录
mysql>: delete from [数据库名.]表名 where 条件;
eg:> delete from student where age<30;
sql函数
函数及描述
NOW():返回当前的日期和时间
CURDATE():返回当前的日期
CURTIME():返回当前的时间
DATE():提取日期或日期/时间表达式的日期部分
EXTRACT():返回日期/时间按的单独部分
DATE_ADD():给日期添加指定的时间间隔
DATE_SUB():从日期减去指定的时间间隔
DATEDIFF():返回两个日期之间的天数
DATE_FORMAT():用不同的格式显示日期/时间