博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第一节 MySql基础之表操作、行操作和基本数据类型

Posted on 2017-03-27 23:34  Jasonhy  阅读(161)  评论(0)    收藏  举报

    MySql是数据库的一种,数据库就是一种按照数据结构来组织、存储和管理数据的仓库。在我们进行web开发中,我们的后端几乎都是由数据库来保存业务数据。比如一个社交网站,空间动态,好友关联,用户消息等等,这些都是由数据库提供支撑的。

    我们在对一个网站进行设计的时候,一般遵循的就是三层架构:客户端层,也就是我们能够看到的这一层,简单地说就是HTML页面、js、css;业务逻辑层,主要就是为客户端层提供服务的;数据访问层,用来为业务逻辑层提供数据支持。

    常用的数据库:

      ①PostgreSQL:有着丰富的数据类型支持,“IP 类型”等数据类型连商业数据库都不具备,但是在数据集群及管理工具上不如一些商业数据库

      ②MySQL:是一个快速、多线程、多用户的SQL数据库服务器,可以轻易的支持上千万条数据库的数据量,唯一不好就是难学

      ③Oracle:是微软发布的商业性数据库,对几乎所有的操作系统都有良好的支持,就是太贵了

      ④MS SQL Server:也是一种商业性数据库,图形化的用户界面,使系统管理和数据管理更加直观简洁,缺点就是没有Linux平台版本

      ⑤SQLite:一个轻量型,跨平台的关系型数据库,它不是C/S模式的数据库,它是进程内的数据库引擎,因此不存在数据库的客户端和服务端,适合并发性很低的场合

    接下来,我们主要针对的MySQL学习。

    MySQL操作:

      ①显示数据库:show databases;

      

      mysql:用户权限相关数据

      test:用于用户测试数据

      information_schema:MySQL本身架构相关数据

      ②创建数据库

-- 一般情况字符编码设置成utf8
-- utf8_general_ci一种排序规则
create database demo default charset utf8 collate utf8_general_ci;

-- 注:和utf8_unicode_ci的区别
--       utf8_unicode_ci支持扩展,即当把一个字母看作与其他字母相等,比如德语和一些其他语言中的“ß'”等于"ss"
--       utf8_general_ci是一个遗留的校对规则,不支持扩展,它仅能够在字符之间进行逐个比较
--       utf8_unicode_ci准确性高,但是校对速度稍慢
--       utf8_general_ci校对速度快,但是准确度稍差
--       对于中文和英文来说,建议用utf8_general_ci

 

      ③使用数据库:use demo;

      ④用户管理:

-- identified by 将文本加密作为散列值存储
-- 创建一个用户
create user "Jasonhy"@"127.0.0.1" identified by "123";

-- 修改用户信息
rename user "Jasonhy"@"127.0.0.1" to "Jason"@"127.0.0.1";

-- 修改用户密码
set password for "Jason"@"127.0.0.1" = password("456");

-- 删除用户
drop user "Jason"@"127.0.0.1";

      ⑤授权管理:

-- 查看用户权限
show grants for "Jasonhy"@"127.0.0.1";

-- 给用户授权
grant select on demo.test to "Jasonhy"@"127.0.0.1";

-- 取消用户权限 如果权限不存在 会报错
revoke select on demo.test from "Jasonhy"@"127.0.0.1";

-- 如果想立即看到结果使用 命令更新
flush privileges;

注:关于用户名和用户IP:
  用户名@IP地址 -- 用户只能在该IP下才能访问
  用户名@192.168.1.% -- 用户只能在该IP段下才能访问
  用户名@% -- 用户可以在任意IP下访问

     表操作:

创建表的格式:
create table 表名(
        列名 类型 是否可以为空,
        列名 类型 是否可以为空     
)engine=InnoDB default charset=utf8;

    关于创建表的一些概念:

      ①是否为空:null表示空,非字符串

      ②默认值:我们在创建列时可以指定默认值,当插入数据时,如果未主动设置,则会自动添加默认值

      ③自增:如果为某列设置自增,插入数据时无需设置此列,默认将自增,一个数据表只能有一个自增列,对于自增列来说,必须是索引(含主键),我们可以给自增设置步长和起始值,如:

      a:设置起始值 -- set auto_increment_offset = n; n表示起始值

      b:设置步长 -- set auto_increment_increment = m;m表示步长

      ④主键:一种特殊的唯一索引,不允许有空值,如果主键使用单个列,则它的值必须唯一,如果多列,则其组合必须唯一,关键字--primary key

      ⑤外键:一个特殊的索引,只能是指定内容,关键词 foreign key

-- 创建表
create table tb (
        -- nid 设置不能为空 自增 主键
      nid int not null auto_increment primary key,
        -- name 设置默认值
        name varchar(20) default '设置昵称',
        age int,
      gender varchar(10) default '保密',
        cid int
)engine=innodb default charset=utf8
-- 引擎设置为innodb,因为innodb支持事物 
-- 默认字符编码为utf8

 

      外键关联:

create table class(
           cid int not null auto_increment primary key,
          cname varchar(20)
)engine=innodb default charset=utf8

-- 创建外键 
-- 格式
-- alter table 需要设置外键的表 add constraint 外键名称 foreign key 需要设置外键的表(需要设置的字段) references 控制外键的表(控制外键的字段)
-- 注:1,需要设置外键的字段不能为该表的主键 2,控制外键的字段必须为该表的主键 3,设置外键的两个字段的数据类型要一样
alter table tb add constraint fk_class_tb foreign key tb(cid) references class(cid)

       表的其他操作:

-- 删除表
drop table test;

-- 清空表里面的内容 当我们将表的数据清空之后,自增的时候还是会记住上次的内容
delete from test;

-- 清空表里面的内容 情况之后自增会从原始开始
truncate table test;

-- 添加列 
alter table test add age int
-- 删除列
alter table test drop column age
-- 修改列
alter table test modify column age varchar(10)  -- 修改的是类型
alter table test change age gender varchar(10)    -- 修改类名和类型

-- 添加主键
alter table test add primary key(nid)
-- 删除主键
alter table test drop primary key
-- 删除外键
alter table test drop foreign key cid

-- 修改默认值
alter table test alter name set default "A"

 

    行操作:

--
-- insert into tb(name,age,gender,cid) values("张三",18,"男",1),("李四",20,"男",2)
--
-- delete from tb where name = "王二"

--
-- update tb set age = 18 where name = "翠花"

--
-- select name from tb;

-- 通配符查找 
-- select name from tb where name like "张%"  -- 以张开头的所有,可以匹配多个字符
-- select name from tb where name like "张_"  -- 也是以张开头 但是只能匹配一个字符

-- 限制查找 可以用来做分页
-- select name from tb limit 0,2        -- 第一个参数表示从哪个位置开始 第二个参数表示要查询多少行
-- select name from tb limit 2 offset 1  -- 第一个参数表示要查询的行数 第二个参数表示要从哪个位置开始,推荐使用这种,因为当要查询的偏移量很大的时候,这种的查询效率要高

-- 排序
-- select name from tb order by nid asc -- asc 从小到大
-- select name from tb order by nid desc    -- desc 从大到小

-- 分组 可以用来去重复
-- select cid,count(1) from tb group by cid  -- group by 在和where和order by一起使用的时候,要在where的后面,order by的前面
 
-- 连表
-- select tb.name,tb.age,tb.gender,class.cname from tb inner join class on tb.cid = class.cid        -- 无对应关心则不显示
-- select tb.name,tb.age,tb.gender,class.cname from tb left join class on tb.cid = class.cid  -- tb表中所有显示,如果class无对应关系,则值为null 推荐使用这种,执行效率高

-- 组合
-- select nid from tb union select cid from class  -- 自动处理重合
select nid from tb union all select cid from class    -- 不处理重合

    数据类型:大致分为数值,时间和字符串

      ①数值:

        a:bit[(m)]--二进制位(101001),m表示二进制位的长度(1-64),默认m=1

        b:tinyint[(m)]--小整数,有符号范围:-128~127 无符号范围:0~255,需要注意的是,MySQL中无布尔值,通过tinyint(1)构造

        c:int[(m)][unsigned][zerofill]--整数,有符号范围:-2147483648~2147483647 无符号范围:0~4294967395,整数类型中的m仅用于显示,对存储范围无限制,比如:int(5),当插入数据是2时,select时数据显示为00002

        d:bigint[(m)][unsigned][zerofill]--大整数,有符号范围:-9223372036854775808~9223372036854775807 无符号范围:0~17446744073709551615

        e:decimal[(m[,d)][unsigned][zerofill]--准确的小数值,m是数字的总个数(负号不算),d是小数点后个数,m最大值是65,d最大值是30,当需要精确数值计算是需要用此类型,能够存储精确值的原因在于内部按照字符串存储

        f:float[(m,d)][unsigned][zerofill]--单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数,有符号范围:0  1.175494351E-38 ~ 3.402823466E+38;无符号范围:-3.402823466E+38 ~ -1.175494351E-38 0 1.175494351E-38 ~ 3.402823466E+38 ;数值越大,越不准确

        g:double[(m,d)][unsigned][zerofill]--双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数, 有符号范围:0 2.2250738585072014E-308 ~ 1.79769313468623157E+308; 无符号范围:-1.7976931348623157E+308 ~ -2.2250738585072014E-308 0 2.2250738585072014E-308 ~ 1.7976931348623157E+308,数值越大,也越不准确

      ②字符串

        a:char(m)--m代表字符串的长度,最大是255个字符,长度是固定的,用不好会比较占内存,比如设置的是7个长度,我们存的时候就只有4个,但是内部还是按照7个长度来存,这样就浪费了空间,但是执行效率要高

        b:varchar(m)--最大也是255个字符,长度是可变的,也就是说可以根据实际存储的大小来设置长度,这样就节省了空间,但是效率要低

        c:text--用来保存变长的大字符串,可以组多到65535(2**16 -1)个字符

        d:mediumtext--长度可达16,777,215 (2**24 − 1)个字符

        e:longtext--长度可达4,294,967,295 或 4GB (2**32 − 1)

      ③时间             

        DATE:YYYY-MM-DD(1000-01-01/9999-12-31)
        TIME:HH:MM:SS('-838:59:59'/'838:59:59')
        YEAR:YYYY(1901/2155)
        DATETIME:YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
        TIMESTAMP:YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时     
     ④其他
        枚举:单选
        CREATE TABLE shirts (
         name VARCHAR(40),
         size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
        );
        INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
        集合:多选
        CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
        INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');


    注:查看字符编码:show variables like 'character%';压缩版配置文件http://www.jb51.net/article/94583.htm