Mysql基本数据操作

一.mysql中的逻辑对象

mysqld(process_id(threads)+memory+datadir)-->库-->表-->记录(由行与列组成)

什么是关系型数据库:
表与表发生关系,叫关系型

如何操作数据库中的数据(使用SQL语句):
    动作:
        1、查询动作(最多的动作)
        2、修改动作
        3、删除动作
        4、增加动作

SQL(国际标准化,结构查询语言)
如果操作数据库中的数据:使用结构化查询语句(SQL)

mysql=国际标准化+mysql官方的自定义标准
pl/sql=国际标准化+oracle官方的自定义标准
Tsql=国际标准化+microsoft官方的自定义标准


SQL的种类:
数据定义语言:DDL        create drop alter            --定义表和库的结构
数据操作语言:DML        insert delete update select    --对表中的数据进行增删改查的操作
数据控制语言:DCL            grant revoke            --针对不同数据对象进行授权(全库/单库/表/列)

二.数据类型

2.1 浮点数

 FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

小(单精度)浮点数。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

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

如果指定UNSIGNED,不允许负值。

使用浮点数可能会遇到意想不到的问题,因为在MySQL中的所有计算用双精度完成。参见A.5.7节,“解决与不匹配行有关的问题”。

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

普通大小(双精度)浮点数。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约15位小数位。

如果指定UNSIGNED,不允许负值。

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。小数点和(负数)的‘-’符号不包括在M中。如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。如果D被省略, 默认是0。如果M被省略, 默认是10。

2.2 字符串类型(普通字符串、比特位字符串、二进制字符串)

  CHAR(50)        --定长字符串
     varchar(50)        --可伸缩长度的字符串


这是CHAR(1)的同义词。

  [NATIONAL] VARCHAR(M) [BINARY]        --可伸缩的字符串

变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。



VARCHAR是字符VARYING的简写。

BINARY属性是指定列的字符集的二元 校对规则的简写。排序和比较基于数值字符值。

VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。


BINARY(M)

BINARY类型类似于CHAR类型,但保存二进制字节字符串而不是非二进制字符串。

VARBINARY(M)

VARBINARY类型类似于VARCHAR类型,但保存二进制字节字符串而不是非二进制字符串。

TINYBLOB

最大长度为255(281)字节的BLOB列。

TINYTEXT

最大长度为255(281)字符的TEXT列。

BLOB[(M)]

最大长度为65,535(2161)字节的BLOB列。

可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。

TEXT[(M)]

最大长度为65,535(2161)字符的TEXT列。

可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。

MEDIUMBLOB

最大长度为16,777,215(2241)字节的BLOB列。

MEDIUMTEXT

最大长度为16,777,215(2241)字符的TEXT列。

LONGBLOB

最大长度为4,294,967,295或4GB(2321)字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。

 LONGTEXT

最大长度为4,294,967,295或4GB(2321)字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。

ENUM('value1','value2',...)

枚举类型。只能有一个值的字符串,从值列'value1','value2',...,NULL中或特殊 ''错误值中选出。ENUM列最多可以有65,535个截然不同的值。ENUM值在内部用整数表示。

SET('value1','value2',...)

一个设置。字符串对象可以有零个或多个值,每个值必须来自列值'value1','value2',...SET列最多可以有64个成员。SET值在内部用整数表示。


    1、整数列 tinyint smallint   MEDIUMINT int bigint
    2、小数列    float double decimal
    3、文本列 tinytext medu longtext(4G)
    4、字符串列 char varchar binary  varbinary blob longblob
    5、日期时间 year date time datetime timestamp
    6、列特殊属性:自动增长列/主键列/是否允许为空/列的默认值/是否允许重复

2.3 整数

 create table t1(id tinyint(2), name varchar(50))

TINYINT[(M)] [UNSIGNED] [ZEROFILL] [not null] [comment]

很小的整数。带符号的范围是-128到127。无符号的范围是0到255。

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。

INT[(M)] [UNSIGNED] [ZEROFILL]

普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

INTEGER[(M)] [UNSIGNED] [ZEROFILL]

这是INT的同义词。

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。

2.4 日期和时间类型概述

   DATE

    日期。支持的范围为'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式显示DATE值,但允许使用字符串或数字为DATE列分配值。

  DATETIME

  日期和时间的组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。

  TIMESTAMP[(M)]

  时间戳。范围是'1970-01-01 00:00:00'到2038年。

  TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。

  TIME

  时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式显示TIME值,但允许使用字符串或数字为TIME列分配值。

  YEAR[(2|4)]

  两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是1901到2155和0000。在两位格式中,允许的值是70到69,表示从1970年到2069年。MySQL以YYYY 格式显示YEAR值,但允许使用字符串或数字为YEAR列分配值。

三.DDL操作

3.1 create(database/table/user):

  库(其实对磁盘上的物理文件就是一个文件夹): 

--创建库
--default charset utf8,指定编码为utf8
create database  IF NOT EXISTS db1  default charset utf8;
--查看库是如果建立的 show create database db1;
--查询系统默认语言编码 show variables like '%char%';
--修改一个已经存在数据库的语言编码 alter database db01 default charset gbk;
--只能查询最后一次warning的信息 show warnings;

  表:二维表(由行和列来组成的表,表必须存在于某个库中)

--使用库
use db1;
--创建表,格式如下 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGINE=InnoDB DEFAULT CHARSET=utf8 --例 : create table db1.t1(id int auto_increment,name varchar(50), gender char(6),salary decimal(10,2), dept_id int,primary key(id));
--查看表结构 desc t1;
--查询表所有内容 select * from db1.t1;
--查看表是如何创建的 show create table db1.t1;

  创建用户

--创建一个用户
create user user01@'localhost' identified by '123';

--设置用户的密码
set password for user01@'localhost'=password('123');

--验证用户是否创建成功
select user from mysql.user where user='user01';

--查看用户权限
show grants; 

3.2 drop:    --删除数据库对象(表/库/用户)

删除表/库

--删除表
drop table t1; 

--验证表是否删除成功
show tables; 

--清空表,只清空表中数据,不会删除表结构
truncate table t1;

--删除库
drop database db1;

--验证库是否删除成功
show databases;

  删除用户

--删除用户
drop user user01@'localhost';

--验证用户是否删除成功
select user from mysql.user where user='user01';

--删除一个匿名用户
drop user ''@'localhost';

--重命名
rename user u01@'localhost' to u001@'localhost';

  3.3 alter(修改已经存在数据库对象(库/表/列)的属性)

--修改数据库语言编码
ALTER DATABASE db1 DEFAULT CHARACTER SET gbk;    

  修改表的属性:

--表中添加一列数据
alter table t1 add gender char(6);

--添加外键
alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
--例 :
alter table t1 add constraint fk_t1_depart_id foreign key t1(dept_id) references depart(id);

--删除外键
alter table 表名 drop foreign key 外键名称

--添加主键
alter table 表名 add primary key(列名);
--例:
alter table depart add primary key(id) auto_increment;

--表id列自动增加,自动增加列必须是主键
alter table depart modify id int auto_increment;

--删除主键
alter table 表名 drop primary key;
alter table 表名  modify  列名 int, drop primary key;

--在name列后面增加一列叫addr
ALTER TABLE t1 add addr char(50) AFTER name;

--删除addr这个列
alter table t1 drop addr;

--修改列名和数据类型
alter table t1 change id ID bigint;

--修改列的数据类型
alter table t1 modify ID int;

--重命名表
alter table t1 rename t01;    

--查看数据库有哪些存储引擎
show engines;

--修改表的存储引擎
alter table t1 engine MyISAM;

--查看修改存储引擎是否成功
show create table t1;

--修改表的语言编码
alter table t1 DEFAULT CHARSET=utf8;

四. DML操作    --操作表中的记录

  4.1 insert 插入记录

--向指定列插入数据
insert into depart set id=1,name='sales';

--插入多条记录
insert into depart(name) values('maket'),('IT'),('HR');

insert into 表 (列名,列名...) select (列名,列名...) from--例:
--查出前4张表,插入到当前表(注意表结构要一致)
insert into db1.t1 select * from db1.t2 where id<5; 

  4.2 update    更新/修改记录

--更新表数据
update t1 set salary=9000 where name='ellen';

--更改root用户对应在localhost登录的密码
update mysql.user set Password='redhat' where user='root';
update mysql.user set Password=password('redhat') where user='root';

--刷新权限表(重新到磁盘上把mysql库中跟权限相关的重载一次)
flush privileges;

  4.3 delete/truncate 删

--删除mysql中的匿名用户
delete from mysql.user where user='';

--删除整个表,一行一行删除,所有的操作都会被记录至事务日志中
delete from t2;  

--指定条件删除
delete from t2 where id=1; 

--一次性全部删除,不会被记录至事务日志中.
truncate t2; 

  4.4 查 select

通配符:
    %    匹配0个或任意多个字符
    _    匹配一个字符
    =    精确匹配
    like    模糊匹配
    regex(^  .  .* .....)        使用正则表达式来匹配
排序:
    order by    排序
            asc        升序排列结果
            desc    降序排列结果
    group by    聚合
    
    distinct    去除重复的行

例:表信息如下



--查询表中所有的列对应的值(全表扫描)
select * from db02.t1;

--查询表中指定列
select host,password,user from mysql.user;

--给列取别名,增加可读性
select host as 主机名,password as 密码,user as 用户名 from mysql.user;

--模糊匹配
select * from t1 where name like '%i%';

--精确匹配
 select * from t1 where name='wang5'; 

--条件匹配
select * from t1 where english < 60;

 --支持正则表达式
select * from t1 where name regexp '.*[0-9]?.*' ;  

--任意数字一次或一次以上
select * from t1 where name regexp '.*[0-9]+.*' ; 

select user,password,host from mysql.user where host regexp '([0-9]{1,3}\.){3}([0-9]{1,3})';

排序

--降序排列
select * from t1 order by math desc;

--升序排列
select * from t1 order by math asc;

  去除重复行

select distinct id from t1 ;

  聚合group by

select  * from t1 group by name


select * from t1 group by id having id <= 2;

特别的:group by 必须在where之后,order by之前

  分页函数

--显示前10行
select * from t1 limit 10; 

--显示11至20行
select * from t1 limit 10,10;

--显示第1行 
select * from t1 limit 1;

--起始位置,偏移量  第二行的下2行
select * from t1 limit 4,2;     -- 显示5,6行

--显示英语前三名
select * from t1 order by english desc limit 3;   

  and or not    逻辑运算

--and两个条件同时满足
select * from t1 where math >= 60 and english >= 60;

--or 其中一个条件满足
select * from t1 where math >= 60 or english >= 60;

--not 不满足
select * from t1 where math >= 60 and not  english >= 60;

--两个条件之间
select * from where id between 5 and 16;

   sum() avg() max() min() count() 内置函数

--sum求合
select name,sum(math),sum(english) from t1;

--avg求平均值
select name,avg(math),avg(english) from t1;

--最大值
select name,max(english) from t1;

--最小值
select name,min(english) from t1;

--统计个数
select count(*) from t1;

  表的连接:纵向连接/内连接/左连接/右连接

左连接(以左表为标准连接右表):
letft join=left [outer] join

表结构

select * from t1 left join depart on t1.dept_id=depart.id;

右连接(以右表为标准连接左表):
right join= right outer join

select * from t1 right join depart on t1.dept_id=depart.id;

内连接:取多表之间的交集(自动忽略空值)

select * from t1 inner join depart on t1.dept_id=depart.id;

  纵向连接:

--组合,不处理重合
    select nickname
    from A
    union all
    select name
    from B

五.DDL(grant/revoke)

  5.1 grant

权限分类:
USAGE                            --无权限,只有登录数据库,只可以使用test或test_*数据库
ALL                                --所有权限
select/update/delete/super/slave/reload    --指定的权限
with grant option                    --允许把自己的权限授予其它用户(此用户拥有建立账号的权限)

权限级别:
    1、*.*            --全库、全表(mysql.user)
    2、mysql.*        --mysql库下所有表(某库中的所有表)(mysql.db)
    3、mysql.user        --mysql库中user表(单表)(mysql.table_priv)
    4、mysql.user.host    --mysql库中user表的host列(mysql.columns_priv)

用户权限:
    username@localhost
        1、username            --你被授予了什么权限
        2、username/password    --账号密码
        3、localhost            --表示你可以在哪里登录(这里表示只能本机通过socket登录)
    
        user@localhost        --表示user只能在本地通过socket登录服务器
        user@192.168.0.1        --表示user用户只能在192.168.0.1登录数据库服务器
        user@192.168.0.0/255.555.255.0
                            --指定某个子网的主机可以登录数据库
        user@%                --表示user用户能在所有的机器上登录数据库服务器

新建user02用户, 要求user02只能在本机登录而且对DB这个库的所有表拥有完全控制的权限:
mysql> grant all on DB.* to user02@'localhost' identified by '123';
mysql> select user,password,host from mysql.user;  --查看用户创建是否成功

更改user02在所有机器上都能登录数据库.
mysql> update mysql.user set host='%' where user='user02'; 
mysql> flush privileges;



让user02可以把自己的权限授予其它用户:
mysql> grant ALL on DB.* to user02@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)


查看权限:
mysql> show grants;    --查看自己的权限
mysql> show grants for user02@'%';    --查看指定用户的权限 


权限的作用范围(*.* database.* database.table)
mysql> grant select,update on DB.t3 to user04@'localhost' identified by '123'; 

列的授权:
mysql> grant update (user) on mysql.user to user03@'%';
mysql> grant update (user,host,password) on mysql.user to user03@'%';

权限的保存位置:
mysql.user            --所有mysql用户的账号和密码,以及对用户对全库全表权限(*.*)
mysql.db                --非mysql库的授权都保存在此(db.*)
mysql.table_priv        --某库某表的授权(db.table)
mysql.columns_priv        --某库某表某列的授权(db.table.col1)
mysql.procs_priv        --某库存储过程的授权

5.2 revoke取消权限

REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';    --撤消指定的权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... --撤消所有的权限

mysql> drop user user02;        --撤消所有权限后把用户一并删除

忘记root密码的操作:

mysql的用户验证逻辑:
mysqluser-->mysqld(3306/scoket)-->(host/user/password)-->mysql.user


1、关闭正在运行的mysql服务器
2、重新启mysql,但启动的过程让mysql跳过用户验证(mysql.user),然后改密码
3、安全关闭mysql,然后再启动,这样密码就被重置了。
# service mysql stop 或 pkill -9 mysql
# cd /opt/mysql-glibc
# /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf --skip-grant-tables &
mysql> update mysql.user set password=password('147258369') where user='root';
# mysqladmin shutdown
# /opt/mysql-glibc/bin/mysqld_safe --defaults-file=/data2/my.cnf &

 

posted @ 2016-08-09 17:28  jl_bai  阅读(363)  评论(0编辑  收藏  举报

收藏

返回顶部