MySQL

一:MYSQL语言分类:

五类,数据查询语言、数据操纵语言、数据定义语言、数据控制语言、事务控制语言。SQL语言适用于所有数据库。 
DQL(数据查询语言):select(查询),凡是select语句都是DQL语言。select语句使用频次占数据库使用语句的80%左右(使用频率超高)。 
DML(数据操纵语言):insert(插入)、delete(删除)、update(更新、更改),主要对“表DDL(数据定义语言):create(创建)、drop(删除)、alter(更改)。主要对“表结构”进行增、删、改。 例如:对表中的某个字段进行增、删、改,或者改变表字段的类型等。一般表结构在数据库开发时就确定了,后期很少修改。 
DCL(数据控制语言):grant(授权)、revoke(撤销)。主要是创建用户,对用户进行授权。
TCL(事务控制语言):commit(提交事务)、rollback(回滚事务)。 transaction(事务),事务是一个最小的工作单元,不可再分。只有DML语句(insert、delete、update)中才有事务,其它语句和事务无关。

二:创建表&修改表&删除表

创建表(create  table) 第一步:打开使用的数据库,语法为:use   数据库名; 第二步:创建表,语法为:create   table   表名 (字段名1   数据类型   primary  key,字段名2   数据类型,字段名3   数据类型,..............); 第三步:查看表结构,语法为:desc  表名; 
修改表(alter  table) 第一步:查看表结构,命令为:desc  表名; 第二步:修改表。 1.修改表名语法为:alter   table  <原表名>  rename  to  <新表名>; 
修改字段名语法为:alter  table   <表名>  change  <原字段名>  <新字段名>  <新字段数据类型>;
修改字段数据类型语法为:alter  table   <表名>  modify   <字段名>   <字段数据类型>;
添加字段语法:alter  table   <表名>  add   <字段名>   <字段数据类型>; 
删除字段语法:alter  table   <表名>  drop  <字段名> ; 
添加外键约束语法:alter  table   表名  add  constraint  外键名称  foreign  key(外键字段名)  references  对应主键所在表 (主键字段名);
删除外键约束语法:alter  table   表名  drop  foreign  key(外键名称); 
删除表(drop  table) 删除单个表:drop  table  表名; 删除多个表:drop  table  表1名,表2名,表3名.......; 
显示数据库编码格式:show  variables  like 'char%';    
修改数据库字符集及校对规则:Alter  database  数据库名  Default  Character  set utf8  Collate utf8_general_ci; 
修改表中的字符集及校对规则:Alter  table  数据表名 Default  Character  set  utf8  Collate utf8_general_ci; (注:此句把表默认的字符集和所有字符列改为新的字符集) 数据约束:目的是保证表中数据的合法性、完整性、有效性。 
常见的约束: 1.非空约束(not null):字段不能为空。
唯一约束(unique):字段不能重复。 create table  stuinfo(id int(4) primary key, name varchar(20) unique,       #列级约束 namecode  varchar(10) unique,  #列级约束 sex varchar(2),  brithday datetime, phone varchar(13)); create table  stuinfo(id int(4) primary key, name varchar(20) ,     namecode  varchar(20) ,    sex varchar(2),  brithday datetime, phone varchar(13), unique(name,namecode ));    #表级约束 
主键约束(primary key):简称PK,不能为空,也不能重复。 
外键约束(foreign key):简称FK。 5.检查约束(check),mysql中没有,不支持该约束。但是Oracle数据库中有check约束。

三:增加索引&限制条件索引&删除索引

索引作用:用来提高数据查询速度,提高查询时效。同时可以提高多表之间的连接速度。 
索引类型:
    ①:primary key  主键索引(自动创建一个聚簇索引);②:fulltext 全文索引;③:normal 正常索引;  ④:spatial 空间索引;⑤:unique  唯一索引;⑥:复合索引(即给多字段添加一个索引)。 
索引方式(即查询方式):
    顺序查找、二分查找、二叉树查找(B-tree)、hash树查找等。
 A.在创建表时创建索引:index   索引名 (字段名  asc/desc)  ;     #普通索引。索引名通常为:字段名_index 举例:index  xh_index(xh  asc)    ;      #xh代表学号  unique  index   索引名 (字段名  asc/desc)  ;     #唯一索引。索引名通常为:字段名_index          举例:unique  index  xh_index(xh  desc);        #xh代表学号 
B.在已经建好的表中创建索引: create  index 索引名 on 表名(字段名  ASC/DESC);    #创建单个字段索引。字段名不允许加单引号。 create  index 索引名 on 表名(字段名1  ASC,字段名2 DESC);     #创建多个字段索引。字段名不允许加单引号。   create  unique  index 索引名 on 表名(字段名  ASC/DESC);         #创建唯一限制条件字段索引。字段名不允许加单引号。
 C.查看索引:
查看一个表中的所有索引:show  index  from 数据库名 . 表名;(或者show  index  from  表名;) 举例:查看学生表中所有详细信息。show  index  from 学生课程 . 学生; 
展示MySQL如何使用索引来处理select语句以及连接表。即只需要在select前面加上Explain。 explain  select  字段名  from   表名  where  字段名='xxx'/xxx;   
添加索引语法:alter  table  表名  add  index  索引名  (字段名1[,字段名2 …]);   例如:alter table employee add index emp_name (name); 
添加主关键字索引语法:alter  table  表名  add  primary  key (字段名);     例如:alter table employee add primary key(id); 
添加唯一限制条件的索引语法:alter  table  表名  add  unique  索引名 (字段名);     例如:alter table employee add unique emp_name(number); 
删除某个索引语法:alter  table  表名  drop  index  索引名;               drop  index  索引名  on  表名;     例如:alter table employee drop index emp_name; 
数据操纵语言(insert\update\delete)  数据定义语言(create) 创建一个学生数据表(stuinfo),包含字段id,name,sex,brithday,phone 
创建表:create   table   表名(字段1  数据类型  约束条件,字段2  数据类型,字段3  数据类型,......);       (举例):create table  stuinfo(id int(4) primary key,name varchar(20),sex varchar(2), brithday datetime,phone varchar(13));       insert into stuinfo (id,name,sex,brithday,phone) values(1,'lilei','男',19830909,'12345678900');    #一次赋值一条数据。                        insert into stuinfo values(2,'malin','男',19830809,'12345678901');     #省略字段名,赋值必须按照字段顺序进行,否则,赋值不成功。        insert into stuinfo (id,name,sex,brithday,phone)        values(3,'rose','女',20000909,'12345678902'),(4,'liyang','女',20011009,'12345678903');      #一次赋值多条数据。                  查询表:select * from  stuinfo;       #查询stuinfo表中所有信息
更新表信息:update  stuinfo set name='adsn' where id=1;       -- 把id=1的名字改为adsn 
删除表信息:delete from stuinfo where id=3; 
删除大表数据(截断,保留字段属性,不可回滚,数据永久丢失,需要谨慎操作): truncate   table   表名; 
复制表:        语法:create  table  表名  AS  select  查询语句;  #将查询结果当着表创建出来。        举例:create  table  www1  as  select   *  from  abc;    #将表abc查询结果当着www1表创建出来。                 create  table  www2  as  select   字段1,字段2,字段3  from  stu00;    #将表stu00中字段1、字段2、字段3查询出来,当着www2表创建出来。  
批量插入数据:语法:insert  into   表名   select  查询语句;  简单查询。select(DQL语言)、AS关键字取别名     1. select  字段1,字段2,.....  from  表名;   #单个字段查询         举例:select  name,  sal*12  from  emp;     #查询emp表中员工的年薪工资 (其中“sal*12”字段是可以参加运算的)         select  name,  sal*12  AS yearsal  from  emp;      #将sal*12字段重新加别名为"yearsal"          或者select  name,  sal*12  yearsal  from  emp;      #将sal*12字段重新加别名为"yearsal",AS关键字可以省略,直接用空格分开           select  name,  sal*12  AS 年薪  from  emp;       #将sal*12字段重新加别名为“年薪“(语法错误,中文汉字未加单引号或双引号)           select  name,  sal*12  AS '年薪'  from  emp;     #将sal*12字段重新加别名为“年薪“(语法正确,即当别名为中文时,汉字须加单引号或者双引号)                注意:(1)在mysql数据库中对字符串使用单引号或者双引号都可以,规范要求使用单引号。因为双引号在Oracle、SQL server等数据库中一般都不能正常执行。           (2)AS关键字可以省略。          2. select  *  from  表名;   #查询表中全部信息(*代表全部信息)。                  注意:实际开发中不建议使用*,因为运行中*要先转换为字段,效率相对较低。         

四:WHERE条件查询

    语法格式:select 字段1,字段2,.... from  表名   where   条件;         举例: select  name, sal  from  emp  where sal >= 3000;   #查询工资大于等于3000元人员          select  name, sal  from  emp  where sal <= 3000;   #查询工资小于等于3000元人员          select  name, sal  from  emp  where sal <> 3000;或者  select  name, sal  from  emp where sal != 3000;   #查询工资不等于3000元人员                           
使用比较运算符的条件查询(>、>=、<、<=、!=、<>)        举例:select  *  from  选课  where  成绩<60;      #查询选课表中成绩小于60分的学生信息。               select  班级名称,所属学院  from  班级  where  所属学院!=‘外国语学院’;   #查询班级表中非外国语学院的班级名称和所属学院。        
使用IN操作符的条件查询(in、not in)                举例:select  学号,籍贯  from  学生  where  籍贯   in('湖北武汉','河南郑州');  #查询学生表中籍贯是湖北武汉或者河南郑州的学生学号和籍贯。        
between........and.........操作符条件查询        举例:select  name, sal  from  emp where sal between 1000  and  3000;   #查询工资在1000到3000元之间人员(含1000和3000元人员)                          注意:between........and......... 当取值是数字时,为闭区间取值,且左小右大。当取值是字符串时,为左闭右开区间取值。           like操作符条件查询(属于模糊查询)。 比较字段类型必须是字符串,通配符(“%”或者“_”),“%”可以匹配任意数目的字符,"_”只能匹配单位字符。        举例:select  学号,姓名  from  学生  where  姓名  like  '吴%';      #查询学生表中姓吴的学生的学号和姓名。           select  学号,姓名  from  学生  where  姓名  like  '_吴%';     #查询学生表中第二个字带"吴"的学生的学号和姓名。         select  学号,姓名  from  学生  where  姓名  like  '%\_%';    #查询学生表中姓名带"_"的学生的学号和姓名。         注意:\代表把下划线转化为字符。         
用and或or连接多个表达式         举例:select  学号  from  选课   where  课程='001’and   成绩>90;       #查询选修了001课程且成绩在90分以上的学生学号。          select  学号,课程号  from  选课   where  课程='001’or   课程='002’;     #查询选修了001课程或者002课程的学生的学号和课程号。         
查询结果排序(order by 字段  <asc/desc>)。asc代表升序,desc代表降序。         
举例:select  学号,成绩  from  选课   where  课程='001’or   课程='002’order by  成绩 desc;         #将查询结果降序排列。         select  学号,成绩  from  选课   where  课程='001’or   课程='002’order by  成绩 asc;            #将查询结果升序排列。 
*****ANY&ALL操作符查询 *****  
       嵌套查询中,ANY或ALL操作符必须与比较运算符配合使用。         
>ANY或者>=ANY:大于或大于等于子查询结果集中的某个值,即大于或大于等于子查询结果集中的最小值。         
<ANY或者<=ANY:小于或小于等于子查询结果集中的某个值,即小于或小于等于子查询结果集中的最大值。         注意:用Any取值的时,大于等于取最小值,小于等于取最大值。         >ALL或者>=ALL:大于或大于等于子查询结果集中的所有值,即大于或大于等于子查询结果集中的最大值。         举例:select   学号,年龄  from  学生   where  年龄>=all(select  年龄  from  学生  where  班级='机电2班')         
<ALL或者<=ALL:小于或小于等于子查询结果集中的所有值,即小于或小于等于子查询结果集中的最小值。             注意:用ALL取值的时,大于等于取最大值,小于等于取最小值。  分组函数(也称聚合函数、统计函数),是多行处理函数。               
.所有分组函数都是对“某一组”数据进行操作,都是忽略null。        
.分组函数包含5类:count()  计数;max()  最大值;min()  最小值;avg()  平均值;sum ()总和。        举例: select   count(薪资)   from   emp;      #查询薪资总人数        或者   select   count(*)   from   emp;      #查询薪资总人数               select   max(薪资)   from   emp;      #查询最高薪资                 select   avg(薪资)   from   emp;      #查询最低薪资               select   sum(薪资)   from   emp;      #查询薪资总和        重点注意:只要有null参与的运算,结果一定是null,所有的数据管理系统都是这样规定的。           —— ifnull()函数,可以对null进行预处理,单行处理函数。             格式:ifnull(可能为null的数据,被当做什么处理)。例如:ifnull(comm ,0);         select  ename,ifnull(comm,0)  as  comm  from   emp;       #将comm中null全部转换为0。         select  ename,(sal+ifnull(comm,0))*12  as  yearsal  from   emp;     #查询员工姓名和年薪,comm中null全部转换为0,再与月薪计算。        ——分组函数不能直接使用在where子句中。          select   ename,sal  from  emp  where  sal >avg(sal);      #语法有误,是无效的使用分组函数。         
.count(*)和 count(字段名)的区别         count(*),统计总记录条数,与某个字段无关。         count(字段名),统计字段中不为null的数据总数。        
.分组函数可以组合使用        举例:select  count(*),max(字段名1),min(字段名1),avg(字段名1),sun(字段名1) from emp;       
.分组函数一般都会与group by 联合使用,先运行group by进行分组,再进行函数运算。        举例:select  job,max(sal)  from  emp  group  by  job;       完整的DQL查询语句执行顺序       select    5              字段名1,字段名2       from      1          表名       where     2    执行第一层过滤              
*****       group by  3       字段名       having    4    分组后执行第二层过滤(不可以单独使用,一定要与group by 联合使用。)              
*****       order by  6                 asc/desc        注意:能在where中过滤的数据,尽量在where中过滤,执行效率较高。 having过滤是专门对分组后的数据进行再过滤。       重点规则1:当一条select查询语句中有 group by的话,select后面只能跟分组函数和参与分组的字段。       
举例:select  字段1,字段2,分组函数  from  表名  group  by 字段2;                #在MySQL中执行没有问题,但是没有意义,在Oracle中一定会出现语法错误。        单个字段分组: select  字段1,分组函数  from  表名  group  by 字段1;  
 #正确语法,即分组后面有什么字段,select后面跟什么字段。         多个字段联合分组:select  字段1,字段2,分组函数  from  表名  group  by 字段1,字段2               重点规则2:当一条select查询语句中有 group by***having的话。having是对分组之后的数据再次过滤。having使用必须有group  by,二者是搭档。    (group by可以单独使用,having不可单独使用。)        举例:select  deptno,avg(sal)  from  emp  group  by  deptno  having  max(sal) > 2000;   
*****去重查询  distinct  *****        
distinct 只能出现在查询的所有字段的最前端;其后的所有字段都是联合去重。        举例:select   distinct   ename,job  from  emp;         
*****连接查询 *****      
.内连接(等值连接、不等值连接)         ——等值连接。语法:select  *  from  表1  join  表2  on  表1.字段=表2.字段       #on后面是两个表的连接条件。         注意:此种连接查询,查询结果中存在重复字段。              举例:select  * from  学生  join  课程  on 学生.学号=课程.学号;                 ——自然连接(是一种特殊的等值连接,要求两个表的关联字段必须相同)         注意:此种连接查询,查询结果中去掉重复字段。                   语法:select  *  from  表1  natural   join  表2;         举例:select  *  from   学生  natural  join 课程;         ——不等值连接。实际操作中很少用到,不做详细讲解。     #(即交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积现象,即行数的乘积。)           语法:select  *  from  表1  cross   join  表2;      #cross可以省略。         2.外连接(左连接、右连接 、全连接)left  join\right   join\all  join   (left  outer  join\right  outer  join中的outer可以省略)         (1)左连接,查询结果中保留左表中的未匹配字段。     语法:select  *  from  表1  left  join  表2  on  表1.字段=表2.字段。         (2)右连接,查询结果中保留右表中的未匹配字段。     语法:select  *  from  表1  right  join  表2  on  表1.字段=表2.字段。         (3)全连接,查询结果中保留两个表中的未匹配字段。  mysql中暂时不支持all  join。           
 *****高级子查询 *****        
.带子查询的数据插入(即向表中插入的数据可以来自另一个表)         语法:insert  into  表名  <子查询>;        #表名后面的字段若省略,则子查询的目标列与表中的字段的数目、顺序和数据类型要一致。         举例:insert  into  学生  select  * from  学生  where  性别='男';         ——不等值连接。实际操作中很少用到,不做详细讲解。         2.带子查询的数据修改                  语法:update   表名   set  字段判定条件   where子句 ;          举例:update   课程   set  成绩=成绩*1.1  where  课程号  in(select  课程号  from  课程  where  课程名='大学英语');   #将课程表中“大学英语”课程的成绩提高10%。            3.带子查询的数据删除                  语法:delete   from   表名   where子句 ;          举例:delete   from   课程   where  课程号  in(select  课程号  from  课程  where  课程名='高等数学');   #将课程表中“高等数学”课程的课程记录删除。 

五:存储引擎

.存储引擎只有在MYSQL中存在,(Oracle中有对应的机制,但不叫存储引擎,叫存储方式。)
.MYSQL支持多种存储引擎,每一个存储引擎都对应一种存储方式。每一个存储引擎都有自己的优缺点。        
.查看存储引擎: show engines \g          
.存储引擎有9中,常见的有INnoDB 、MYISAM、MRG_MYISAM、BLACKHOLE 、MEMORY、CSV  、ARCHIVE 、PERFORMANCE_SCHEMA、 FEDERATED。      (1)MYISAM:不默认的存储引擎,有3个文件:xxx.FRM、xxx.MYD、xxx.MYI;存储表结构的文件、存储数据的文件、存储索引的文件。        优点:可压缩、节省存储空间; 缺点:不支持事务。      (2)INnoDB:默认的存储引擎,表结构存储在xxx.FRM文件中;用commit(提交)、rollback(回滚)支持事务处理。        优点:INnoDB存储引擎在mysql数据库崩溃之后,提供自动恢复机制;支持级联更新和级联删除。        ...........        
.MYSQL中默认使用的存储引擎是InnoDB;默认使用的字符集是Utf8。   
*****视图*****
.视图是数据库中根据子模式设计的虚拟表, 数据库中只存放视图定义的语句,其数据存储在对应的表中。        
.用户可以根据个性化的需要,从一个或者多个表中抽取部分字段定义成新的虚拟表(即视图)。        
.视图中的数据依赖于其对应表中的数据,一旦表中的数据发生变化,视图中的数据也会发生变化。        
.视图的作用:简化用户的操作,实现数据库系统的安全性,提高数据的逻辑独立性。        5.视图的创建、删除、更新和查看    
(1)创建视图:create  view  视图名称【字段名列表】 AS  子查询   【with  check  option】       注意:AS不能删除和省略;【】中的内容可以省略。        举例:create   view   jdxy_vi   as   select   *   from   stu00   where   depno='02'  or  depno='03';      
(2)更新视图:update   视图名称   set  字段条件  where  查询条件;        举例:update   jdxy_vi  set  stuname='古天'  where  stuno='2022003';      
(3)删除视图:drop  view  视图名称;  drop  view  视图1名称,视图2名称,....        举例:drop  view   jdxy_view;            drop  view   jdxy_view,xy_view;          (4)查看视图结构:desc  视图名称;        举例:desc   jdxy_vi;      
(5)查看视图:show  tables;    #视图是一个虚拟的表,即查看数据库中表即可。

六:触发器

.触发器是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程。
.触发器的执行不是有程序员调用,而是由事件来触发的。        
.触发器经常用于加强数据的完整性约束和业务规则等。        
.触发器创建语法四要素: 
(1)触发地点(table):触发器对哪个表起作用。      
(2)触发事件(insert、delete、update):对表执行什么操作时触发。      
(3)触发时间(before、after):在表执行操作前还是操作后触发。         
(4)触发器程序体(begin...end):触发后执行的动作。        
.每个表的每个事件每次只允许一个触发器;每个表最多支持6个触发器(before  insert、before  delete、before  update;after  insert、after  delete、after  update)        ——创建触发器:create   trigger   <触发器名>   <after/before >   <insert/delete/update>   on   <表名>   for  each  row  <begin   SQL语句   end >         举例:create  trigger  选课_cfq   after  insert  on   选课    for  each  row   begin  update  学生成绩统计  set  课程数=课程数+1  where  学号=new.学号  end;         说明:for  each  row 一般是指行级触发,对于受触发事件影响的每一行都要激活触发器的动作。               ——查看触发器:show  triggers;        ——删除触发器:drop  trigger  触发器名;    

七:数据库设计三范式

范式概念:规范化的关系模式(Normal Form),是衡量关系模式好坏的一组规则的集合。        范式类型:1NF、2NF、3NF(Third Normal Form,3NF),级别越高,其包含的限制约束条件越严格。             范式作用:减少数据冗余和操作异常情况发生。        规范化过程:一个关系模式规范化的过程,就是将低级别范式的关系模式经过模式分解转换成若干高级别范式的关系模式的集合。          
.第一范式(1NF):任何一张表都应该有主键,并且每个字段原子性不可再分。        
.第二范式(2NF):基于第一范式,所有非主键字段完全依赖于主键,不能产生部分依赖关系。         多对多关系:3张表,关系表中有2个外键。         复合主键:即表中有2个以上的主键(不推荐使用,不符合第二范式标准)。        
.第三范式(3NF):基于第二范式,所有非主键字段直接依赖于主键,不能产生传递依赖关系。             一对多关系:2张表,多的表加外键。       一对一关系:主键共享,外键唯一。        特别提醒:实际数据库开发中,以满足客户的需求为主,有时会以数据冗余换执行速度。 
*****事务***** 
    (transaction)事务存在意义:保障数据的完整性和安全性。        
.一个事务是一个完成的逻辑单元,不可以再分。一个事务是由DML语言的多条指令来联合完成。        .事务必须保障数据的一致性,即事件发生同时成功,或者同时失败,不允许出现一条成功,一条失败。        
.事务只存在于DML语句中(insert、delete、update语句),其它的指令语句与事务无关。        .事务处理流程:           事务开启(开始)—> insert\delete\update操作(不会真正修改硬盘上的数据,只会记录操作历史<即事务性活动的日志文件中>)—>提交或者回滚事务(commit\rollback)。           
(1)事务开启命令: start  transaction;         
(2) commit的作用:提交事务,将事务中所有对数据的更新写回到磁盘上的物理数据库中,事务正常结束;         
(3)rollback的作用:回滚事务,即事务运行发生故障,不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤回,回滚到事务初始状态。        
.事务的特性:ACID。A.原子性、C.一致性、I.隔离性、D.持久性。         A.原子性:事务里面的操作要么都执行,要么都不执行。         C.一致性:事务执行之前和执行之后数据库状态保持一致。         I.隔离性:一个事务的执行不被其他事务干扰。隔离级别有4级,其中mysql数据库中默认的隔离级别是“可重复读”;oracle数据库中默认的隔离级别是“读已提交”。         D.持久性:事务对数据库的该表是永久的。         
.MYSQL中默认操作模式是Autocommit模式,可以通过设置Autocommit的值来开启和禁用模式。
文章作者:摘星怪
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章地址及作者
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇