mysql

基础

基本语法

sql语句的分类

基础

下载安装mysql略,自行安装, (windows)
下载安装完毕,配置环境变量
配置环境变量,复制copy安装目录下的bin的路径,添加到环境变量PATH里面,这样就可以使用cmd命令窗口来操作数据库了

连接数据库

   mysql  -uroot -pmima
   也可以 mysql -uroot -p
            回车后在输入密码
    -u用户名
    -p密码
    -h 主机名localhost(默认值) 可以是ip
    如 
    mysql  -uroot -pmima -hlocalhost   连接本地的数据库
    
    exit或者quit退出数据库连接

查看所有数据库

show databases; 记得要写分号

连接指定的数据库

 use 数据库名

查看该数据库所有的表

  show tables;  记得加分号

查询表信息

select * from 表名
sql语句的关键字不区分大小写,但建议关键字大写,方便区分
 SELECT * FROM 表名

注释

  #sql语句
  -- sql语句  横线后面要加空格
  /*sql语句*/   属于多行注释,在cmd里面无法演示,可以在数据库的可视化工具上使用


基本语法

1.数据类型

  一般我们整型取int就够了,4个字节,tinyint是一个字节 

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

 字符串我们只要知道char和varchar的区别和使用
 一般如果字符较多,我们就使用TEXT就可以满足需求了,如文章内容
 其他的类型暂时不用管

在这里插入图片描述

在这里插入图片描述

运算符

 =即是判断也可以是赋值,看情况
 
 !=不等于      <  ,   > ,  <=  ,  >= 
 
 or  或的意思, and   与的意思
  
 between...and   在什么之间, 如  between  5 and 10  ,在5和10之间
  
  in   在什么之内,包含的意思  ,如 id in(1,2,3)  
   ont in 不在里面,不包含


sql语句的分类

 DDL(data defination language) 数据定义语言 
    作用:创建 删除 修改 库表结构
   
 DML(data manipulation language)数据操作语言
    作用:增 删 改表的记录

 DCL(data control language)数据控制语言
    作用:用户的创建以及授权

DQL(data query language)数据查询语言
    作用:查询数据

DDL

  查询所有数据库
   show databases
   
  切换数据库 
   use 数据库名
 
  创建数据库名
    create database 数据库名称

  删除数据库
    drop database  数据库名

在这里插入图片描述

例如
 create table user(
    -> id int unsigned not null auto_increment,  设置无符号不为空,自动递增
    -> name varchar(6) not null,
    -> free decimal(8,2) not null default 0.00,
    -> data timestamp not null,
    -> primary key(id) 在这里将需要的字段设置为主键,有多个,用逗号隔开
    -> );

查看表结构

   要在对应的数据库里,如果不是,是查询不到的
   desc 表名

查看创建表的sql语句

   show create table 表名

删除表

 drop table 表名 

修改表名

    alter table 旧表名 rename to 新表名
    加不加to都可以成功修改

修改字段(可以修改字段类型,类型长度,默认值,注释)

 ALTER  TABLE 表名 MODIFY COLUMN 字段名 新数据类型 新类型长度  新默认值  新注释
 alter  table table1 modify  column column1  decimal(10,1) DEFAULT NULL COMMENT '注释             
      column可以省略

如 修改类型长度

之前是  varchar(6)
  alter table user modify name varchar(8);   修改它的长度  ,modify关键字,修改的意思
  当然它之前的值都会被重新定义为初始值,所以可以在进行设置

修改字段名

  alter table user change name user_name varchar(8) not null;
              表名   关键字           记得要把其他的属性加上,尽管其他的不要修改,不加上会报错                
               name原名   user_name新名

添加字段

alter table 表名 add 字段名 varchar(6) not null;   后面跟属性
              关键字add
当然我们还可以指定创建的字段的位置
如    alter table 表名 add 字段名 varchar(6) not null after name;   那么他就会出现在name字段的后面
                                               关键字 after ,谁的后面

删除字段

  alter table 表名 drop 字段名;
              关键字drop


DML

     对表记录的(增删改) 

插入语句

   insert into 表名(字段名1,字段名2,...) values(字段值1,字段值2,..);
         字段名和字段值是相对应的  ,有几个就要写几个
         可以不用一增条完整的记录插入,可以只插入其中的几个字段,其他的不插入也可以
         只要符合字段名和字段值就可以

  
    也可以 insert into 表名 values(字段1的值,字段2的值,...)如果是字符串要使用引号,
      这样的写法,必须要对所有的字段都提供值,且要对应 该表字段的顺序来添加值,多了或者少了
      都会失败,

show variables like ‘%char%’; 可以查看mysql数据库的编码方式
在这里插入图片描述

 value表示的是字符集
 latin1其实就是ISO-8859-1
 binary表示字节
  
 Variable_name 下面的
 client 表是展示数据的窗口显示的编码
 connection表示连接数据库时使用的编码
 results表示显示的结果所用的编码
 server表示数据库所使用的字符集 
  
  如果中文不能显示,乱码等,我们可以在mysql的安装目录下找到my.ini文件,进去
  修改配置,将default-character-set=latin1  的latin1修改成utf-8,或者gbk都可以 
   
  当然我们修改的是客户端的字符集

修改

update user set 字段名=需要修改的值 where user_name='筱筱';   
                               where表示条件的意思 ,后面的是条件,满足条件的就会修改
       记得要加条件,不加的话,会把表的所有该字段都进行修改
     如果有多个字段需要修改的话,需要使用逗号隔开
如update user set 字段名1=需要修改的值1,字段名2=需要修改的值2 where user_name='筱筱';   
 
我们这里也支持!=(不等于),具体使用看情况,如user_name!="筱筱",把不等于的都修改了

删除

   delete from 表名 where 条件 满足条件的就会被删除
   注意,要写条件,不写条件表示所有的记录都会被删除
   且删除这些记录后,如果我们的id使用了 auto_increment primary key的话,
   在插入数据的话,它会从接着把id值递增,
   如 总共有10条数据,id分别是1~10,把is为10的删了,在插数据,则会把id写出11,
   

truncate 表名     表示清空表
 会把表的所有记录清空,包括自增的字段id,在插入数据时,自增字段id会从1开始


DCL (数据控制)

权限安全问题 

使用show databases查看所有数据库,其中有一个叫mysql的数据库
进入该数据库use mysql,查看它的表 show tables 
我们发现有一个叫user的表,

其中的两个字段   user,host 
                    user表示的是连接的用户,host表示的可以连接的ip地址

我们可以修改该文件的host ,和平常的sql修改语句一样,去修改他,指定ip
修改完成后,要使用flush privileges来刷新一下,使之生效

我们可以ip来限定登陆

这时我们登陆数据库堵塞 -h 就派上用场了,

   我们一般连数据库的都是不写的,因为默认就是localhost,
   也可以写上-h127.0.0.1 ,其实就是localhost

修改密码

   也在mysql数据库的user表里
    我们可以使用select user,host,password from user来查看对应权限用户的密码
   当然显示的密码是经过加密的,
   我们也可以去修改这个密码,当然修改和普通的表的记录修改是没什么区别的
   如 
     update user set password=PASSWORD('要修改的密码') where user="root"; 
     
     这里的password() 是一个数据库的函数,意思就是将密码进行加密
     当然要修改root的密码,必须要以root的账户登陆才有权限修改, 
 
 
  另一种修改密码的方法,
  在mysql的安装,目录下的bin下面,我们看到有一个mysqladmin.exe,我们使用该程序
  不需要进入mysql里面,可以直接在外面(cmd)修改
        mysqladmin -uroot -p123456 password 999999
                 root用户名    123456原密码   999999是新密码  password后面有空格

忘记密码

 在mysql安装目录下的bin目录下
 有一个mysqld.exe程序
 我们可以使用该程序,在控制台(cmd)
 mysqld --skip-grant-tables   忽略权限表,它会给我们在开一个进程、并且会打印端口号
 这个时候,我们只要输入mysql不要输入用户,密码就可以进入数据库了
 然后我们可以进到mysql数据库的user表里面,去修改密码

 修改好后,退出,
 记得新开的进程要关了,然后在重新进入

创建普通用户

首先创建普通用户必须要在root权限下创建

在这里插入图片描述
创建用户

     如 
     CREATE USER 'test' @'127.0.0.1' IDENTIFIED BY '1234'
      为了方便区分,关键字使用了大写
        test是用户名   @后面的是指定ip登陆 ,也可以写出 '%'  ,表示任意的都可以登陆
         1234表示的是设置的密码
       
   注意,普通用户是无法进入mysql数据库的,且show databases查询出来的可见数据库很少

用户赋权限

 如,且给其他用户赋权限,也要在root用户下才可以
 为了方便区分,关键字大写
 
 GRANT UPDATE,INSERT,DELETE,SELECT ON abc.* TO 'test'@'127.0.0.1';
  将数据库abc的所有表的增删改查的权限给test用户    ,这里是指对表记录的操作,其他的权限
  没有赋予

撤销权限

 REVOKE INSERT,DELETE,UPDATE ON abc.* FROM 'test'@'127.0.0.1';
  将test对数据库abc的所有表的增删改查权限拿回来,就是撤销权限
  
 
 
GRANT ALL PRIVILEGES ON *.* TO 'test'@'127.0.0.1';
 
  ALL PRIVILEGES是所有权限的意思,*.*表示所有的库表,其实就相当于多了一个root
  注意,这是将所有库表的所有权限赋给了test用户

快速创建用户并且分配权限

GRANT UPDATE,INSERT,DELETE,SELECT ON abc.* TO 'test'@'127.0.0.1' IDENTIFIED BY 
'1234' 

查看用户权限

   show grants for 'test'@'127.0.0.1';  test是用户
   注意,普通用户只能查看自己的权限,root可以查看所有用户的权限

删除用户

  当然不用说,也是在root的权限操作的,
  drop user 'test'@'127.0.0.1';     
  
  我们可以在来查看一下用户,已经没有该用户了
  select host,user,password from mysql.user; 
    说一下 mysql.user,是一种简便写法,指的是mysql库下的user表,这样我们可以不用进入到该
    数据库去操作了,指定一下就可以了

DQL

在这里插入图片描述
过滤重复的列值

  SELECT DISTINCT 列名  FROM 表名
  列名可以加括号,也可以不加括号

连接

 SELECT CONCAT(列名1,列名2) FROM 表名;
  将查询出来的字段信息连接起来,显示的时候的字段名就是CONCAT(列名1,列名2),
  所以我们可以改变它显示时候的字段名
   如 
      SELECT CONCAT(列名1,列名2)  as 自定义字段名 FROM 表名;
      这样显示的时候就是显示临时的字段名,并不是修改的数据库的 
      
      我们普通查询也可以使用别名
      如  select user_id as id,user_name as name from user;

带分隔符的连接

   SELECT CONCAT_WS("这里写分隔符",列名1,列名2) FROM 表名;

模糊查询

SELECT * from user where 列名 like '%??%';
  %??%:表示:不管前面后面是什么,只要中间有某某值,就满足条件
  %??:表示:不管前面是什么,只要后面是某某值就满足条件
  ??%:表示:。。。。。。。。。。。。。

字符串,整型都可以查

在这里插入图片描述
排序

select * from 表名 order by 字段名 asc;
   按照指定的字段来排序,asc表示升序,可以不写,默认升序

select * from 表名 order by 字段名 desc; 
  desc表示的是倒序

查询表的记录条数

    select count(*) from user;   count(1)也可以

求某列的值

   select sum(列名) from user;    后面也可以加条件   

求列的平均值

  select avg(列名) from user;    后面也可以加条件  

求最值

    select max(列名) from user;    后面也可以加条件   
    select min(列名) from user;    后面也可以加条件  

分组

select * from user group by 列名;

     select count(*),free from user group by free;  
      此时根据free字段来进行分组并且计数
      将指定的字段相同的分在一起,不同的分开

在这里插入图片描述

分组查询使用条件

select free from user group by free having count(*)>1;   
  表示将分完组后且记录条数大于1的值
  且注意分完组后还有条件是要该关键字having,但条件是对于分完组后的记录

内连接

  假设有两张表,一张是student ,一张是mark(成绩)表
  student 的字段有
        id   主键,自增
        name
     
   mark 的字段有
        id 主键,自增
        mark
        student_id   对应的是student表的id,其创建的时候属性要一样,如类型等

 如查询它们的成绩
 
   第一种
       select  id,name,mark from student,mark where student.id=mark.student_id;
         由于属性有可能相同,所以我们加上表名就可以了,不然会报错的,或者给表设个别名
       

   第二种
    select  id,name,mark from student inner join mark where student.id=mark.student_id;
       在上面的sql语句的基础上将两个表之间的逗号改成了inner join(关键字)
     
     这种的内连接的where可以写成on

左连接

 select  id,name,mark from student left join mark on student.id=mark.student_id;
     两个表之间要使用left join来连接, 不能使用where关键字,要使用on关键字
      
      左连接就是以左边的表为标准来查询,也就是说student的所有学生都会查询出来,但成绩表
      不一定有对应的值,所以有可能某个学生的成绩是为null的

右连接

  select  id,name,mark from student right join mark where student.id=mark.student_id;
    则是以右边表为标准来显示数据,

注意

   在进行复杂的自查询时,可以将自身表变成两张表,使用取别名的方式
   
    虽然有的时候左右连接和内连接查询的结果是一样的,但是也只是看起来一样
    而已,举个列子
      如果student 表里的id为3的学生数据删除了,而mark(成绩表里的有改学生的成绩)
        那么使用左右查询时以成绩表为标准查询时,那么,该学生的一些属性查出来会是null
        
      而使用了内连接的话,将不会发生这种情况,它只会查询两个表都有的相同id值的数据
      因此,可以看出,这是可以避免的

联合查询

 union all  关键词
  如 select name from user union all select mark from mark;
     这是两个sql语句拼接在一起了,一个是user表,一个是mark表
 注意,要查询显示的字段名数量一定要相同,否则会报错,
   也就是说,前面查的name 是一个字段,后面的sql语句也要写一个字段,
 
 如果查的不是同一张表,以前面的sql语句所查的字段名为临时查询的字段名

子查询

就是在查询里面套查询
  
  如
  select id from user where id in (select id from mark);

limit 限制查询条数

在这里插入图片描述

     select * from account limit 2;

表示只显示查询出来的两条数据,

之前我们使用了count(*)来获取总记录条数
其实我们可以使用id来判断记录数,虽然不太准确,但不会相差太多
我们可以
   select id from account order by id desc limit 1;
    它的意思是将表进行倒序然后取倒序的第一条记录,则大概就是记录数
    这样子查询的好处是效率高

如果limit携带两个值呢

 如
  select * from account limit 2,3
  显示的是 id为3,4的数据

在这里插入图片描述
我们可以看出,前面的2是一个位置,后面的3是一个显示的记录数
从第二条记录开始,显示下面的3条记录

 一般用于分页查询 
 分页 : 开始索引=(当前的页码-1) * 每页显示的条数

------------------------------------------------------------------------------------------------

数据库引擎
存储引擎,是基于表的

在这里插入图片描述

  我们可以在数据库的安装目录里看它默认使用的是什么引擎
  在mysql安装目录下的my.ini文件里面

在这里插入图片描述

这个显示的是innodb表示默认使用的是该引擎,
其实我们也可以通过查询表的创建sql语句也可以看到使用的是什么引擎
如  show create table 表名

在这里插入图片描述

我们可以在创建表的时候指定引擎

在这里插入图片描述

指定使用的引擎

 上面的是查看单张表的引擎,
 show table status ,查询该库的所有表引擎     有可能数据过多,不好排版不好观看
 所以我们可以加一个  \G
 show table status\G   比较好查看

查看数据库所支持的引擎

  show enginces\G   

修改表引擎

alter table 表名 engine=引擎名称     
这样子修改


MyISAM    表级锁  ,插入数据一个个到的插入  ,崩溃不好恢复
InnoDB   行级锁 ,性能好,快

字符集

库字符集和表字符集可以不同
通过  
   show create database 库名;  查看库字符集

在这里插入图片描述
可以看到使用的字符集

修改库的字符集
  create database 库名 character set  字符集名称

查看表的字符集,可以通过查看创建表的语句
也可以取修改表的字符集

alter table 表名 charset=utf8   

我们在创建库的时候和创建表的时候不指定的话,都是使用默认的配置
在mysql安装目录下的

      my.ini文件里
      [mysqld]  下面
        character-set-server=字符集     默认的库和表的字符集

查看字符集对应的字符集校对(默认的字符校对)
show character set;

utf8的字符校对是utf8_general_ci

创建表时可以指定字符集


gbk  2个字节  中文     英文1个字节(包括英文下的符号)
utf8   3个字节  中文  英文1个字节 (包括英文下的符号)

int(5)  
 意思是当存的值没有超过int的有效存储范围,如int的字节是4,也就是说是32位,
 存储的数的大小为2的32次方,  分为有符号和无符号,
 当要存储的数大于了可存储的最大数,则取最大的数,
 其中还可以设置存取的位数,这里的例子是5,当值的位数小于要取得位数,可以用其他数代替,也可不用,大于5位数,原数存取,只要不要大于2的32次方就可以


char(n)     定长
  字符后面括号的n表示的是字符的长度,不是字节数
  存入是跟长度有关,
  如 char(4)  存入 123, 1234 ,是可以的,存入12345,会将5截掉 
     存入  哈哈哈,哈哈哈哈,是可以的,存入哈哈哈哈哈会截掉一个
 
 我们可以通过mysql内置的一个查看字节的函数
  select length(字段名)  from  表名     查看字节数
   
   select char_length(字段名) from  表名   查看字符长度 

拓展

 ifnull函数
 
       select
         ifnull(
        (select distinct Salary as SecondHighestSalary
          from Employee 
         order by Salary desc
         limit 1 offset 1),null) as SecondHighestSalary;   
           
      ifnull函数的参数有两个,如果不是null,返回第一个参数,如果为null返回第二个参数

约束

       1.主键约束  primary key    非空且唯一
           删除主键 ALTER TABLE 表名 DROP PRIMARY KEY
       2.非空约束  not null
       3.唯一约束  unique  但注意,当是字符时,值可为null,有多个也可以 
           且在表创建之后,删除唯一约束的方式,ALTER TABLE 表名 DROP INDEX 字段名
       4.外键约束  foreign key     
             创建外键 ,在创建表时
              constraint 外键名称 foreign key 列名 references 主表名(主表字段) 
              注意并不是一定要主表的主键做外键,只要是唯一的约束都可以
              列名是当前要设置为外键的列名,主表名是要关联的表名
            删除外键 
               ALTER TABLE 表名 DROP FOREING KEY 外键名 
             添加外键 
               ALTER TABLE 表名 ADD.......
                省略号后面的是和创建表时添加外键时一样的所以就不重复写了

级联操作

     当改变表中主键的数据时,被其他表引用为外键相关联,如果想修改主键的数
     据,则是不行的,因为还有一个表的数据相关联
      此时,我们可以在添加外键时设置级联更新
       在上面的添加外键的基础上,末尾在加上 ON UPDATE CASCADE 
       
  级联删除
         末尾加上ON DELETE CASCADE 

数据库设计

   多表关系  
         一对一 :可在任意一方添加唯一外键指向另一方主键,也就是(unique)
         一对多  :如部门和员工   ,反过来就是多对一  
                        在多的一方建立外键对应一的一方的主键
         多对多:学生和课程     
                  需要借助中间表,中间表至少包含两个字段做为第三张表的外键,
                  分别指向两张表的主键  
                   
                   中间表的俩个及以上字段组成的数据记录,都是唯一的,因此也可以
                   称为联合主键

数据库范式

       先过一下知识体系,以后完善
       第一范式 :每一列都是不可分隔的原则数据项
       第二范式:在第一范式的基础上,非码属性必须完全依赖于候选码(在第一范
                式基础上消除非主属性对主码的部分函数依赖) 
       第三范式:在第二范式的基础上,任何非主属性不依赖其他非主属性(在第二
               范式基础上消除传递依赖)

数据库的备份与还原

     命令行  语法:
           备份: mysqldump -u用户名 -p密码 >备份数据库保存的路径
            还原  :
               1.登录数据库,
               2.创建数据库,
               3.使用数据库,
               4. source sql文件   ,所谓还原其实就是导入sql文件

事务

 事务的介绍 
     概念
           如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成
           功,要么同时失败 
     操作
           1.开启事务:start transaction
           2.回滚 : rollback
           3.提交 :commit 
     事务的提交 
            方式   
              自动提交
                           mysql就是自动提交的
                           一条增删改语句会自动提交一次事务
              手动提交 
                          需要先开启事务,在提交 
                          如果手动提交,开启了事务,没有提交,则会事务回滚
 事务的四大特征
              
              1.原子性:是不可分隔的最小操作单位,要么同时成功,要么同时失败
              2.持节性:当事务提交或回滚后,数据库会持久化的保持数据
              3.隔离性:多个事务之间,相互独立
              4.一致性:事务操作前后,数据总量不变 
               
 事务的隔离级别  
            
            概念:多个事务之间是隔离的,相互独立的·但是如果多个事务操作同一批
                    数据,会引发一些问题,设置不同的隔离级别就可以解决这些问题
              
            存在问题:  
                    1.脏读:
                       一个事务,读取到了另一个事务中没有提交的数据,虽然数据更新
                       了,但是没有提交,也就是说没有持久化存储,数据可能不正确
                    2.幻读: 
                       例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中
                       的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表
                       中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还
                       存在没有修改的数据行
                    3.不可重复读:
                       在同一个事务中,两次读取到的数据不一样 ,
                       如:事务A查询数据时且该事务还有其他的操作正在进行,没有结
                       束,同时事务B对该数据进行了修改,然后事务A再次读取数据时,
                       与第一次读取的数据不一样
             
             隔离级别: 
                      1. read uncommitted: 读未提交 
                           产生的问题:脏读,幻读,不可重复读
                      2. read committed: 读已提交            (Oracle默认的)
                           产生的问题:不可重复读,幻读
                      3. repeatable read : 可重复读               (Mysql默认的)
                           产生的问题: 幻读 
                      4. serializable: 串行化 
                            可解决所有的问题 ,
                            使用该级别时,事务会将表锁住,只允许此次事务结束,才会开
                            锁,也就是一串的意思,其他的事务不会影响到该事务的操作,
                            但就是效率低
               注意:隔离级别从小到大安全性越来越高 (1->2->3->4) ,但是效率越来越低   
                       
                 数据库查询隔离级别 
                          select @@tx_isolation; 
                 数据库设置隔离界别
                          set global transaction isolation level 级别字符串
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值