https://dev.mysql.com/downloads/windows/installer/8.0.html
安装下载
windows 配置环境变量
在windows下 想办法找到环境变量 ----->在系统变量下找到----->path ----->新建------> 把mysql 8.0 的路径复制到里面
------->C:\Program Files\MySQL\MySQL Server 8.0\bin // 到bin 目录。。。
数据库的关系模型 :多张表通过 key 关联起来。 一个项目一个数据库效率是最高的
表的每一行 : 称为 记录(record)
表的每一列: 称为字段 (列) column
数据库的命令:
1 创建数据库
create database 名字; // 创建数据库
2 查看数据库
show databases;// 查看所以的库
use 名字; // 选择数据库
show tables;// 查看数据库中的表,,,,只有选择数据库才有效
3 删除数据库
drop database 名字; // 删除数据库
对表的操作
1 创建表
create table 名字(列的名字 数据类型,列的名字 数据类型,列的名字 数据类型);
create table 数据库的名字 . 表的名字();//从数据库中创建表
create table 名字(列的名字 数据类型 primary key ); // primaray key;主键 这行不允许有相同的值
create table 名字(列的名字 数据类型 not null); // not null; 非空这行不允许有空值
create table 名字(列的名字 数据类型 unique); // unique; 唯一的 这行不允许有相同的值
create table 名字(列的名字 数据类型 comment 'xxxxxxxx') ;//comment 'xxxxxxxx' 是注释
2 查看表
desc 表的名字// 查看表的结构
select 列的名字 from 表的名字;// 显示表的一列
select * from 表的名字;// 显示表的所有内容
select 列的名字,列的名字 from 表的名字;// 显示表的两列
select 列的名字1 from 表的名字 where 列的名字2 = 值; // 找出这个 列的名字1 对应 列的名字2=值 对应的行的值
select * from 表的名字 where 列的名字2 = 值; // 找出所有列 对应 列的名字2=值 对应所有行的值
select distinct 列的名字,列的名字,......... from 表名;# 排重
select * from 表名 where 列的名字 in (值);# 查找包含值的所有行
select * from 表名 where 列的名字 not in (值);# 查找不包含值的所有行
select * from 表名 where 列名 between 值1 and 值2 ;# 查找 列 的值 在值1和值2之间的 行。。
select * from 表名 where 列名 not between 值1 and 值2 ;# 查找列的值 不在值1和值2之间的行。。
select * from 表名 where 列名<85 or 列名 >90 ; 值不在 <85 or >90 之间的行
select * from 表名 where 列名 like ‘M % ’ / ‘M _ ’; // %匹配多个字符 _ 匹配一个字符。
select 列名 ,列名 from 表名 order by 列名 ASC ; // 对查询的结果进行排序。
select 列名 , sum(列名 ) from 表名 group by 列名; //求和的分组查询
select 列名 , count(列名 ) from 表名 group by 列名; //出现相同的次数的总数求和查询
select 列名 , avg(列名 ) from 表名 group by 列名; // 平均数查询
select 列名 , max(列名 ) from 表名 group by 列名; // 最大值查询
select 列名 , min(列名 ) from 表名 group by 列名; // 最小值查询
select count(*) , group_concat(列名) from 表名 group by 列名 ; // 统计分组
联合查询
select * from 表名1 inner join 表名2 on 表名1.列名 = 表名2.列名;
select * from 表名1 as 别名1 inner join 表名2 as 别名2 where 别名1.列名 = 别名2.列名; // 这里的= 可以换成 “>”“>=”“<”“<=”和“!=”
select * from 表名1 别名1 inner join 表名2 别名2 where 别名1.列名 = 别名2.列名; //同上
//自连接 自己连接自己
select * from 表名 别名1 inner join 表名 别名2 on 别名1.列名 = 别名2.列名 and t2.name= '小红';
//外连接
select * from 表名 as 别名 1 right join 表名 as 别名2 on 别名1.列名 = 别名2.列名;
没有对应的数据显示为NUll
//合并查询
select 列名1 from 表名1 union all select 列名2 from 表名2 ;
//子查询
select 列名1 from 表名1 where id = (select 列名2 from 表名2 where name='小花');
select 列名1 from 表名1 where id in (select 列名2 from 表名2 where name='小花');
select * from 表名 where 列名 =102 and exists (select * from student where class_id=102);
select 列名1+列名2+列名3 total from 表名 where (math+chinese+english) >= ANY (select score from scholarship);
select 列名1+ 列名2+ 列名3 total from 表名 where (math+chinese+english) < ALL (select score from scholarship);
3 修改表
insert into 表的名字 values(列对应的数据,列对应的数据,列对应的数据)
insert into 表的名字 ( 列名1,列名2 )values (列对应的数据1,列对应的数据2)//跟指定的列插入数据
insert into 表的名字(列名1, 列名2) values(列对应的数据1, 列对应的数据2 ),(列对应的数据1, 列对应的数据2)........ ;
insert into 表的名字 values (year(),date(),now(), )// 插入时间
update 表名 set 列的名字 = 新的值 where 列的名字 = 原来的值;
update 表名 set 列的名字 = 新的值 // 这列的值全部跟新
4 删除表
delete from 表名 where 列名=100; //删除表中列名=100 的行
delete from 表名;//删除表中的所有数据
类型
int
float
日期,时间,类型
year 年 0000
date 年月日 0000-00-00
time 时分秒 00:00:00
datetime 年月日时分秒 0000-00-00 00:00:00
timestamp 时间戳 年月日时分秒 0000-00-00 00:00:00
:- _ / 可以用来分割时间。。。。 - : 常用
常用的时间函数:
curdate(); // 获取 年月日 插入的时候使用 select curdate();//显示当前的年月日
now();// 获取 年月日,时分秒 插入的时候使用 select now() // 显示年月日,时分秒
time(); // 时分秒 插入的时候使用 select time(now()); // 显示时分秒
year(); // 年 插入的时候使用 select year(now()); // 显示年
字符串类型
char[255]; 最大长度是255个字节
varchar(65535)=====相当于char(65535) 只是他的长度可以调整。最大长度是65535个字节
text 最大长度为65535 (65535) //固定长度没用;
enum 和 set 类型
enum 枚举类型
create table xx(枚举 enum('男',‘女’));#创建表
insert into xx valuses('男');/ insert into xx valuses(1); //插入值
create table yy(多选 set('足球’,‘篮球’,‘羽毛球’));#创建表
insert into yy valuses('足球,篮球');// 可以选择一个或者多选。。。。只用一个单引号, 引起来
列的完整性约束
primary key 特性: 非空 不允许插入 null 而且值是唯一的。
create table xx(列名 int primary key) ; // 单字段设置主键
create table xx(列名1 int , 列名2 float ,primary key(列名1,列名2)) ; // 多字段为联合主键 2个字段完全相同才不允许插入。。。
foreign key
受其它表主键的约束。。。。。外键的值只能在受到主键约束的列的里面取值; 外界的值可以为null;
create table yy{列名1 primray key }
create table xx{列名2 foreign key reference yy(列名1)}
not null 非空约束
这个列的值不能为空。。。。
unique 唯一字段 允许null 值出现多次
auto increment 自动增加 1 设置auto increment 后, 不指定 primary key / unique /forgin key 会报错
default 默认值
create table xx(列名 int default 10);// 默认值是10;
调整列的约束
新增主键
alter table 表名 add constraint 键的别名 unique / foreign / primary (列名);
alter table 表名 add constraint 键的别名 unique / foreign / primary key (列名); //等同
alter table 表名 add unique (列名);// 不增加别名
show create table 表名 ;//查看表的主键的别名。。
删除主键
alter table 表名 drop primary key; // 删除唯一建
alter table 表名 drop index 列名;// 删除建
alter table 表名 modify 列名 类型 属性 (这里是 not null / unique );
普通索引
create table 表名(id int, index 索引名( id DESC));
// ASC / DESC 升序 / 降序
alter table 表名 add index | key 索引名 (字段名 ASC / DESC ) ;
create index 索引名 on 表名(列名 ASC );
唯一索引
create table 表名( id int ,unique index 索引名 ( id ASC | DESC );
create table 表名( id int unique ,unique index 索引名 ( id ASC | DESC ); //都行
show create table 表名;//查看表的结构
alter table 表名 add unique index 索引名 (字段名 ASC / DESC ) ;
create unique index 索引名 on 表名(列名 ASC );
全文索引
create table 表名 (id int, xx varchar(1024), fulltext index 索引名(xx)); #创建表class, 并建立为xx 字段为全文索引
select * from 表名 where match(列名 ) against ('yyyyyyyyy');#利用全文检索索引快速查询记录、
create fulltext index 索引名 on 表名( 列名);
alter table 表名 add fulltext index 索引名(列名);
多列索引
create table 表名(id int, name varchar(128) UNIQUE , INDEX 索引名 (id, teacher));
索引的隐藏和删除
alter table 表名 alter index 索引名 invisible; #隐藏索引
alter table 表名 alter index 索引名 visible; #隐藏索引
drop index 索引名 on 表名; #删除索引
视图:
select user, Select_priv, Create_view_priv FROM mysql.user; //查看创建视图的权限
create view 名字 as select 列名,列名 from 表名 ;
create view 名字(列名,列名 ) as select 列名1,列名2 from 表名;
create view 名字 as select h1.xx,h2.yy from h1 inner join h2 on h1.id=h2.id;
视图中,基础表列名更改 视图的列名也要跟着修改
alter view 视图名 as select 列名,列名 from 表名;
drop view 视图名;
触发器
创建触发器
create trigger 触发器名 after insert on 表名1 for each row updata 表名2 set count = count +1 where 表名1.id= new.id;
create trigger 触发器名 after delete on 表名1 for each row update 表名2 set count=count-1 where 表名.id = OLD.class_id;
delimiter $$
create trigger 触发器名 after delete on 表名1 for each row
BEGIN
Delete from 表名1 where 表名1.id = OLD.id; #删除成绩表中的记录
update 表名2 set count=count-1 where 表名2.id = OLD.class_id; #更新班级表中的记录
END;
$$
delimiter ;
drop trigger 触发器名;//删除触发器
show triggers ; 显示所有的触发器
函数存储
DELIMITER $$
create procedure 函数名 (IN 变量名1 int,out 变量名2 int ) //in是 输入 out是输出
BEGIN
declare 变量名 int ; #定义变量 set 变量名=10; 给变量赋值
Select 列名 into 变量名 from 表名 where id = sid; #通过查询语句设置变量
delete from grade where id = sid; #删除成绩表中的记录
delete from student where id = sid; #删除学生表中的记录
update class set count=count-1 where id = cid; #更新班级表中的记录
END;
$$
DELIMITER ;
call 函数名(2);
call 函数名(2,@name,@count);
光标的使用
c++ 访问数据库
1 在 mysql 安装的文件夹下找到 include 和 lib 文件夹的目录
C:\Program Files\MySQL\MySQL Server 8.0\include
VC++ 目录 --->包含目录 --->C:\Program Files\MySQL\MySQL Server 8.0\include;
C:\Program Files\MySQL\MySQL Server 8.0\lib
VC++目录 ----->库目录----->C:\Program Files\MySQL\MySQL Server 8.0\lib;
2
连接器----->输入------>附加依赖项------>libmysql.lib;
3
把 libmysql.dll 文件 复制到 C:\Windows\System32 系统下面。。。
//连接数据库的代码
int main(void)
{
MYSQL mysql; //数据库句柄
MYSQL_RES* res; //查询结果集
MYSQL_ROW row; //记录结构体
//初始化数据库
mysql_init(&mysql);
//设置字符编码
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
//连接数据库
if (mysql_real_connect(&mysql, "127.0.0.1", "root",
"a12310.", "haha", 3306, NULL, 0) == NULL) {
printf("错误原因: %s\n", mysql_error(&mysql));
printf("连接失败!\n");
exit(-1);
}
else {
cout << "连接成功";
}
}