mysql的使用笔记

mysql的使用

mysql基础

  • 概述

储存数据以及数据结构的厂库(DataBank),数据库是独立,数据库是用来管理,查询,储存数据的,mysql数据的引擎默认是INNODB

  • 数据库种类

    • 关系型
    • 非关系型
    • 层次型
    • 网状型
  • 编码设置

    • gbk中日韩语言
    • gb1312中文
    • utf8大型编码
  • 常用的一些数据库

    • sqlserver ,access是微软的数据库
    • oracle,mysql都是oracle公司的
    • dbz 是IMB公司的
    • sybase 是sybase公司的

      DDL数据定义语句;设计语句

  • 基本命令

    • mysql -h localhost -u root -p 登录
    • exit 退出
    • select now(); 查看当前时间日期
    • select curdate(); 当前日期
    • select curtime(); 当前时间
    • select version(); 打印版本信息
    • select user(); 查看当前用户
    • mysql --version命令窗口查询mysql版本(管理员运行命令窗口)
  • 操作库

show databases;查看数据库 create database 库名 字符集;创建数据库 drop database 库名;删除数据库

  • 修改数据库密码

    • 用SET PASSWORD命令
      set password for 用户名@localhost = password('新密码');
    • 用mysqladmin
      mysqladmin -u用户名 -p旧密码 password 新密码
    • 用UPDATE直接编辑user表
      mysql> use mysql;
      mysql> update user set password=password('123') where
      user='root' and host='localhost';
      mysql> flush privileges;
  • 在忘记root密码

    • 关闭正在运行的MySQL服务。
    • 打开DOS窗口,转到mysql\bin目录。
    • 输入mysqld --skip-grant-tables回车。 --skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
    • 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
    • 输入mysql回车,如果成功,将出现MySQL提示符 >。
    • 连接权限数据库use mysql;
    • 改密码update user set password=password("123") where user="root";
    • 刷新权限(必须步骤):flush privileges;
    • 退出 quit
    • 注销系统,再进入,使用用户名root和刚才设置的新密码123登录

DML;数据操作语句;增删改

  • 表的增删改查

    • 进入库
      use 库名称
    • 创建表
      create table student(表结构 类型,表结构 类型)
    • 删除表
      drop table 表名称
    • 修改表名称
      alter table 表名称 rename 新表名称
    • 查看表
      show tables
    • 查看新增表的正规写法
      show create table 表名称
  • 字段增删改

    • 添加字段
      alter table 字段名称 add 定义列
    • 修改字段
      alter table 表名称 change 旧字段名称 新字段名 类型
    • 删除字段
      alter table 表名称 字段名
    • 查看字段结构
      desc 表名称
  • 添加数据

    • 增加对应数据;

      insert into 表名称(字段1,字段2........)values('j138',"红瓦寺".......)
      //选择插入某些列
    • 增加某行数据

      insert into classes values(null,'j139',"红瓦寺")
      //插入所有列,自增粘以null占位
    • 增加全部数据

      INSERT INTO t_student VALUES
      (1,'张三',20,'男'),
      (2,'李四',25,'男'),
      (3,'王五',19,'女')
    • 拷贝数据

      从classes表中查询所有的class_name 插入到className表中的(class_name)字段insert into 新表名(新字段名) 
      
      select 旧字段名 from 旧表名 insert into className(class_name) select class_name from classes
  • 修改数据

    • 修改某行的数据
      update 表名称 set 列1=新值1,字段名=值 where id;
      UPDATE 表名 SET 列1=新值1,列2=新值2 WHERE 过滤条件
    • 修改某列的某个数据
      UPDATE classes set class_name=null where class_id=3
      '' 和null 一样吗?? 严格意义不一样
  • 删除数据

    • 删除一行数据
      delete from 表名称 where id;
    • 删除年龄在18-20
      DELETE FROM t_student WHERE 年龄 BETWEEN 18 AND 20
      delete from student where age>=18 and age<=20
  • 注意

    • t_表示表名;字段 英文 field
    • f_表示字段名;表格 英文 table
    • pk_表示主键;主键约束 primary key
    • fk_表示外键;外键格式 foreign key;
    • 外键名规则;FK_本表名_与之关联的表的名字
    • 有主从表的时候数据插入先插主表,在插从表;有外键的是主表
  • sql语句中也可以用true和false,true表示1一般代表男,false表示0一般代表女,是int型

DCL;数据控制语句;控制

  • 数据库的数据完整性
    • 保证每行所代表的实体能互相区别,不能存两条一模一样的
    • 主键约束(primary key)非空不能重复;一个表只能有一个主键一个主键可以有多个列
    • 唯一约束(unique)指定的列非空的不能重复
    • 非空约束(not null)指定的列不能为空
    • 指定数据(default)指定的数据可以更改
    • 指定有效数据(check(第一个数据 or 第二个数据格式(健名=值)))不是第一个数据必须是第二个数据,不能有第三个数据出现(在mysql中无效,支持创建但没有功能)
    • auto_increment;主键自增长
  • 外键
    • 创建一个表,在表中外键字段与上一个关系表绑定
      class_id int,
      CONSTRAINT 外键名 FOREIGN key(要把外键给那个字段的字段名)
      REFERENCES 关系表的表民(主键)
      CONSTRAINT FK_student_classId FOREIGN key(class_id)
      REFERENCES classes(class_id)
    • 怎么给已存在的表添加外键约束 添加要连的键
      alter table 表名 add 字段 类型
      alter table test add class_id int
    • 添加CONSTRAINT
      alter table 表名 add CONSTRAINT 外键名
      FOREIGN key(要把外键给那个字段的字段名)REFERENCES 关系表的表民(主键)
      alter table test add CONSTRAINT FK_TEST_CLASSID
      FOREIGN key(class_id) REFERENCES classes(class_id)
    • 删除外键
      alter table 表名 drop FOREIGN key 外键名
      alter table test drop FOREIGN key FK_TEST_CLASSID
    • 外键命名规则
      1,一对一唯一外键关联,一对一必须保证外键唯一性,加唯一性约束
      增;主键在谁身上就先增加谁;
      删;外键在谁身上就先删谁;
      2,一对多外键必须设计在多方身上
      增;先增主表后增从表
      删;先删从表在删主表
      3,多对多,需要新建中间表来保存对应关系表,外键咋中间关系表身上
      增;先增两表,在增中间表
      删;先删中间表,再删两表 
    • 注意
      1,一个外键对应一个主键,外键和外键约束是分开的,
      2,外键必须链接主键(many2one)
      3,联合主键写法;一个表只能有一个主键,但一个组键可以有多个列primark(第一个主键,第二个主键);
      4,主键的特性
       主键非空唯一,
       主键不能被修改,
       主键不能为不存在,
       不能被业务操作

DQL;数据查询语句;查

  • 比较符号
    >,< ,>=, <= ,!=,(<>也表示不等于)
  • 逻辑比较
    and  并且
    or    或者
    between 下线 and 上线
    like    模式 格式;
    like “_”下划线代表单个字符
    like“1%2%3” 代表任意字符123处都可以添加关键字
    in()    只取()中的字符;(1,2,3)只能取123
    not in()    不取()中的;not;非的意思
    in();里边可以放列值,进行选择
  • 排序(order by)
    asc;代表升序,
    desc;代表降序
    order by 排序的列 asc // 永远写在整个查询的最后
    limit 1,3,limit 起始位置,截取长度。
  • 分组

在where后边加group by 按什么类型分组与count联合使用selsct count(*) from 表名 group by分组的类型,按什么分组;分组后也能过滤用having分组后再来筛选,where写在分组前,having写在分组后分组后只能与与分组相关的结果级打印;

  • mysql聚合函数
1,sum();求和;
select sum(all 求哪一列的和) from 表名称
sum(1);在运行中叠加一次求出行数
2,avg(); 平均值;
select avg(all 求哪一列的平均值) from 表名称
3,max();最大值;
select max(all 求哪一列的最大值) from 表名称
4,min();最小值;
select min(all 求哪一列的最小值) from 表名称
5,concat();字符串拼接,一般很少在mysql上使用
concat(要拼接的数据);
6,注意
all;表示非空,也是mysql默认值
 *;表示全部
distinct;表示所有非空不重复的值
  • 单表查询
select 列 from 表 where ID=数据 order by pk_playerid desc;
order by 列 desc;排序 desc降序,asc升序
  • 子查询
1,在select后边添加子查询
 select ( select 列名 from表1) from 表1 ;
只能查一列,多行;不常用,效率低
2,在from后边添加子查询
select 某列 from ( select 列名 from表1) ;
把查出来的结果当成一张表,再查这张表的数据;不常用,效率低
3,在where后边添加子查询
select 列 from 表 where 列=(select 列 from 表1 where 列=数据) ;
只能查单行单列,用in时可以查单列多行,有 in 就有 not in
select 列 from 表 where 列=all (select 列 from 表1 where 列=数据);
需要和子查询的结果和某列的结果逐一比较后相等则打印
select 列 from 表 where 列=any (select 列 from 表1where 列=数据);
只要满足一个就可以打印,不能等于它本身
select 列 from 表 where exsits (select 列 from 表1where 列=数据);
如果数据存在则打印,不能等于它本身; not exsits;相反,如果数据不存在则打印
4,子查询,要消耗更长的执行时间,当数据量增加时,执行时间会急剧加长,
5,注意
all;运算符;子查询返回的值必须都满足才返回真;
exists;运算符;只要子查询返回了行,就为真
any;运算符;子查询返回的值中只要有一行满足比较运算就为真
  • 链接查询查
第一种写法(带inner)
1,查两张表的数据;
select * from 表1 inner join  表2 on 外键ID=主键ID where 列="数据"
2,三张表查询例子(inner  join 表 on 外键拼接)
select * from t_team
inner join t_player  on pk_teamid=fk_teamid
inner join t_group on pk_teamid=fk_groupid
where f_teamName="法国队"
第二种写法(省略inner)
1,查两张表的数据;
select * from 表1 join  表2 on 外键ID=主键ID where 列="数据"
2,三张表查询例子(inner  join 表 on 外键拼接)
select * from t_team 
join t_player  on pk_teamid=fk_teamid
join t_group on pk_teamid=fk_groupid
where f_teamName="法国队"
第三种写法(省略join on表与表之间用逗号隔开,ID=ID写在 where后边)
1,两张表的数据;通过多张表共有的字段查找多张表共有的并集,
共有字段必须要两个表中都有才能找到
select * from 表名1,表名2 where 外键ID=主键ID and 某一行条的件;
2,三张表查询例子
select  a.uid,a.uname,a.upsw
 from table1 a,table2 b, table3 c
where a.sems_role_rid=b.rid and a.udeptid=c.deptid
  • 外链接查询
左外键(left)
1,查两张表的数据;
select * from 表1 left join  表2 on 外键ID=主键ID where 列="数据"
2,三张表查询例子(left join 表 on 外键拼接)
select * from t_team
left join t_player  on pk_teamid=fk_teamid
left join t_group on pk_teamid=fk_groupid
where f_teamName="法国队"
右外键(right)
1,查两张表的数据;
select * from 表1 right join  表2 on 外键ID=主键ID where 列="数据"
2,三张表查询例子(right join 表 on 外键拼接)
select * from t_team
right join t_player  on pk_teamid=fk_teamid
right join t_group on pk_teamid=fk_groupid
where f_teamName="法国队"
左右链接的区别就是数据以左边或右边的表为准,没有数据也要现实,只是值为空
数据多出了就不会显示附属表(左表或右表)的数据;(左边是电脑的左边)
  • 注意
1,is;是“是”的意思(is null)=是空
2,as;取别名;mysq中as可以被省略
3,not;非空
4,select;投影,投影后做的操作都不会改变物理数据;
5,select * from 表名*代表列的字段名名多个用“,”隔开,直接用*表示查询全部一般很少用*因为效率低
6,distinct;去掉重复位置,去重后不能和其他数据一起显示
7,列与列之间用逗号隔开

数据库类型;

  • 整数

    • tinyint1个字节,存放128-127范围的整数,有符号,比如: 年纪
    • smalint2个字节,存放-32000到+32000范围的整数,比如: 年纪,数量
    • int4个字节,存放-2000000000到+2000000000 范围的整数,例如: 距离
    • bigint8个字节,储存不能用smalint或int描述的超大整数,例如:科学/数学数据
  • 浮点

    • afloat4字节,单精度浮点型数据,存储小数数据,例如:测量,温度
    • double8字节,双精度浮点型数据,需要双精度存储的小数数据,例如:科学数据
    • decimal(m,b)用户自定义精度的浮点型数据(m长度,b精度)以特别高的精度存储小数数据
  • 字符

    • char(位数);固定长度的字符串 特定字符串长度(高达255字 符)存储通常包含预定义字符串的变量例如:定期航线,国家或邮编
    • varchar(位数),具有最大限制的可变长度的字符串变量;实际字符串长度(高达255字符)例如:名字,密码,短文标签
    • text 没有最大长度限制的可变长度Variable;(存放65535个字符)存储大型文本数据
    • MEDIUMBLOB(存放2的24次方个字符);
    • enumcvall(a,b,c.......)列枚举-限定有限值
  • 时间

    • year1字节,格式YYYY,范围1901-2155
    • date3字节,格式YYYY-MM-DD,范围1000-01-9999-12-31
    • timestamp4字节,格式YYYY-MM-DD 小时:分钟: 秒
  • 二进制大数据,二进制大对象

    • TINYBLOB255字节,0-255字节
    • BLOB 5k,0-65k
    • medfumblob16m,0-16m
    • longblob4g,0-4g

关系数据库的几种设计范式介绍

  • 第一范式(1NF)

    • 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

    • 如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。

  • 第二范式(2NF)

    • 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。

    • 第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分,为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。

  • 第三范式(3NF)

    满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

很赞哦! (1)

文章评论

  • 测试账号

    1111111[掌宝卖萌]

    查看回复