用户
```
CREATE USER 'kk'@'%' IDENTIFIED BY 'password';
创建用户
select host,user from mysql.user; 查看用户
```
权限
```
SHOW GRANTS FOR 'kk'@'%'; 查看用户权限
GRANT ALL PRIVILEGES ON *.* TO 'kk'@'%' WITH GRANT OPTION; # 给予所有权限
revoke 权限列表 on 库.* from ⽤户@客户机地址; # 取消权限
show grants for ⽤户@客户机地址 # 查看权限
flush privileges; # 刷新权限
```
创建数据库
```sql
create database if not exists 库名 charset utf8mb4;
```
使用库
```sql
use 库名;
```
关于表的操作
1、创建表
```
create table student(
-> id int auto_increment,
-> name varchar(25) not null,
-> gender varchar(25) not null,
-> primary key (id)
-> );
```
2、修改表
添加列:
```
ALTER TABLE table_name ADD column_name(字段名) datatype(数据类型) constraints(约束);
```
删除列:
```
ALTER TABLE table_name DROP COLUMN column_name;
```
修改列类型或约束:
```
ALTER TABLE table_name MODIFY COLUMN column_name new_datatype constraints;
```
同时修改列名和类型
```
ALTER TABLE table_name CHANGE COLUMN old_column_name new_column_name new_datatype constraints;
```
添加索引:
```
ALTER TABLE table_name ADD INDEX index_name (column_name);
```
3、删除表
```
DROP TABLE table_name;
```
4、查看表结构
```
DESC table_name;
```
关于数据的操作
1、创建
```
INSERT INTO students (name, age, gender) VALUES ('张三', 20, 'M');
```
2、查询
```
SELECT name, age FROM students WHERE gender = 'M';
```
3、更改
```
UPDATE students SET age = 21 WHERE name = '张三';
```
4、删除
```
DELETE FROM students WHERE name = '张三';
```
函数的使用
统计表中数据的⾏数或者统计指定列不为空值的数据⾏个数
```
select count(*或表头名) from 表名;
```
计算指定列的最⼤值,如果指定列是字符串类型(⽂字类型)则使⽤字符⾸拼排序
```
select max(表头名)from 表名;
```
计算指定列的最⼩值,如果指定列是字符串类型(⽂字类型)则使⽤字符⾸拼排序
```
select min(表头名)from 表名;
```
计算指定列的数值和,如果指定列不是数值类型则计算结果为 0
```
select sum(表头名)from 表名;
```
计算指定列的平均值,如果指定列不是数值类型则计算结果为 0
```
select avg(表头名)from 表名;
```
分组查询
```
select 聚合函数(表头名) 临时表头名,真实表头名 from 数据表名group by 真实表头名;
select 聚合函数(表头名 1),表头名 2 from 数据表名 group by 表头名;
group by 表头名 以'表头名'作为分组,查询数据
```
子语句查询
1、⽐较运算符的⼦查询
```
select * from class where cid>(select classid from student where sname='张三');
查询⽐张三同学所在班级编号还⼤的班级的信息
```
2、exists 关键字的⼦查询
exists 关键字后⾯的参数可以是任意⼀个⼦查询, 它不产⽣任何数据只返回 true 或 false。⽽当返回值为 true 时外层查才会执⾏。
```
select * from class where exists (select * from student where sname='王五');
假如王五同学在学⽣表中则从班级表查询所有班级信息
```
多表联合查询
1、交叉连接查询
交叉连接返回的结果是被连接的两个表中所有数据⾏的笛卡尔积;
```
select * from student cross join class;
#两个表交叉连接,class表的cid和student表的classid相乘
#cid与classid为两表主键
```
2、多表联合查询
join:联合
on:条件
```
mysql> select sname,cname from student inner join class on student.classid=class.cid;
inner 内连接
```
一、视图(View)
视图是数据库中的一个虚拟表,其内容由查询定义。视图同真实的表一样,包含一系列带有名称的列和行数据,但是视图并不在数据库中以存储的数据值集形式存在,行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
作用:
简化复杂查询:当经常需要执行复杂的SQL查询时,可以将其保存为视图,这样每次需要数据时,只需简单地查询该视图即可。
数据安全性:通过视图,可以限制用户对基础数据的访问,只展示用户需要看到的数据列,或者根据用户权限展示不同的数据行。
数据抽象:视图可以隐藏数据的复杂性,使得用户或应用程序只需关注他们关心的数据部分。
满足多种数据展示需求:对于同一份数据,可能需要根据不同的业务需求以不同的方式展示,这时可以创建多个视图来满足这些需求。
隔离:通过视图,可以隔离基础表数据的复杂性和变动性,使得应用程序或用户只需关注视图提供的数据。
二、索引(Index)
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引的主要目的是加快检索表中数据,即能协助信息搜索者尽快地找到符合限制条件的记录ID的辅助数据结构。
分类:
聚簇索引:按照数据存放的物理位置为顺序的索引,能提高多行检索的速度。
非聚簇索引:与聚簇索引不同,非聚簇索引对于单行的检索很快。
作用:
提高系统的性能:通过创建索引,可以大大加快数据的检索速度,特别是在数据量大的情况下。
保证数据的唯一性:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
加速表和表之间的连接:特别是在实现数据的参考完整性方面特别有意义。
减少分组和排序时间:在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
三、事务(Transaction)
事务是数据库管理系统中的一个概念,用于管理一组数据库操作,使它们作为一个不可分割的工作单元,要么全部执行成功,要么全部回滚(撤销)。
ACID属性:
原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部失败回滚,以保持数据的一致性。
一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。
隔离性(Isolation):数据库系统提供一定的隔离级别,使得并发执行的事务之间不会互相干扰。
持久性(Durability):一旦事务被提交,其对数据库的更改就会持久保存,即使系统崩溃也不会丢失。
作用:
保证数据的一致性:通过确保事务的原子性,保证数据库的数据一致性。
确保数据的完整性:通过ACID属性来确保数据的完整性,防止数据丢失或损坏。
提供隔离性:确保多个并发事务之间的隔离,避免了数据交叉访问和干扰,保证了每个事务的独立性。
支持持久性:一旦事务被提交,其对数据库的更改就会持久保存,即使系统崩溃也不会丢失。