SQL

  1. 数据查询语言DQL:select
  2. 数据操作语言DML:insert update delete
  3. 事务处理语言TPL:用于事物安全处理,不是所有数据库都支持事务处理语言。
  4. 数据控制语言DCL:专门用于权限管理,grant分配,revoke回收
  5. 数据定义语言DDL:专门用于结构管理 creat drop (alter)
以上语言统称为SQL。
  • MySQL一个关系型数据库。
  • MySQL对PHP的支持是最好的(wamp或者lamp)
  • MySQL用到的指令为SQL指令。

MySQL的架构是C/S结构,客户端和服务端。

  • 服务端对应的软件为MySQL.exe

  • 启动MySQL

    cmd命令:net start mysql 开启mysql

    ​ :net stop mysql 关闭mysql

  • 进入服务:通过cmd命令:services.msc

    找到mysql进行启动服务。

  • 通过客户端与服务器进行链接认证,就可以进行操作。

  • 通常服务端与客户端不在一台电脑。

连接认证基本语法

mysql/mysql.exe -hlocalhost -P3306 -uroot -proot

登录数据库之后可以对数据库进行操作。

  • 退出时,使用以下的方式退出。
  1. EXIT;
  2. \q

MySQL的服务端的架构有以下几层构成。

​ 1.数据库管理系统(最外层):DBMS,专门管理服务器的所有内容。

​ 2.数据库(第二层):DB,专门用于存储数据的仓库(可以后很多个)

3.二维数据表(第三层):Table,专门存储某种类型的数据。

​ 4.字段(第四层):Field,专门存储某种类型的数据(实际存储单元)。

数据库几个常用的关键字。

row 行

column 列

SQL对于数据库的操作。

数据库数据存储的最外层。

  • 创建数据库

    . ​ 基本语法:create database mydatabase;
    . ​ 库选项:charset 字符集,代表着当前数据库下的所有的数据默认指定的字符集
    . ​ 校对集:collate 校对集。
    . ​ Create database 数据库名字 charset 字符集

    1. create database mydatabase2 charset gbk;

      有数据库,就要有文件来存储。每个数据库文件夹下,都有一个opt文件,保存的是数据库选项。

  • 有数据库,怎样通过指令来查看数据库

  • 显示所有的数据库

    • show
  • 显示部分数据库

    • 基本语法:show databases like ‘字符串’
    • '_' 匹配当前位置的单个字符。
    • '%'匹配指定位置的多个字符。
    • 获取以my开头的全部数据库 :'my%'
    • 获取以m开头,后面的第一个字母不确定,最后为database的数据库:m_database
    • 获取以database结尾的数据库:'%database'
  • 显示数据库的创建语句

    • show create database mydatabase
    • 看到的指令并非原始指令而是经过系统加工的指令
  • 选择数据库

    • 为什么选择数据库?因为数据库是存储到数据表,表存在数据库下,如果要操作数据,name必须要进入到对应的数据库才行。
    • 基本语法:use数据库名字;
      • use mydatabase;
        • 返回一个Database changed,表示当前进入到指定的数据库环境。
  • 修改数据库

    • 是否可以修改数据库的名字,mysql之前可以用rname修改之后不可以。
    • 修改数据库的库选项:字符集和校对集。
      • 基本语法:alter database mydatabase charset = gbk;
      • 一旦修改成功,相对应的opt文件也发生变化。
  • 删除数据库

    • 基本语法:drop database mydatabase;
    • 删除数据库很简单,但是确保数据库没有自己需要的数据。
    • 删除数据库之后,对应的文件也被删除。
  • 创建表

    • 基本语法:create table mytable(字段名 字段类型。。。。。。);
    • 复制已有的表结构
    --创建一个表,将数据表挂到数据库下。不需要进入数据库
    create table mydatabase.class(
      name varchar(10)
    );
    -- 或者在创建表之前,先进入要创建表的数据库。
    
    • 表选项
      • Engine,存储引擎,mysql提供的具体存储数据的方式,默认有一个imnodb(5.5以前默认是myisam)
      • Charset:字符集,只对自己的表有效(级别比数据库高)
      • collate:校对集,也是指对自己有效。
    --使用表选项
    create table student(
      name varchar(10)
    )engine [=] innodb/myisam charset utf8 collate;
    
    create table student(
      name varchar(10)
    )charset utf8;
    
    • 复制已有表结构的基本语法

      • create 新表名 like 表名;

        create Newtable like Oldtable;
        --只复制结构,不复制数据
        --只要使用 数据库.表名。就可以在任意的数据库下使用其他数据库的表
        create table teacher like Mydatabase.teacher;
        -- 从Mydatabase2底下整的一个表
        
    • 显示数据表

      • 每当一张数据表创建,那么就会在对应的数据库下创建一些文件(与存储引擎有关与innodb有关。innodb所有的文件都在外部的ibdate1文件里边,里边存储所有的innodb对应的表数据)

      • 显示所有表

        show tables;
        --查找当前数据库所有的表
        show tables like '匹配的数据表'
        --查找一个表,可以模糊,也可以精确。
        
      • 显示表结构

        --本质含义:显示表中所包含的字段信息(名字,类型,属性)
        Describe teacher;
        Desc teacher;
        show columns from teacher;
        
      • 显示表的创建语句

        1.看到的语句,是被系统加工过的语句。

        show create table teacher;
        --查看teacher表的创建的语句。
        

        !!!!!!!!!!!!

        //mysql中的多种语句结束符
        //    ';' & '\g' & '\G'
        //前两个效果是一样的,字段在上排横着,下面跟对应的数据。
        // '\G' 字段在左边竖着, 数据在右边横着,旋转90°。
        
      • 设置表的属性

        • 表属性指的就是表的选项,engine , charset 和 collate。

        • 基本语法:alter table 表名 表选项 [=];

          -- 修改表选项
          alter table tearcher charset utf8;
          -- 如果数据库已经确定,有很多数据,就不要轻易修改表选项了。
          
      • 修改表的结构

        • 修改表名

          --修改数据库表名,通常有前缀。取数据库前面的两个字母加上下划线
          rename table tercher to my_tercher;
          
        • 修改字段

          --新增字段(默认是加到表的最后面)
          --西段位置:字段想要存放的位置
          --First :放到表的第一个字段;
          --After 字段名: 放到字段名之后的字段。
          alter table my_teacher add column age int; 
          
          --修改字段名
          alter table my_teacher change 字段名 新字段名 新字段类型【列属性】【新位置】;
          
          --修改字段类型,修改类型。
          alter table my_teacher modify name varchar(20);
          
          --删除字段
          alter table my_teacher drop name;
          
        • 删除表结构

          --删除表结构, 可以一次删除多个表结构。
          drop table 表名1,表名2.....;
          
          

数据操作

  1. 插入操作

    --1.插入数据导数据表
    insert into tablename(name,age) values('jack',30);
    --后面的值列表,与前面的字段列表对应就可以。
    insert into tablename(age,name) values(49,'jak');
    --字段列表不一定有所有的表中字段
    
    --2. 向表中所有字段插入数据
    insert into tablename values('jack',30;
    --值列表必须与表的字段列表对应。否则会出错。因为没有指定字段列表。
    
    1. 数据的操作
    -- 1. 查询操作
    
 --查询表中所有数据:
 select * from my_teacher;
 --查询表中部分字段:
 //字段列表使用逗号隔开
 select name from my_teacher;
 --简单的条件查询:获取年龄为30岁的人
 select name from my_teacher where age = 30;

 -- 2. 删除操作
 delete from tablename [where 条件];

 --删除年龄为30岁的
 delete from my_teacher where age = 30;

 -- 3. 更新操作
 update tablename set 字段名 = 新值 [where 条件];
 --将数据进行修改(修改部分字段)

 ```

字符集

​ 1.字符编码概念

​ 各种文字符号的总称,字符编码:是计算机针对各种符号,在计算机中的一种二进制存储代号。(ASCII, GB2312, BIG5, GB18030, Unicode, 等等)

​ 2.设置mysql 的字符集

​ 问题:

​ 通过mysql.exe 来操作 mysqld.exe。

​ mysql.exe将数据传入mysqld.exe来执行。
mysql.exe将数据传入的时候,没有告知其对应的符号规则(字符集),而mysqld.exe也没有能力自己判断,就会使用自己默认的一个字符集。

​ 解决:

​ mysql.exe告知mysqld.exe自己的字符集。

--设置字符集 , mysql.exe 和 mysqld.exe之间的处理关系有三层
-- 客户端传入数据给服务器:client: character_set_client 
-- 服务器返回数据给客户端:server: character_set_results
-- 客户端与服务器之间的链接: connection: character_set_connection
set names gbk;//一次性打通三层关系的字符集,使三层的字符集变得一致。
--set names gbk; 相当于set character_set_client = gbk; \set character_set_results = gbk;\set character_set_connnection = gbk; 
show variables like 'charaoter_set——%'
-- 重新打开一个客户端即可得知正确性。

--修改变量
set character_set_client = gbk;
set character_set_results = gbk;
--容易导致一个牛头不对马嘴的问题。传入正确,查看乱码。

字段类型(列类型)

1.整数类型

  • Tinyint

    迷你整形,采用一个字节来保存的整形,表示范围 0 ~ 255

  • smallint

    小整形,采用两个字节来保存的整形,表示范围 0 ~ 65535

  • Mediumint

    中整形,采用三个字节来保存的整形

  • INT

    整形,采用四个字节来保存的整形,表示范围 -2147483648 ~ 2147483647

  • Bigint

    大整形,采用八个字节来保存的整形

--创建一个INT表
create table my_int(
    int_1 tinyint,
    int_2 smallint,
    int_3 mediumint,
    int_4 int,
    int_5 bigint
)charset utf8;

-- 插入合理数据
insert into my_int values(10,100,100,10000,100000);
--且默认整形有负数。
--实际应用根据对应的数据范围来选择相对应的整形数据
alter table my_int add int_6 tinyint unsigned first;
--插入无符号整形
insert into my_int values(255,10,100,100,10000,100000);
--指定字段长度(在表中添加)
alter into my_int add int_7 tinyint(2) zerofill first;

可以指定字段长度,不会改变字段能表示的数据大小。低于长度自动补充。时间等应用。

2.小数类型

​ mysql 将小数分为两种类型,浮点型和定点型。

​ 浮点型:又称精度类型,是一种可能丢失精度的数据类型,数据有可能不那么准确(尤其是超出范围)

  • float

    • 单精度类型,4字节。数据范围 10的38次方。只能保证7个左右的精度。

      Float : 表示不指定小数位的浮点位。
      float(M,D)表示一共存储M个有效数字,其中小数部位占D位。
      Float(10,2):整数10位,小数2位。
      

  • double

    • 双精度类型:8字节,数据范围为10的308次方。精度15位左右。
  • 定点数:能够保证精确的小数(小数部分可能不精确,超出长度四舍五入),整数部分一定精确。

  • decimal

    • decimal定点数: 系统自动根据存储的数据来分配空间,大概9个数字就会分配四个字节来进行存储,同时小数和整数部分是分开的。

      Decimal(M,D):M表示总长度,最大值不能超过65,D代表小数部分长度,最长不能超过30.
      --创建表,和浮点数比较。
      create table my_decimal_1(
          f1 float(10,2),
          d1 decimal(10,2)
      )charset utf8;
      --插入数据
      insert into my_decimal values(12345678.90,12345678.90);
      --第二组
      insert into my_decimal values(9999999.99,99999999.99);
      --尝试定点数四舍五入。
      insert into my_decimal values(9999999.99,99999999.999);
      --定点数如果整数部分进位超出长度也会报错。
      

--创建一个浮点类型的表
create table my_float(
    f1 float,
    f2 float(10,2)
)charset utf8;
--存入数据
insert into my_float values(123.123,12345678.90);
--存入数据,超出大小。会报错。
insert into my_float values(123.123,123456789.90);
--用户不能直接插入数据超过长度,但是系统自动进位会发生。
--浮点数可以插入满足科学计数法的浮点数

3.时间日期类型

  • Date:日期类型,系统使用三个字节存储数据,对应的格式为YYYY-mm-dd能表示的范围为1000-01-01到9999-12-12,初始值为0000-00-00

  • Time:时间类型,能够表示某个指定的时间,系统使用三个字节存储数据,对应的格式为HH:MM:SS,但是mysql的time表示时间的范围大的多,能表示从-838:59:59~838:59:59。在mysql的具体用处为用来描述时间段

  • datetime:日期时间类型,将date和time联合起来。使用8个字节存储数据。对应的格式为YYYY-mm-dd HH:MM:SS。表示的区间为:1000-01-01 00:00:00到9999-12-12 23:59:59.可以全为0.

  • timestamp:时间戳,从格林尼治时间开始,时间的格式为datetime

  • Year:年类型:占用一个字节来保存,能表示19002155年。year有两种数据插入方式:099和 四位数的具体年。

    --创建一个时间类型的数据表
    create table my_date(
      d1 date,
        d2 time,
        d3 datetime,
        d4 timestamp,
        d5 year
    )charset utf8;
    --插入数据
    insert into my_date values(
    '1900-01-01','12:12:12','1900-01-01 12:12:12','1999-01-01 12:12:12','58'
    );
    --year可以采用两位数的插入,也可以采用四位数的插入。
    --year进行两位数的插入的时候,有一个区分点。69 和 70
    --输入69 以及 69 以下。year 为 2000+
    --输入70 以及 70 以上。 year 为 1900+
    --timestramp会自动修改,只要对应的记录被修改。
    --time可以插入一个时间段。
    --也可以插入一个简单的日期来代替时间,在时间格式之前加一个空格,然后指定一个数字:系统会自动将该数字转换为天数*24小时,再加上后面的时间
    --对于这个我们也是醉了。
    

    PHP中有着十分强大的时间日期转换函数,:date将时间戳转换为想要的格式,strtotime又可以将很多的格式转换为对应的时间戳。PHP通常不需要数据库来版主处理这么复杂的时间。所以通常配合PHP时间的保存使用时间戳,从而用整形来操作。

4.字符串类型

  • char : 定长字符,指定长度之后,系统一定会分配指定的空间用于存储数据。char(L)L代表长度,中英文一样。L的范围为0~255

  • varchar:变长字符:指定长度后,系统根据实际存储的数据来计算长度,分配合适的长度,(数据没有超出长度)。varchar(L)。L的长度理论上为0~65535

    因为varchar要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar数据产生后,系统都会在后面增加1~2个字节的额外开销,适用于保存数据所招用的空间长度。如果数据本身小于127个字节:额外开销一个字节:如果大于127个,就开销两个字节。

    存储数据 char(2) varchar(2) char所用字节 varchar所用字节
    A A A 2*3=6 1*3+1=4
    AB AB AB 2*3=6 2*3+1=7

    区别

    char varchar
    使用指定空间 根据数据来定空间
    查询效率高 查询效率低

    定长使用char。

    不确定数据到底有多少,使用Varchar。

    数据长度超过255个字符,不论是否固定长度,都会使用text。不再使用char和varchar。

  • text:文本类型,mysql提供了text普通的字符文本,

    --系统提供了四种text
    --tinytext:系统使用一个字节保存,实际能够存储的数据为:2的八次方+1
    --text:系统使用两个字节保存,实际存储为:2的十六次方+2
    --mediumtext:使用三个字节保存,实际存储为2的二十四次方+3
    --longtext:使用四个字节保存,实际存储为:2的三十二次方+4‘
    --系统会自动根据存储的数据长度来选择合适的文本类型。
    --选择字符存储的时候,数据超过255字符,一定选择text存储。
    
    

  • blob:存储二进制的文本,一般都不会使用Blob通常使用一个链接指向对应的文件本身。

  • enum:枚举类型。在数据插入之前,先设定几个项,这几个选项就是可能出现的数据结果。

    如果确定某个字段的数据只有那么几个值,如性别:男,女,保密。系统就可以在设定字段的时候规定当前字段只能存放几个固定值,使用枚举。

enum(数值1,数值2,数值。。。。。。)
--创建表
create table my_enum(
  gender enum('男','女','保密')
)charset utf8;
--插入数据
insert into my_enum values('男');
--插入数据只能插入枚举里边的类型
--枚举有规范数据的功能。
--查询,以数字查询
select * +0 from my_enum;
--enum存储的时候,存储的对应的数值。
--插入的时候可以插入对应的数值。
枚举的意义
节省空间 规范数据

  • set:集合。是一种将多个数据选项可以同时保存的数据类型,本质是将指定的二进制来进行控制。1表示该选项被选中,0表示该选项没有被选中。

    基本语法:set(’值1‘,。。。。)

    1个字节:set有8个选项。

    2个字节:set有16个选项

    3个字节:set有24个选项。

    8个字节:set有64个选项。

    set里边的值最多64个。

    --创建一个set表
    create table my_set(
      hobby set('篮球','冰球','羽毛球')
    )charset utf8;
    --插入数据
    insert into my_set values('羽毛球,篮球,冰球');
    --系统将对应的数据选项,按照顺序进行编排,从第一个开始进行占位,每一个都对应一个二进制。
    --存储的时候,插入了set里边的值,对应位置用二进制表示1,否则,表示0
    --查看数据,按照自动转换为数值来查看(以数值方式来查看)
    select hobby + 0 from my_set;
    --同样的可以插入数值来表示我们的数据。
    

set的意义
规范数据 节省空间

5.mysql的记录长度

  • mysql的记录长度(record == 行 row)总长度不能超过65535个字节

    varchar能够存储的理论值为65535个字符:字符在不同的字符集下可能占用多个字节。

--创建表:证明varchar在mysql中能够达到的理论值(utf8和gbk)
--varchar的存储特点:除去必要的数据部分,还有额外的保存长度的字节。
create table my_maxvar(
    name varchar(65535)
)charset utf8;--会提示错误。
create table my_maxvar(
    name varchar(21844)
)charset utf8;--会提示错误
create table my_gbk(
    name varchar(32766)
)charset gbk;--会提示错误

6.列属性

​ 列属性又称字段属性,在mysql中一共有6个属性:NULL,默认值,列描述,主键,唯一建,自动增长。

  • NULL属性:代表字段为空,如果对应的值为YES,表示该字段可以为NULL

    注意
    在设计表的时候,尽量不要让数据为空
    mysql的记录长度为65535个字节,如果一个表中有字段允许为NULL,那么系统就会设计保留一个字节来存储NULL,最终有效存储长度为35534个字节
  • 默认值:

    Defalut:默认值,当字段被涉及的时候,如果允许默认条件下,用户不进行数据的插入。那么就可以使用事先准备好的数据来填充,通常填充的是NULL

--创建数据表
create table my_de(
    name varchar(20) not null,
    age int default 18
)charset utf8;
--插入数据,先使用set names gbk;保证编码统一。
insert into my_de(name) values('马华腾');
insert into my_de values('jack',default);
  • 列描述:comment,是专门用于给开发人员进行维护的一个注释说明。

    create table my_co(
      name varchar(10)not null comment '当前不能为空'
    )charset utf8;
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容