zoukankan      html  css  js  c++  java
  • MySQL-基础知识整理

    建议:关键字和函数名全部大写;数据库名称、表名称、字段名称全部小写;分号结尾。但是大小写语句不区分,本人讨厌大写(英语菜,不能一眼看出内容),所以全部小写。[]看情况可有可无,{}花括号的内容必须要有,|左右内容表示选其中一个


    一、小知识点

    1.MySQL端口号:3306

    2.超级用户:root

    3.退出命令:mysql>exit; mysql>quit; mysql>q;

    4.提示符,黑窗口输入命令前的提示,mysql>就是一个提示符

    D完整日期 d当前数据库 h服务器名称 u当前用户

    修改提示符的命令语句:

    prompt+空格+修改成的内容

    例如:mysql>prompt u@h;

    提示:PROMPT set to 'u@h'

    新的提示符:root@localhost (表示用户名为root,服务器名为localhost)

     

    5.显示当前版本号:select version();显示当前时间:select now();显示用户:select user();

    6.命令行不能显示中文

    SET NAMES GBK


    二、对数据库进行操作

    1.查看当前服务器下的数据库:

    show { databases | schemas };

    其中几个数据库是自带的,information_schema、mysql、performance_schema、test这4个数据库是自带的

     2.创建数据库

    CREATE { DATABASE | SCHEMA } [ IF NOT EXISTS ] db_name [ DEFAULT ] CHARACTER SET [ = ] charset_name

    例如创建数据库test02语句:create databases test02;如果已存在名为test02的数据库,则错误,如果加上中括号的[ IF NOT EXISTS ]则只是警告。

    show warnings;--查看警告信息

    3.[ DEFAULT ]后面的character是指定字符编码方式,比如utf8之类的东西,创建数据库时没写则是默认数据库的编码方式,创建时可以指定其他类型的编码方式,也可以修改,也可以查看数据库的编码方式。举例:

    show create database test02;--查看编码方式
    create database if not exists test03 character set = gbk;--创建时即指定其他编码方式
    alter database test03 character set = utf8; --创建后修改编码方式,等号可以不写,修改则把create换成alter

    MySQL 5.0 以上的版本:一个汉字占多少字节与编码方式有关,utf8占3个字节,gbk占2个字节。

    select length(col_name) from table_name;--查看表中的列的值占了多少字节

    4.删除数据库 

    DROP { DATABASE | SCHEMA } [ IF EXISTS ] db_name;
    drop schema if exists test03; 
    drop database test02;

    5.进入数据库以及查看当前数据库

    use db_name;--进入
    select database();--查看当前进入哪个数据库

    三、数据类型

    1.整型

     m一般省略,如果表示无符号,在数据类型后面加上unsigned,取值从0开始,最大值翻倍。

    2.浮点型

    float[ (m,d) ] 4 个字节,double[ (m,d) ] 8 个字节;

    m是数字总位数,d是小数点后面的位数,如果被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。

    3.字符型

    char和varchar:

    • char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。 
    • char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。 
    • char类型的字符串检索速度要比varchar类型的快。

    varchar和text: 

    • varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节
    • text类型不能有默认值
    • varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用

     4.日期时间型

    5.数据类型的属性和约束(加在数据类型后面)

    • unsigned:无符号,值从0开始,无负数
    • zerofill:零填充,当数据的显示长度不够的时候可以使用前补0的效果填充至指定长度,字段会自动添加unsigned
    • not null:非空约束,表示该字段的值不能为空
    • default:表示如果插入数据时没有给该字段赋值,那么就使用默认值
    • primary key:主键约束,表示唯一标识,不能为空,且一个表只能有一个主键。一般都是用来约束id
    • auto_increment:自增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1;如果非默认值,每次按最大值的标准+1
    • unique key:唯一性约束,表示该字段下的值不能重复,null除外。比如身份证号是一人一号的,一般都会用这个进行约束。保证记录的唯一性,每张表可以有多个唯一约束
    • foreign key:外键约束,保证数据的完成性和唯一性,以及实现一对一或一对多关系,体现关系型数据库。

    列级约束,对一个数据列建立约束;表级约束,对多个数据列建立约束。


    四、对表的操作

    1.建表 create

    CREATE TABLE [ IF NOT EXISTS ] table_name (
    column_name1 data_type,
    column_name2 data_type,
    …
    )

    举例:建一个学生表,包含属性:id,name,age,sex;

    Create table if not exists student(
    id int unsigned not null auto_increment primary key,
    name varchar(20) not null unique key,
    age tinyint unsigned not null default 20,
    sex enum(‘1’,’2’) default 1 --sex的值只能在1和2里面选,不指定则默认选1
    )

    2.查看表中各列的情况,即表的结构 show

    SHOW COLUMNS FROM table_name;

    3.从数据库的视野查看表 show

    SHOW TABLES [ FROM db_name ];
    --前半句查看当前数据库下的表,加上后半句可以查看其他数据库下的表
    --查看其他数据库下的表不会更改当前进入的数据库位置。

    4.删除表 drop

    DROP TABLE table_name;

    5.向表中插入记录 insert

    INSERT [ INTO ] table_name [ (col_name1,col_name2…) ] VALUES( val1,val2,…);--单条记录
    INSERT [ INTO ] table_name [ (col_name1,col_name2…) ] VALUES( val1,val2,…),( val1,val2,…);--可以插入多条记录

    建议把列名写上,一一对应。

    举例插入3条数据,不同数据库虽然SQL语句类似但有所不同,例如Oracle的插入语句into不能省,平时使用尽量写全。

    insert into student (id,name,age,sex) values(10086,’守林鸟’,21,2);
    insert student values(default,’霸王别鸡’,22,default);
    insert student values(default,’灰太狼’,22,null);
    insert student values(default,’东方不败’,default,1);

    还有一种插入方法,把从其他表查询到内容 插入到指定表,列名可以不一样

    insert into table_name1(col_name1,col_name2) select col_name11,col_name22 from table_name2; 

    6.建表后添加列并指定位置  alter,add

    ALTER TABLE table_name ADD [ COLUMN ] col_name column_definition [ FIRST | AFTER col_name ]; --添加单列
    ALTER TABLE table_name ADD [ COLUMN ]  col_name column_definition, ADD [ COLUMN  ] col_name column definition,…;---添加多列

    例如添加class列于age列后面,再添加teacher列在最前面

    alter table student add class int unsigned not null after age; 
    alter table student add teacher varchar(20) not null default ‘ACMer’ first;--单列添加两次
    alter table student add class int unsigned not null after age, add teacher varchar(20) not null default ‘ACMer’ first;--一次添加两列

     7.建表后删除列 alter,drop

    ALTER TABLE table_name DROP [ COLUMN ] col_name, DROP [ COLUMN ] col_name,…

    例如删除刚刚添加的class和teacher列

    alter table student drop column class, drop teacher; 

    8.修改列的定义(修改字段的位置或者类型,转型可能有损失) alter,modify

    Alter table table_name modify [column] col_name column_definition [ first|after col_name]

    例如将teacher列修改为varchar(30),默认值为'00',并置于sex后面;原本默认赋值的'ACMer'不会改变,依旧是‘ACMer’,修改后再添加记录teacher的默认值才是'00'

    alter table student modify teacher varchar(30) not null default00’ after sex;

    9.修改列名 alter,change

    ALTER TABLE table_name CHANGE [ COLUMN ] old_col_name new_col_name column_definition [ FIRST|AFTER col_name ];

    例如将teacher列的名改成new_teacher并修改默认值为'陈老师',列的定义也要写,不可以只写新旧名

    alter table student change teacher new_teacher varchar(20) not null default '陈老师';

    10.修改表名 alter,rename

    ALTER TABLE table_name RENAME [ TO|AS ] new_table_name;
    RENAME TABLE table_name TO new_table_name [, table_name2 TO new_table_name2 ];--不可以用as

    11.修改记录 update,set

    Update table_name set col_name={expr1|default} [,col_name2={expr1|default} ][where where_condition];

    where的条件语句是覆盖所有列的修改,而不是最后一个修改列。

    update student set new_teacher='陈冯涛老师',sex=2 where age>=22;

    12.单表删除记录 delete

    delete from table_name [ where where_condition ];

    假如删除id为10090的记录,id是主键,此时最大增长到10090,删除该记录后,再插入记录,则主键id默认值为10091;

    delete from student where id=10090;
    insert student values(default,'怡宝',18,1,1,'罗勇');


    五、添加/删除/查看各种约束

    1.删除主键约束

    alter table table_name drop primary key;

    如果主键还有自动增长的属性(修改列的定义),要先删除自动增长,再删除主键约束

    alter table student modify id int not null;--去掉自动增长,但是作为主键的约束还在
    alter table student drop primary key;--删除主键约束

    2.添加主键约束

    alter table table_name add [ constraint [symbol] ] primary key [ index_type ] ( index_col_name); --symbol表示约束名

    为student表的id字段添加主键约束

    alter table student add primary key(id);
    alter table student add constraint pk_student primary key (id);

    3.删除唯一约束 

    alter table table_name drop {index|key} index_name;
    drop index index_name on table_name;

    唯一约束也是索引,先用show index from table_name;找到索引的名字,再通过索引名删除,例如删除student表中的name字段的唯一约束

    show index from studentG;--G可有可无,是一种格式显示;找到约束名
    alter table student drop index name;--恰好约束名就是name
    show index from studentG;--再查看删除情况

    4.添加唯一约束

    alter table table_name add [ constraint [symbol] ] unique [index|key] [index_name] [ index_type ] ( index_col_name);

    index_type是索引方式,暂不清楚,查看很多约束都是btree,应该是B树查找那类东西。再为student表的name字段添加唯一约束

    alter table student add constraint unique key uk_student_name (name);

    5.删除/修改/添加默认约束

    Alter table table_name alter [column] col_name { set default literal | drop default }

    先删除默认约束后再使用修改语句设置默认值即可以达到添加效果,另一种添加方法是直接添加列名并且设置属性及约束

    alter table student alter teacher drop default;--先删除
    alter table student alter teacher set default '袁大头';--再设置默认值达到添加效果

    六、外键约束

    Foreign key 保持数据一致性,完整性,实现1对1或者1对多的关系,体现关系型数据库

    1.子表是指具有外键列的表,子表参照的表叫父表。父表和子表使用相同的存储引擎,禁止使用临时表。先有父表(记录)才有子表(记录)

    2.存储引擎只能为INNODB(可以在my.ini文件中看到)

    3.外键列(加foreign)和参照列必须具有相似的数据类型。数字长度或有无符号位必须相同;字符长度可以不同。

    4.外键列和参照列必须创建索引。如果外键列不存在索引,自动创建。

    show indexes from table_name [G];--显示索引
  • 相关阅读:
    Qt计算器开发(三):执行效果及项目总结
    [HNOI2019]校园旅行
    How to fix nuget Unrecognized license type MIT when pack
    How to fix nuget Unrecognized license type MIT when pack
    git 通过 SublimeMerge 处理冲突
    git 通过 SublimeMerge 处理冲突
    git 上传当前分支
    git 上传当前分支
    gif 格式
    gif 格式
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/11823912.html
Copyright © 2011-2022 走看看