基本操作:
创建库
create database if not exists tlxy default charset=utf8;
创建表
create table 表名(字段名,类型,【字段约束】,。。。)表引擎;
修改表结构
语法格式:alter table 表名 action (更改的选项)
修改表引擎语句
alter table users engine = 'myisam';
删除表 drop table 表名
数据类型
字符串:
char(x)定长字符串 varchar(x)变长 text()最大64k的变长文本 tinytext...
enum('男','女'....) :接受最多64k个串组成的一个预定集合里面的某个串.
数值类型:
所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号(只能存储正.使用UNSIGNED关键字)
int: 4字节 int(4) 没有意义,默认无符号的int为int(11),有符号的int(10)
只有当给int类型设置有前导零时,设置int的宽度才有意义如int(4) unsigned zerofill
tinyint:1字节8位 smallint bit:位字段 1-64位
double float decimal(5, 2):精度可变,这里表示数值总共5位, 小数占2位
日期
datetime 8字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
二进制
一些字段约束
- not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
- default 设置默认值
- primary key 主键不能为空,且唯一.一般和自动递增一起配合使用。
- auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
- unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度
运算符
like: 支持特殊符号%和_ ;
主键
表中每一行都应该有可以唯一标识自己的一列,不更改,可以用自增整数类型
Mysql数据库表引擎与字符集
存储引擎以前叫做表处理器,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
MyISAM和InnoDB表引擎的区别:
1.MyISAM不支持事务,而InnoDB支持。
事务由一个或多个sql语句组成一个整体,如果所有的语句执行成功那么修改将会全部生效,如一条sql语句将销量+1,下一条再+1,倘若第二条失败,那么销量将撤销第一条sql语句的+1操作,只有在该事务中所有的语句都执行成功才会将修改加入到数据库中。
2.存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。
- .frm文件存储表结构。
- .MYD文件存储数据。
- .MYI文件存储索引。
InnoDB:主要分为两种文件进行存储 - .frm 存储表结构
- .ibd 存储数据和索引 (也可能是多个.ibd文件,或者是独立的表空间文件)
3.MyISAM:只支持表级锁,InnoDB:支持事务和行级锁,是innodb的最大特色。
4.MyISAM:允许没有任何索引和主键的表存在.InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键。
5.MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。InnoDB:没有保存表的总行数(只能遍历)
- CURD操作
MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表.
7.外键MyISAM:不支持.InnoDB:支持
8.查询效率MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
9.MyISAM和InnoDB两者的应用场景:
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。现在默认使用InnoDB。
增删改查
格式: insert into 表名[(字段列表)] values(值列表...);增
insert into stu(id,name,age,sex,classid)values(1,'zhangsan',20,'m','lamp138');
insert into stu value(null,'wangwu',21,'w','lamp138');
mysql> insert into stu values
-> (null,'zhaoliu',25,'w','lamp94'),
-> (null,'uu01',26,'m','lamp94');
格式:update 表名 set 字段1=值1,字段2=值2,字段n=值n... where 条件改
update stu set age=35,sex='m' where id=11;
格式:delete from 表名 [where 条件] 删
delete from stu where id=100;
查询
select 字段列表或* from 表名
[where 搜索条件] (注意and优先级高于or)
[group by 分组字段 [having 分组条件]]
[order by 排序字段 排序规则] (Asc 升序,默认;desc降序)
[limit 分页参数] (limit n 提取n条数据; limit m,n 跳过m跳数据,提取n条数据
)
like用法:
使用 % 模糊搜索。%代表任意个任意字符
查询name字段中包含五的 :select * from users where name like '%五%';
查询name字段中最后一个字符 为 五的 : select * from users where name like '%五';
查询name字段中第一个字符 为 王 的 :select * from users where name like '王%';
使用 _ 单个的下划线。表示一个任意字符,使用和%类似,用两个就是两个字符
-- 查询表中 name 字段为两个字符的数据 : select * from users where name like '_';
查询 name 字段最后为五,的两个字符的数据:select * from users where name like '_五';
聚合函数max(),min(),count(),sum(),avg()
-- 统计 users 表中的数据量:select count(*) from users;
-- count(*) 是按照 users表中所有的列进行数据的统计,只要其中一列上有数据,就可以计算
-- count(id) 是按照指定的 id 字段进行统计,也可以使用别的字段进行统计,
-- 但是注意,如果指定的列上出现了NULL值,那么为NULL的这个数据不会被统计
分组 select classid,count(*) as num from users group by classid having num >=5;