Mysql笔记

作者: 佐半边的翅膀 | 来源:发表于2019-04-11 19:56 被阅读1次

## 数据库操作 ##

1.创建数据库和数据库中的表

create database [if not exists]数据库名 [default character set 字符编码(集)]加上中括号是代表不是必选

    create database if not exists shcool defadult charset utf8;

use 数据库名;  //选中所需的数据库

    use school;

建表

    create table student2(

        stuNo  varchar(6),

    stuName  varchar(50),

    address  varchar(50),

    emailvarchar(40)

    );

2.切换不同的数据库

use 数据库名;

use yunsi2;

3.获取自己目前所在的数据库

select  database( );

show databases  like 'yu%';

4 . 删除表

drop table student2;

5.查看数据库中有多少张表

show tables;

6.查看表的创建语句

show create table student2;

## 数据类型 ##

**整数**(int用的最多)

    tinyInt

    smallInt

    mediumInt

    int 

    bigInt 

范围从小到大

这些整数分为带符号的  signed  负数-----正数

     无符号   unsigned    0-----值  

     signed   tinyInt     -128----- 127

     unsigned tinyInt      0-----255 

      create table t_ceshi1(

      t_num1   tinyInt signed,

      t_num2   tinyInt unsigned,

      t_num3   tinyInt,

      t_createTime dateTime

     )engine=innoDB default charset utf8;

    注意点: t_num3没有标明是无符号还是带符号,默认成带符号的 signed

**小数类型**(double用的多)

     decimal(M,D)

     numeric(M,D)

     float(M,D); 

     double(M,D)  

     取值范围不同

M:数字的总位数  ,D:小数位数     ,小数点不算

    create table t_ceshi3(

      t_num1   decimal(5,2),

      t_num2    numeric(5,2),

      t_num3   float(5,2),

      t_num4  double(5,2),

      t_createTime dateTime

     )engine=innoDB default charset utf8;

    数字:总共5位,小数占2位,整数部分最多3位  

**位字段类型 **bit

     create table t_ceshi5(

      t_num1 bit(8),

      t_createTime dateTime

     )engine=innoDB default charset utf8; 

**字符串类型**

char(M)   M:0-255,默认值是255

varchar(M)   M:0-65535,如果mysql编码方式指定为utf-8时,实测 M:0---21844。

----- 创建表的时候,char可以不指定长度,varchar必须指定长度

------实测char不指定长度时,默认长度1,  测试一下非严格模式时,char的默认长度、

      create table t_ceshi6(

      t_num1 char,

      t_num2 varchar(10),

      t_createTime dateTime

     )engine=innoDB default charset utf8;

**复合类型**

存储一整篇文章,整本书,字符量比较大,(char,varchar不够用了)

        text    文本类型   

        tinyText ,text, mediumText, longText

         tinyText----0-255个字符 

                 text---   0-65535个字符

                 mediumText- ----  0   - 16777215个字符

                 longText---   0  -- 4294967295个字符

存储图片,音频,视频   blob  ,二进制大对象

    tinyBlob  blob,  mediumBlob , longBlob  

//没有默认长度

     create table t_ceshi8(

      t_num1 text,

      t_num2 blob,

      t_createTime dateTime

     )engine=innoDB default charset utf8;

---- 选用文本类型,二进制大对象类型时,无需指定长度  ,只需要写类型

      create table t_ceshi9(

      t_num1 text(5),

      t_num2 blob(5),

      t_createTime dateTime

     )engine=innoDB default charset utf8;

    text(5) ----->tinytext

    blob(5)----->tinyblob  

**enum枚举类型**

固定的几个值   ,一旦列名是枚举类型,插入值的时候,只能在固定的几个值里选取。

    create table t_ceshi10(

      t_num1 varchar(10),

      t_num2 enum('spring','summer','autumn','winter'),

      t_num3  enum('male','female'),

      t_num4   enum('101','102','103'),

      t_createTime dateTime

     )engine=innoDB default charset utf8;

    insert into t_ceshi10(t_num1,t_Num2,t_num3,t_Num4,t_createTime) 

     values('jack','spring','male','101',now());

**日期类型**(date,dateTime)

   1.  Date   yyyy-MM-dd

        1000-01-01----9999-12-31

   2.  Time    HH:mm:ss

            -838:59:59-----838:59:59  

   3.  DateTime    yyyy-MM-dd HH:mm:ss

        1000-01-01 00:00:00 -----9999-12-31 23:59:59 

   4. timestamp   yyyy-MM-dd HH:mm:ss

             1970-01-01 00:00:01-----2038-01-19 03:14:07  

                  经过测试得出范围为1970-01-01 08:00:01 到2038-01-19 11:14:07

   5. year     yyyy

        1901---2155

        create table t_ceshi11(

            t_num1  date, 

        t_num2  time,

        t_num3 dateTime,

        t_num4  timestamp, 

        t_num5   year

         )engine=innoDB default charset utf8;

## 数据操作 ##

-- 增

        INSERT [INTO] 表名 [(字段列表)] VALUES (值列表)[, (值列表), ...]

-- 如果要插入的值列表包含所有字段并且顺序一致,则可以省略字段列表。

-- 可同时插入多条数据记录!

    REPLACE 与 INSERT 完全一样,可互换。

    INSERT [INTO] 表名 SET 字段名=值[, 字段名=值, ...]

-- 查

    SELECT 字段列表 FROM 表名[ 其他子句]

        -- 可来自多个表的多个字段

        -- 其他子句可以不使用

        -- 字段列表可以用*代替,表示所有字段

-- 删

    DELETE FROM 表名[ 删除条件子句]

        没有条件子句,则会删除全部

-- 改

    UPDATE 表名 SET 字段名=新值[, 字段名=新值] [更新条件]

## INSERT ##

select语句获得的数据可以用insert插入。

可以省略对列的指定,要求 values () 括号内,提供给了按照列顺序出现的所有字段的值。

    或者使用set语法。

    INSERT INTO tbl_name SET field=value,...;

可以一次性使用多个值,采用(), (), ();的形式。

    INSERT INTO tbl_name VALUES (), (), ();

可以在列值指定时,使用表达式。

    INSERT INTO tbl_name VALUES (field_value, 10+10, now());

可以使用一个特殊值 DEFAULT,表示该列使用默认值。

    INSERT INTO tbl_name VALUES (field_value, DEFAULT);

可以通过一个查询的结果,作为需要插入的值。

    INSERT INTO tbl_name SELECT ...;

可以指定在插入的值出现主键(或唯一索引)冲突时,更新其他非主键列的信息。

    INSERT INTO tbl_name VALUES/SET/SELECT ON DUPLICATE KEY UPDATE 字段=值, …;

##DELETE##

    DELETE FROM tbl_name [WHERE where_definition] [ORDER BY ...] [LIMIT row_count]

按照条件删除。where

指定删除的最多记录数。limit

可以通过排序条件删除。order by + limit

支持多表删除,使用类似连接语法。

delete from 需要删除数据多表1,表2 using 表连接操作 条件。

## TRUNCATE##

TRUNCATE [TABLE] tbl_name

清空数据

删除重建表

区别:

1,truncate 是删除表再创建,delete 是逐条删除

2,truncate 删除表中记录,不支持事务,不能恢复 (本质上是删除表结构表数据,然后再重建表结构)

3,delete 删除表记录,支持事务,可以在事务中使用回滚恢复之前删除的数据。

## 备份与还原 ##

备份,将数据的结构与表内数据保存起来。

利用 mysqldump 指令完成。

-- 导出

mysqldump [options] db_name [tables]

mysqldump [options] ---database DB1 [DB2 DB3...]

mysqldump [options] --all--database

1. 导出一张表

2. 

mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql)

2. 导出多张表

mysqldump -u用户名 -p密码 库名 表1 表2 表3 > 文件名(D:/a.sql)

3. 导出所有表

mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql)

4. 导出一个库

mysqldump -u用户名 -p密码 --lock-all-tables --database 库名 > 文件名(D:/a.sql)

可以-w携带WHERE条件

-- 导入

1. 在登录mysql的情况下:

source  备份文件

2. 在不登录的情况下

mysql -u用户名 -p密码 库名 < 备份文件

##     用户操作 ##

**创建一个用户,指定密码。**

格式:

create user 用户名@IP地址 identified by '密码';

如:创建一个用户,用户名为ming,密码为123456

create user ming@'%' identified by '123456';

Use mysql;

User 表,存储了所有的登录用户

**为用户赋予操作权限**

格式:

grant create,alter, drop, insert, update, delete, select  on 数据库名字.表名  to  用户名@IP地址;

如:

赋予ming用户 create, alter, drop, insert, update, delete权限在njwangbo中的t_studnet表上

grant create,alter, drop, insert, update, delete on njwangbo.t_studnet to ming@'%';

给root授予在任意主机(%)访问任意数据库的所有权限

grant all privileges  on*.*to root@’%’ identified by ‘123456’ with grant option;

给root授予在指定数据库上的权限

**回收权限**

格式:

revoke 权限 on 数据库.*|表 from 用户名@IP地址;

回收ming用户在t_studnet表上的select权限

revoke select on njwangbo.t_studnet from ming@'%';

回收ming在njwangbo数据库所有数据对象上的所有权限

revoke all on*.*from ming@'%';

**查看用户的权限**

show grants for 用户名@IP地址

**删除某个用户**

drop user 用户名@IP地址;

delete from user where user=’’;

**修改密码**

使用create user创建用户时,相当于在mysql数据库的user表中插入一行数据。如果修改某个用户的信息(权限,密码),则可以直接修改user表中的列即可。

修改某用户的密码

    use mysql;

    update user set password=password('root')  where user = 'root';

    flush privileges;

    或者 set password for 用户名=password('root');

**重命名用户**

RENAME USER old_user TO new_user

**数学函数**

向上取整ceil(8.1);

向下取整floor(8.9);

取余数mod(10,3);

四舍五入round(10.572,1);

截断 truncate(7.123456,2);

**查询**

    SELECT [ALL|DISTINCT] select_expr FROM -> WHERE -> GROUP BY [合计函数] -> HAVING -> ORDER BY -> LIMIT

    a. select_expr

-- 可以用 * 表示所有字段。

    select * from tb;

-- 可以使用表达式(计算公式、函数调用、字段也是个表达式)

    select stu, 29+25, now() from tb;

-- 可以为每个列使用别名。适用于简化列标识,避免多个列标识符重复。

    - 使用 as 关键字,也可省略 as.

    select stu+10 as add10 from tb;

    b. FROM 子句

    用于标识查询来源。

-- 可以为表起别名。使用as关键字。

    SELECT * FROM tb1 AS tt, tb2 AS bb;

-- from子句后,可以同时出现多个表。

-- 多个表会横向叠加到一起,而数据会形成一个笛卡尔积。

    SELECT * FROM tb1, tb2;

-- 向优化符提示如何选择索引

    USE INDEX、IGNORE INDEX、FORCE INDEX

    SELECT * FROM table1 USE INDEX (key1,key2) WHERE key1=1 AND key2=2 AND key3=3;

    SELECT * FROM table1 IGNORE INDEX (key3) WHERE key1=1 AND key2=2 AND key3=3;

    c. WHERE 子句

-- 从from获得的数据源中进行筛选。

-- 整型1表示真,0表示假。

-- 表达式由运算符和运算数组成。

-- 运算数:变量(字段)、值、函数返回值

-- 运算符:

    =, <=>, <>, !=, <=, <, >=, >, !, &&, ||,

    in (not) null, (not) like, (not) in, (not) between and, is (not), and, or, not, xor

    is/is not 加上ture/false/unknown,检验某个值的真假

    <=>与<>功能相同,<=>可用于null比较

    d. GROUP BY 子句, 分组子句

    GROUP BY 字段/别名 [排序方式]

    分组后会进行排序。升序:ASC,降序:DESC

    以下[合计函数]需配合 GROUP BY 使用:

    count 返回不同的非NULL值数目  count(*)、count(字段)

    sum 求和

    max 求最大值

    min 求最小值

    avg 求平均值

    group_concat 返回带有来自一个组的连接的非NULL值的字符串结果。组内字符串连接。

    e. HAVING 子句,条件子句

    与 where 功能、用法相同,执行时机不同。

    where 在开始时执行检测数据,对原数据进行过滤。

    having 对筛选出的结果再次进行过滤。

    having 字段必须是查询出来的,where 字段必须是数据表存在的。

    where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。

    where 不可以使用合计函数。一般需用合计函数才会用 having

    SQL标准要求HAVING必须引用GROUP BY子句中的列或用于合计函数中的列。

    f. ORDER BY 子句,排序子句

    order by 排序字段/别名 排序方式 [,排序字段/别名 排序方式]...

    升序:ASC,降序:DESC

    支持多个字段的排序。

    g. LIMIT 子句,限制结果数量子句

    仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始。

    limit 起始位置, 获取条数

    省略第一个参数,表示从索引0开始。limit 获取条数

    h. DISTINCT, ALL 选项

    distinct 去除重复记录

    默认为 all, 全部记录

## 列约束 ##

1. PRIMARY 主键

    - 能唯一标识记录的字段,可以作为主键。

    - 一个表只能有一个主键。

    - 主键具有唯一性。

    - 声明字段时,用 primary key 标识。

        也可以在字段列表之后声明

            例:create table tab ( id int, stu varchar(10), primary key (id));

    - 主键字段的值不能为null。

    - 主键可以由多个字段共同组成。此时需要在字段列表后声明的方法。

        例:create table tab ( id int, stu varchar(10), age int, primary key (stu, age));

2. UNIQUE 唯一索引(唯一约束)

    使得某字段的值也不能重复。

3. NULL 约束

    null不是数据类型,是列的一个属性。

    表示当前列是否可以为null,表示什么都没有。

    null, 允许为空。默认。

    not null, 不允许为空。

    insert into tab values (null, 'val');

        -- 此时表示将第一个字段的值设为null, 取决于该字段是否允许为null

4. DEFAULT 默认值属性

    当前字段的默认值。

    insert into tab values (default, 'val');    -- 此时表示强制使用默认值。

    create table tab ( add_time timestamp default current_timestamp );

        -- 表示将当前时间的时间戳设为默认值。

        current_date, current_time

5. AUTO_INCREMENT 自动增长约束

    自动增长必须为索引(主键或unique)

    只能存在一个字段为自动增长。

    默认为1开始自动增长。可以通过表属性 auto_increment = x进行设置,或 alter table tbl auto_increment = x;

6. COMMENT 注释

    例:create table tab ( id int ) comment '注释内容';

7. FOREIGN KEY 外键约束

    用于限制主表与从表数据完整性。

    alter table t1 add constraint `t1_t2_fk` foreign key (t1_id) references t2(id);

        -- 将表t1的t1_id外键关联到表t2的id字段。

        -- 每个外键都有一个名字,可以通过 constraint 指定

    存在外键的表,称之为从表(子表),外键指向的表,称之为主表(父表)。

    作用:保持数据一致性,完整性,主要目的是控制存储在外键表(从表)中的数据。

    MySQL中,可以对InnoDB引擎使用外键约束:

    语法:

    foreign key (外键字段) references 主表名 (关联字段) [主表记录删除时的动作] [主表记录更新时的动作]

## MyISAM和InnoDB两者区别##

**事务支持**

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

**全文索引**

MyISAM:支持(FULLTEXT类型的)全文索引

InnoDB:不支持(FULLTEXT类型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

**外键**

MyISAM:不支持

InnoDB:支持

**CURD操作**

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

**MyISAM和InnoDB两者的应用场景:**

1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

2) InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

相关文章

网友评论

    本文标题:Mysql笔记

    本文链接:https://www.haomeiwen.com/subject/yfgxwqtx.html