孤单总是难免的

导航

 

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 << "连接成功";

}

}

 

posted on 2022-10-01 19:06  孤单总是难免的  阅读(17)  评论(0编辑  收藏  举报