Mysql
数据库:按照数据结构来组织、存储和管理数据的仓库。分为关系型数据库,非关系型数据库。
关系型数据库:通过表和表,行和列之间的关系管理数据。如:Mysql、Oracle、Sql Servcer。
非关系型数据库:Redis(键值(Key-Value)存储数据库)、MongoDB(面向集合存储,json类型)。
MySQL 是一个关系型数据库管理系统。
Mysql数据类型
数值类型
TINYINT 1 byte
SMALLINT 2 bytes
INTEGER 4 bytes
BIGINT 8 bytes
FLOAT 4 bytes
DOUBLE 8 bytes
DECIMAL (字符串存储的整数类型,精度缺失)
字符串类型
CHAR VARCHAR BLOB(二进制形式) TEXT
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据
日期类型
DATETIME YYYY-MM-DD HH:MM:SS
TIMESTAMP 时间戳
引擎
设置引擎的方式
-- 方式一:
修改配置文件my.ini
将mysql.ini另存为my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB
-- 方式二:
在建表的时候指定 ENGINE=InnoDB
字符集及排序规则
-- utf8_general_ci 大小写不敏感
-- utf8_general_cs 大小写敏感
-- utf8_bin 规定每个字符串用二进制编码存储,区分大小写,可以直接存储二进制的内容
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
操作数据库
创建
CREATE DATABASE IF NOT EXISTS tmy;
使用
USE tmy;
查询
SHOW DATABASES;
删除
DROP DATABASE IF EXISTS tmy;
操作数据表
创建表
CREATE TABLE IF NOT EXISTS `tmy`(
`id` INT(8) NOT NULL COMMENT '学号',
`name` VARCHAR(20) NOT NULL COMMENT '姓名',
`sex` VARCHAR(2) NOT NULL DEFAULT('1') COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '生日',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
删除表
DROP TABLE IF EXISTS `test`;
修改表
-- 修改表名称
ALTER TABLE `tmy` RENAME AS `tian`;
-- 显示表结构
DESC `tian`;
-- 添加表字段
ALTER TABLE `tian` ADD `age` INT(3);
-- 修改表字段
ALTER TABLE `tian` CHANGE `age1` `age` INT; -- 修改字段名
ALTER TABLE `tian` MODIFY `age` VARCHAR(3); -- 修改约束
-- 删除表字段
ALTER TABLE `tian` DROP `age`;
操作数据
外键
-- 关联表
CREATE TABLE IF NOT EXISTS `address`(
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- 关联字段
ALTER TABLE `tmy` ADD `address` INT;
-- 添加外键约束
ALTER TABLE `tmy`
ADD CONSTRAINT `FK_ADDRESS` FOREIGN KEY(`address`)
REFERENCES `address`(`id`);
插入数据
INSERT `address`(`name`) VALUES ('河北'),('北京'),('上海');
更新数据
UPDATE `address` SET `name`='天津' WHERE `name`='上海';
删除数据
DELETE FROM `address` WHERE `name` in('湖北','上海');
-- 全部删除
DELETE FROM `address`;
TRUNCATE TABLE `address`;
-- DELETE可以、TRUNCATE
-- 相同点:都能清空数据
-- 不同点:
-- TRUNCATE无法清空有外键关系表的数据,DELETE可以
-- TRUNCATE清空自增(重置),DELETE不一定(不重启数据库不重置;重启数据库:InnoDB重置,MyLSAM不重置)
-- 原因(?这个东西?):InnoDB存储再内存中,MyLSAM存储在文件中
查询数据
-- 去重
SELECT DISTINCT(`name`) FROM `address`;
-- 内连接
inner join A and B: 两张表中都有的数据才会显示
-- 外连接
left join A -> B: 主全显,后看on
right join A <- B: 主看on,后全显
full join A <-> B: A和B的并集
-- 交叉连接(笛卡尔连接)
cross join 返回两个集合的笛卡尔积
-- 子查询、嵌套查询
SELECT b.* from shopping as a,shopping as b where a.name='惠惠' and a.price<b.price order by b.id2018-03-06
注意:1、2相同;3、4相同
1:select s.ename '姓名', f.ename '领导' from emp f, emp s where f.empno=s.mgr;
2:select s.ename, f.ename from emp s inner join emp f on f.empno=s.mgr;
3:SELECT e.ename,(SELECT ename FROM emp d WHERE d.empno=e.mgr) AS boss FROM emp e;
4:select s.ename, f.ename from emp s left join emp f on f.empno=s.mgr;
-- 分页
limit 0,5(0:第一页, 5:每页5条数据),要和 order by (desc倒序,asc正序)配合使用
-- 分组
group by() having 条件
常用函数
-- 数学运算
abs() -- 绝对值
celling() -- 向上取整
floor() -- 向下取整
band() -- 0-1之间随机数
sign(-10) -- 0:0,负数:-1,整数:1
-- 字符串函数
char_length('asdf') -- 字符串长度
concat('a','s','c') -- 拼接字符串
insert('我瘦了',2,3,'真的') -- 插入字符串(2第几位,3长度)
lower('ABC') -- 转小写
upper('abc') -- 转大写
replace('aaaaddd', 'a', 'd') -- 替换a为b
substr('1234',2,3) -- 截取('234')
reverse('4321') -- 反转
聚合函数
-- count():计数
count(id)>count(1)>count(*) :前提id有索引(count(1)会忽略空值)
-- sum():求和
-- avg():平均数
-- max(): 最大
-- min():最小
MD5函数
MD5();