目录
一.SQL语句简介
1.1SQL语言
- Structured Query Language的缩写,即结构化查询语言
- 关系型数据库的标准语言
- 用于维护管理数据库
- 包括数据查询,数据更新,访问控制,对象管理等功能
1.2SQL语句分类
- DDL:数据定义语言
用于创建数据库对象,如库、表、索引等。
例如:CREATE,DROP,ALTER 等
- DML:数据操纵语言
用于对表中的数据进行管理。
例如: SELECT、UPDATE、INSERT、DELETE 等。
- DQL:数据查询语言
于从数据表中查找符合条件的数据记录。
例如: SELECT
- DCL:数据控制语言
用于设置或者更改数据库用户或角色权限
例如: GRANT,REVOKE
1.3SQL分类
-
数据库:database
-
表:table,行:row 列:column
-
索引:index
-
视图:view
-
存储过程:procedure
-
存储函数:function
-
触发器:trigger
-
事件调度器:event scheduler,任务计划
-
用户:user
-
权限:privilege
1.4SQL 语言规范
-
在数据库系统中,SQL 语句不区分大小写,建议用大写
-
SQL语句可单行或多行书写,默认以 " ; " 结尾
-
关键词不能跨多行或简写
-
用空格和TAB 缩进来提高语句的可读性
-
子句通常位于独立行,便于编辑,提高可读性
二.数据库基本操作
2.1查看数据库中的库信息
show databases
2.2查看数据库中的表信息
数据库内查看
use 数据库名
show tables
数据库外查看
show tables from 数据库名
库外查看要指定具体的数据库名
2.3显示数据库的结构(字段)
describe [数据库名]表名、
可缩写成: desc [数据库名.]表名;
由于屏幕占比问题与字段数量问题,会导致有些表结构的效果呈现并不好。(默认查看为横向的查看 )
desc 表名\G;
2.4 字段属性
Field:字段名称
type:数据类型
Null :是否允许为空
Key :主键
Type:数据类型
Null :是否允许为空
key :主键
Default :默认值
Extra :扩展属性,例如:标志符列(标识了种子,增量/步长)1 2
id:1 3 5 7
2.5常见的数据类型
类型 | 说明 |
int | 整型,用于定义整数类型的数据 |
fload | 单精度浮点4字节32位,准确表示到小数点后六位 |
double | 双精度浮点8字节64位 |
char | 固定长度的字符类型,用于定义字符类型数据。 |
varchar | 可变长度的字符类型 |
text | 文本 |
image | 图片 |
decimal(5,2) | 5个有效长度数字,小数点后面有2位。指定长度数组 |
2.6 char 和 varchar 的区别
值 | CHAR(4) | 存储需求 | VARCHAR(4) | 存储需求 |
---|---|---|---|---|
'' | ' ' | 4个字节 | '' | 1个字节 |
'ab' | 'ab ' | 4个字节 | 'ab ' | 3个字节 |
'abcd' | 'abcd' | 4个字节 | 'abcd' | 5个字节 |
abcdefgh' | 'abcd' | 4个字节 | 'abcd' | 5个字节 |
char
char的长度是不可变。char如果存入数据的实际长度比指定长度要小 会补空格至指定长度 如果存入的数据的实际长度大于指定长度,低版本会被截取高版本会报错。
varchar
varchar长度是可变的,默认会加一个隐藏的结束符,因此结束符会多算一个字节。
对比
- varchar比char节省磁盘空间。
- 但varchar类型的数据读写速度比char慢,因为char是连续的磁盘空间,而varchar在多次增删改查中会产生一些磁盘空间碎片
三.数据库管理(增删改查)
3.1数据库的创建
create database dashuju;
3.2表的创建
#格式
CREATE TABLE 表名(字段1 数据类型,字段2 数据类型[,...] [,PRIMARY KEY (主键名)]);
create table class (id int not null,name char(15) not null,score decimal(4,2),passwd char(45) default'',primary key (id));
#解释
id 字段:这是一个整数类型(int)字段,标记为"not null",表示该字段不允许存储NULL值。同时,它被指定为主键(primary key),这意味着每一行的id字段值必须是唯一的,通常用于唯一标识表中的每一条记录。
name 字段:这是一个固定长度字符类型(char(15))字段,同样不允许存储NULL值。这意味着每个name字段的值必须是一个最多包含15个字符的字符串,若实际输入的字符数少于15个,剩余部分会被填充为空格以达到15个字符的长度。
score 字段:这是一个十进制类型(decimal(4,2))字段,用于存储带小数点的分数。"(4,2)"表示该字段可以存储最大共4位数字,其中包含2位小数,例如0.00到999.99之间的数值。
passwd 字段:这是一个固定长度字符类型(char(45))字段,用于存储密码信息,默认值(default)被设置为空字符串('')。这意味着如果没有为passwd字段提供值,它将自动填充一个空字符串。
当这条SQL语句被执行后,数据库中将创建一个名为class的表,包含id、name、score和passwd这四个字段。
主键:共同点:字段的值都是唯一的,不允许有重复值。
3.3插入数据
方式一:指定字段插入数据
#为指定字段插入值
INSERT INTO 表名(字段1,字段2[,...]) VALUES (字段1的值,字段2的值,...);
#注意字段的属性not null,则必须为该字段插入值
insert into class (id,name,score,passwd) values(1,'张三',90,PASSWORD('123456'));
大写的PASSWORD表明用密文表示
如果不加 PASSWORD,直接按照字段顺序插入
为所有字段插入值
insert into 表名 values (所有字段的值);
#每个字段值用逗号相隔;
这时密码由明文表示
3.4查找数据库表中的数据
SELECT * FROM 表名; #查询表中所有记录
#按条件查找数据记录,且只显示指定字段的值
SELECT 字段名1,字段名2[,...] FROM 表名 [WHERE 条件表达式];
#mysql的分页语句:
select * from 表名 limit 2;
select * from 表名 limit 2,3;
#显示第2行后的前3行(即显示第3~5行)
显示class表中的所有信息
显示表中name=lisi的信息 (附带条件)
显示表中id=2的信息 (附带条件)
显示class表中第一行的信息
显示ky35表中第一行后的前两行,即显示2和3行
3.5修改表中的数据
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
#如若不指定条件 那么修改更新的数据信息就是数据表中所有信息
#将数据表ky35中所有score字段都修改为90
#where代表条件判断 更新ky35数据表中的score段 id为2的用户信息的score字段修改为92
3.6删除表中的数据
DELETE FROM 表名 [WHERE 条件表达式]; #删除一定要加条件,不然会删除整个表
危险:删除一定要加条件,不然会删除整个表!!!
指定条件删除ky35表中id=2的数据
不加条件就是删除整个表,切勿删库
3.7删除指定的表
DROP TABLE 数据库名.表名;
或
USE 库名;
DROP TABLE 表名;
删除了大数据库中的class表
3.8删除指定的库
DROP DATABASE 数据库名;
删除了大数据库
四. 表结构的管理
4.1 修改表名
ALTER TABLE 旧表名 RENAME 新表名
将原先的表ky35改名为ky36
4.2 扩展表结构(增加字段)
ALTER TABLE 表名 ADD 字段名 数据类型;
#修改数据表ky36内容 新增Phone的数据列 字段字节长度为11位 默认值为15252526801
alter table ky36 add Phone varchar(11) default '15252526801';后还可以跟约束 例如not null为非空
4.3 修改字段名,添加唯一键 change
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 [数据类型] [约束];
修改phone为num,并更换数据类型和添加约束
4.4 删除字段 drop
ALTER TABLE 表名 DROP 字段名;
删除指定字段num
4.5 克隆表
方式一:like方法
create table 新表名 like 旧表名;
#通过LIKE方法,复制旧表的结构生成新表
insert into 新表名 (select * from 旧表名);
#再将旧表数据导入新表
将ky36复制到ky37
这时我们可以查看到ky37和ky36的结构一样
将源表ky36的数据导入到ky37中
方式二:Show create table方法
create table 新表名 (select * from 旧表名);
和方法一对比,方法二并不能保持原有表的结构
区别
第一种 迁移表 表的结构、属性、约束、数据都有
第二种 备份数据 表的复制内容(数据)
如果想将数据迁移到其他地方使用Like备份方法;
如果想只备份数据的内容可以使用第二种方法。
4.6临时表
临时建立的表,用于保存一些临时数据,不会长期存在(下次重新进入数据库即不存在)
如果在退出连接之前,也可以可执行增删改查等操作,比如使用DROP TABLE语句手动直接删除临时表。
CREATE TEMPORARY TABLE 表名(字段1 数据类型,字段2 数据类型[, ...] [, PRIMARY KEY (主键名)]);
临时表创建和正常表格一样
create temporary table class1 (id int(6) zerofill primary key auto_increment,name varchar(20) not null,cardid int(18) not null unique key,hobby varchar(30),haoma int(11));
#解释
这条SQL语句用于创建一个临时表class1,临时表只在当前会话期间存在,会话结束后自动删除。临时表的具体结构如下:
id 字段:整数类型(int),设置了宽度为6且自动填充零(zerofill),这意味着即使实际值小于6位数,也会在其前面填充零以使总长度达到6位。同时,该字段被定义为主键(primary key)和自动递增(auto_increment),这意味着每当插入新行时,id字段的值会自动加1,且每一行的id值在整个临时表中必须是唯一的。
name 字段:变长字符串类型(varchar(20)),不允许存储NULL值(not null),最多可存储20个字符长度的字符串。
cardid 字段:整数类型(int),宽度为18,也不允许存储NULL值。该字段还被定义为唯一键(unique key),即在cardid列中的所有值必须独一无二,不可重复。
hobby 字段:变长字符串类型(varchar(30)),可以存储最多30个字符长度的兴趣爱好描述,允许存储NULL值。
haoma 字段:整数类型(int),宽度为11,可以存储不超过11位的整数电话号码,允许存储NULL值。
执行这条SQL语句后,将在当前数据库会话中创建一个临时表class1,具备上述五个字段和相应的约束条件。
建好临时表class1却看不到
可以查询出临时表class1
插入数据
退出mysql后重新登陆
这时再查询时,会发现临时表已经被释放了,因为临时表是存在内存中的,一旦推出就会被释放
4.7清除表的三种方式
delete清空
delete from 表名;
truncate清空
truncate table 表名;
drop清空
drop table 表名;
区别
delete 清空属于按照行清空,一行一行进行,效率低,速度慢(对于表数据较多的情况) truncate 相当于删除表数据,保留表结构,重新创建一个与原表结构相同的表
当数据表中有自增型约束字段时,delete 清除表数据后,在插入数据时,自增字段的数值会接着被删除表数据的最后一个自增数,计数。(eg:被删除表数据最后一行id(自增),为10,再创建时,该id从11开始)。truncate 清空后,自增型字段会从1开始计数。
当不再需要一张表的时候使用Drop;想保留部分数据的时候使用Delete,并且带上Where语句;保留表而删除所有数据的时候用Truncate
五.数据库用户管理
5.1. 登录用户的管理
明文密码创建用户格式:
CREATE USER '用户名'@'来源地址' [IDENTIFIED BY [PASSWORD] '密码'];
- 来源地址:可以指定为localhost本机,也可以指定%(代表任意地址),或者指定为192.168.241.%(代表192.168.241网段的主机都可以登录)
- IDENTIFIED BY:不能省略,如果省略,用户密码将为空(不建议使用)
- 密码:若使用明文密码,直接输入密码即可,键入到数据库中数据库会自动加密;若使用加密密码,需要先使用Select PASSWORD('密码')命令,来获取加密密码,再将获取到的加密密码添加到PASSWORD中
新建一个用户名为zk,地址为本机,密码为123的用户
加密密码创建用户:
SELECT PASSWORD('密码'); #先获取加密的密码
CREATE USER 'zk1'@'localhost' IDENTIFIED BY PASSWORD '加密的密码';
查看用户信息,创建后的用户保存在mysql数据库的user表里
use mysql;
select user,authentication_string,Host from user;
5.2查看用户密码的信息
用户信息存放在 mysql
数据库下的 user
表(MySQL 服务下存在一个系统自带的 mysql 数据库)。
找到了我们创建的用户zk,并且发现他的密码自动生成了密文
5.3 登录用户用户名的更改 (重命名)
rename user 'zk'@'locahost' to 'zk2'@'localhost'
5.4修改用户密码
set password = password('123');
5.5删除登录用户
drop user 'zk2'@'localhost';
5.6 修改其他用户密码
set password for 'zk1'@'locahost' = password('123456');
普通用户只有修改自身密码的权限
root用户是超级管理员,它不仅可以修改自身密码,还能修改其他用户的密码。
5.7 忘记root密码的解决方法
在数据库本机的root用户才可执行
修改 /etc/my.cnf 配置文件,免密登录mysql
在服务端里面添加:
使登录mysql不使用授权表,添加到23行:skip-grant-tables
重启数据库服务
免密登录之后,修改数据库用户中的 root 密码
update mysql.user SET AUTHENTICATION_STRING = PASSWORD('123') where user='root'
#用于更新MySQL数据库系统表mysql.user中的用户root的密码。AUTHENTICATION_STRING是MySQL 5.7.0以后版本中用于存储密码的字段名
flush privileges; #刷新数据库配置
退出并登录测试新密码
撤销添加的免密码认证设置,重启数据库服务
加上#注释掉这一行
六.数据库用户权限管理
6.1常见的用户权限
权限 | 权限说明 | 权限级别 |
CREATE | 创建数据库、表或索引的权限 | 数据库、表或索引 |
DROP | 删除数据库或表的权限 | 数据库或表 |
GRANT OPTION | 赋予权限选项 | 数据库或表 |
REFERENCES | 引用权限 | 数据库或表 |
ALTER | 更改表的权限 | 数据表 |
DELETE | 删除表数据的权限 | 数据表 |
INDEX | 操作索引的权限 | 数据表 |
INSERT | 添加表数据的权限 | 数据表 |
SELECT | 查询表数据的权限 | 数据表 |
UPDATE | 更新表数据的权限 | 数据表 |
CREATE VIEW | 创建视图的权限 | 视图 |
SHOW VIEW | 查看视图的权限 | 视图 |
ALTER ROUTINE | 更改存储过程的权限 | 存储过程 |
CREATE ROUTINE | 创建存储过程的权限 | 存储过程 |
EXECUTE | 执行存储过程权限 | 存储过程 |
FILE | 服务器主机文件的访问权限 | 文件管理 |
CREATE TEMPORARY TABLES | 创建临时表的权限 | 服务器管理 |
LOCK TABLES | 锁表的权限 | 服务器管理 |
CREATE USER | 创建用户的权限 | 服务器管理 |
RELOAD | 执行 flush privileges, refresh, reload 等刷新命令的权限 | 服务器管理 |
PROCESS | 查看进程的权限 | 服务器管理 |
REPLICATION CLIENT | 查看主从服务器状态的权限 | 服务器管理 |
REPLICATION SLAVE | 主从复制的权限 | 服务器管理 |
SHOW DATABASES | 查看数据库的权限 | 服务器管理 |
SHUTDOWN | 关闭数据库的权限 | 服务器管理 |
SUPER | 超级权限 | 服务器管理 |
ALL [PRIVILEGES] | 所有权限 | |
USAGE | 没有任何权限 |
6.2查看用户已有权限的操作
show grants;
#查看当前用户(自己)的权限
root用户拥有所有权限,以及给别人授权的权限
show grants for 'zk1'@'locahost';
#查看其他用户的权限
只拥有登陆权限,默认还拥有更改自己密码
6.3 授权操作
[NO_AUTO_CREATE_USER
], 即在grant语句中禁止创建空密码的账户,使用grant语法创建用户必须带上 “identified by”关键字设置账户密码,否则就被认为是非法的创建语句。
对存在的用户进行授权
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'来源地址' [IDENTIFIED BY '密码'];
- 权限列表: 用于列出授权使用的各种数据库操作,以逗号进行分隔如"select, insert,update"。 使用"all"表示所有权限(实际上部分权限仍无法使用,只包括大部分权限),可授权执行任何操作。
- 数据库名.表名: 用于指定授权操作的数据库和表的名称,其中可以使用通配符*。 例如,使用"mysql.*" 表示授权操作的对象为mysql数据库中的所有表。 '用户名'@'来源地址': 用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。 来源地址可以是域名、IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址。
- IDENTIFIED BY: 用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略"IDENTIFIED BY"部分,则用户的密码将为空。
grant select,insert on yunjisuan.ky35 to 'zk1'@'locahost';
show grants for 'zk1'@'locahost';
赋予了用户zk1 查询ky35表和插入表数据的权限
对不存在的用户进行创建并授权
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'来源地址' IDENTIFIED BY '密码';
创建了用户zk2,并赋予了他所有权限
撤销用户权限
revoke 权限列表/ALL on 库名.表名 from '用户名'@'来源地址';
*.*代表任意库的任意表
6.4用户远程登录
用户授权
grant all privileges on *.* to 'zk2'@'192.168.209.%' identified by '123';
使用Navicat图形化工具远程连接
七.总结
查看数据库、数据表和表结构的操作
- 查看数据库show databases
- 查看数据表show tables
- 查看表结构describe tablename或desc tablename
创建库和表的操作及删除库和表的操作
- 创建库create database databasename
- 创建表create table tablename
- 删除库drop database databasename
- 删除表drop table tablename
数据表的增、删、改、查等操作
- 数据表增:Insert into tablename
- 数据表改:update tablename set 指定内容
- 数据表删:delete from tablename
- 数据表查:select(*、where、limit、\G)
- 数据表结构名称改:alter table tablename rename 新名称
- 数据表扩展结构增:alter table tablename add 扩展名
- 数据表字段内容改:alter table tablename change 原结构字段名称 新结构字段名称
- 数据表字段内容删:alter table tablename drop 指定结构字段
数据库表的清空表、临时表和克隆表操作
清空表
- delete from tablename
- truncate table tablename
- drop from tablename
临时表
create temporary tabletablename
克隆表
- Like方法:create table 新表 like旧表------->insert into 新表 select *from旧表
- Show create table方法:create table 新表(select * from 旧表)
数据库的用户授权相关操作
数据库用户管理
- 新建用户:create user '用户名'@'localhost(或者指定IP)' identified by '密码'
- 重命名:rename user '旧用户名'@'localhost(或者指定IP)' to '新用户名'@'localhost(或者指定IP)'
- 删除用户:drop user '用户名'@'localhost(或者指定IP)'
- 修改当前密码:set password = password('密码')
- 修改其他用户密码:set password for '用户名'@'localhost' = password('新密码');
- 修改密码:update mysql.user set authentication_string = password('abc123') where user='root'
- 修改密码:flush privileges------>set password for root@localhost=password('123123')
数据库授权
- 授权:grant 权限列表 ON 数据库名.表名 to '用户名'@'来源地址' identified by '密码'
- 查看权限:show grants '用户名'@'来源地址'
- 撤销权限:revoke 权限列表 on 数据库名.表名 from '用户名'@'来源地址'