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
浙公网安备 33010602011771号