欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL 入门

程序员文章站 2023-11-22 14:34:28
1.mysql是什么? mysql本质就是一个c/s架构的套接字软件 2.数据库基本概念 数据库服务器:运行有数据库管理软件的计算机 数据库管理软件:mysql 库:文件夹 表:文件 记录:文件中的一行的内容 3.针对库、表、记录的操作 3.1 库\文件夹: 增: CREATE DATABASE 库 ......

1.mysql是什么?
  mysql本质就是一个c/s架构的套接字软件

2.数据库基本概念
  数据库服务器:运行有数据库管理软件的计算机
  数据库管理软件:mysql
  库:文件夹
  表:文件
  记录:文件中的一行的内容

3.针对库、表、记录的操作
  3.1 库\文件夹:
    增:
      create database 库名 charset 编码;
    改:
      aliter database 库名 charset 编码;
    查:
      show databases;
      show create database 库名;
    删:
      drop database 库名;

  3.2 表\文件:
    操作表前要先切换到库下:use 库名;
    建表的完整语法:
      create table 表名(
      字段名1 类型[(宽度) 约束条件],
      字段名2 类型[(宽度) 约束条件],
      字段名3 类型[(宽度) 约束条件]
      );

    增:
      create table 表名(字段名 类型,...);
    改:
      改字段类型\约束条件:
        alter table 表名 modify 字段名 类型(长度\宽度);
      改字段名\类型\约束条件:
        alter table 表名 change 旧字段名 新字段名 类型(长度\宽度);
    查:
      查看所有表:
        show tables;
      查看指定表:
        show create table t1;
      查看表结构:
        desc 表名;
    删:
      drop table 表名;
    清空表:
      truncate 表名;
      #清空表应该使用truancate,不仅删除所有记录,而且将自增字段的值归0


  3.3 记录\文件中一行行内容:
    增:
      方式一(指定字段名插入):
        insert into 表名 (字段名,字段名,...) values (值1,值2,...),...;
      方式二(默认位置插入):
        insert into 表名 values (值1,值2,...),...;
    改:
      update 表名 set 字段名=内容 where 条件;
    查:
      select 字段名 from 表名;
    删:
      delete from 表名 where 条件;
      #delete 只能用于删除符合条件的某几条记录,不能用于清空表

4.存储引擎
  存储引擎就是表的类型
  不同的类型会对应不同的处理机制
  测试:
  create table t3(id int)engine='innodb';
  create table t4(id int)engine='myisam';
  create table t5(id int)engine='blackhole';
  create table t6(id int)engine='memory';

  insert into t3 values(1);
  insert into t4 values(1);
  insert into t5 values(1);
  insert into t6 values(1);

5.数据类型
  primary         #主键(不能为空的意思)
  auto_increment  #自动增长
  default         #默认值

  5.1 数字类型:整型(默认有符号),浮点型
  类型设置成无符号:unsigned
  #整型类型:数据类型宽度限制的是显示宽度而非存储宽度
  整型:
    tinyint      #占1字节
    smallint     #占2字节
    mediumint  #占3字节
    int      #占4字节
    bigint          #占8字节
  浮点型:
    float                #占4字节
    double            #占8字节
    decimal           #手动指定字节

  5.2 字符类型:
    char_length(字段名)   #用于查看某字段包含的字符个数

    char      #定长
    varchar    #变长

    例:
      char(5)
        相同点:最大能存放5个字符
        不同点:假设传入3个字符,会补全2个字符
    #注意:
        针对char类型,在存放时会将字符补全为5个,在查询时又会将末尾补全的空格去掉
        不让mysql去掉末尾空格的方法:
          通过修改sql_mode,添加 sql_pad_char_to_full_length
    varchar(5)
      相同点:最大能存放5个字符
      不同点:假设传入3个字符,就存3个字符

    like:
      where 字段名 like
      like是模糊匹配
      %:任意个数的任意字符
      _:1个任意字符

    大文本类型:
      text系列(文本是带有编码)
      tinytext
      text
      mediumtext
      longtext
      blob系列(也是字符数据,但是不带编码)
      tinyblob
      blob
      mediumblob
      longblob
    二进制类型:
      binary系列(存储二进制数据)
      binary
      varbinary

  5.3 日期类型:time,date,datetime,timestamp,year,
    now() #此函数用于获取当前时间

  5.4 枚举类型:
    enum #多选一
  5.5 集合类型:
    set #多选多


6.表操作之约束条件
  约束条件:约束条件是在类型之外为字段附加的限制
  强调:如果表的类型为innodb储存引擎,在创建表时,必须定义一个主键
  如果不指定,innodb存储引擎会自上而下寻找一个不为空且唯一的字段当做主键
  如果不指定并且也没有not null+unique的字段,那么innodb存储引擎会生成一个隐藏的字段当做主键
  primary key    #标识该字段为该表的主键,可以唯一的标识记录
    单从约束角度去看,主键的约束效果是not null+unique

  foreign key #标识该字段为该表的外键
  限制关联表某一个字段的值必须是来自于被关联表的一个字段
  注意:
    1.被关联的字段必须是一个key,通常是id字段
    2.创建表时:必须先建立被关联的表,才能建立关联表
    3.插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录
  #关联表
  create table emp(
  id int primary key auto_increment,
  name varchar(15),
  age int,
  dep_id int,
  foreign key(dep_id) references dep(id)
  on update cascade
  on delete cascade
  );

  insert into emp(name,age,dep_id) values
  ('hades',18,1),
  ('iggy',28,2),
  ('egon',38,2),
  ('alex',30,1),
  ('xingchen',18,3);

  #被关联表
  create table dep(
  id int primary key auto_increment,
  dname varchar(20),
  info varchar(50)
  );

  insert into dep(dname,info) values
  ('it','技术部门'),
  ('sale','销售部'),
  ('hr','人事部');

  #ps:删除时,应该先删除关联表emp中的记录,再删除被关联表对应的记录

  not null              #标识该字段不能为空

  unique key               #标识该字段的值是唯一的

  auto_increment #标识该字段的值自动增长(整数类型,而且为主键)

  default                     #为该字段设置默认值

  unsigned                  #无符号
  zerofill                    #使用0填充

  #找两张表关系的窍门
    emp   dep
  #1.先站在左边的角度去找左表emp的多条记录能否对应右表dep的一条记录
    翻译:多个员工能否属于一个部门
  #2.然后站在右表的角度:去找右表dep的多条记录能否对应左表emp的一条记录
    翻译:多个部门能否拥有同一名员工
  #多对一结果的判断
    1.如果只有单向多对一成立,最终关系就是多对一
    2.在emp表新增一个字段dep_id,该字段外键关联dep(id)
  #多对多结果的判断
    1.双向的多对一就是多对多
    2.需要建立第三张表,有一个字段的值fk左表,一个字段的值fk右表
    create table author(
    id int primary key auto_increment,
    name varchar(16),
    age int
    );

    create table book(
    id int primary key auto_increment,
    bname varchar(20),
    price int
    );

    create table author2book(
    id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade
    );
  #一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录

7.表操作
  1.修改表名
    alter table 表名 rename 新表名;
  2.增加字段
    alter table 表名 add 字段名 数据类型[完整性约束条件...],add 字段名 数据类型[完整性约束条件...];
    alter table 表名 add 字段名 数据类型[完整性约束条件...] first;
    alter table 表名 add 字段名 数据类型[完整性约束条件...] after 字段名;
  3.删除字段
    alter table 表名 drop 字段名;
  4.修改字段
    alter table 表名 modify 字段名 数据类型 [完整性约束条件...];
    alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
    alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件...];

  5.复制表
   #在查询语句前加上create table 表名
    create table user select host,user,password,select_priv from mysql.user;
   #复制表结构
    create table user1 select host,user,password,select_priv from mysql.user where 3<1;

8.记录的增、删、改
  1.插入完整数据(顺序插入)
    语法一:
      insert into 表名(字段1,字段2,字段3...字段n) values(值1,值2,值3...值n);
    语法二:
      insert into 表名 values (值1,值2,值3...值n);
    2.指定字段插入数据
      语法:
      insert into 表名(字段1,字段2,字段3...) values (值1,值2,值3...);
    3.插入多条记录
      语法:
      insert into 表名 values
      (值1,值2,值3...值n),
      (值1,值2,值3...值n),
      (值1,值2,值3...值n);
    4.插入查询结果
      语法:
      insert into 表名(字段1,字段2,字段3...字段n)
      select (字段1,字段2,字段3...字段n) from 表2
      where ...;

9.更新数据update
  语法:
    update 表名 set
    字段1=值1,
    字段2=值2,
    where condition;
  示例:
    update mysql.user set password=password('123')
    where user='root' and host='localhost';

10.删除数据delete
  语法:
    delete from 表名
    where condition;
  示例:
    delete from mysql.user
    where password='';