MySQL基础
开始
1、初始化
- 打开终端 cd到安装目录
- 输入
/bin/mysqld --initialize--insecure--
2、启动服务端
- cd到安装目录
- 输入
/bin/mysqld
添加环境变量后 直接敲
mysqld
即可启动
3、客户端链接
mysql -u root -h 192.168.1.12 -p
-h 可输入服务端IP进行链接。此lP默认值在安装时会让你设定,如使用-f强制安装则密码为空。
创建数据库相关命令
命令 | 解释 | 备注 |
---|---|---|
show databases; | 查看数据目录 | |
show variables; | 查看数据库的所有变量 | |
create database db1; | 创建一个数据库db1 | |
show variables like ‘%character%‘ | 查看跟编码有关的变量 | |
create database db1 CHARACTER SET utf8 | 创建支持‘utf-8的数据库 | |
alter database db1 CHARACTER SET utf8 | 将数据库修改为默认支持utf-8 | |
alter variables character_set_database CHARACTER SET utf8; | 将数据库修改为默认支持utf-8 | 修改变量的方式 |
use db1; | 使用数据库 | |
CREATE ‘user1‘@‘%‘ IDENTIFIED BY ‘password‘ | 创建用户并设定其允许登录的IP地址 | localshost为本机登录,%为所有ip均可登录 |
grant select,drop,delete,update,create,insert on db1.* to ‘user1‘@‘%‘; | 授权用户权限 | 其中_select,drop,delete,update,create,insert_为权限名称 |
revoke select on db1.* from user1; | 收回权限 | |
GRANT ALL PRIVILEGES ON db1. TO ‘username’@‘%’ IDENTIFIED BY ‘password’; | 赋予所有权限 | ALL PRIVILEGES意为所有权限 |
FLUSH PRIVILEGES; | 刷新权限 | 修改后立即启用 |
alter table student rename person; | 表改名 | student 改成 person |
数据格式
数字
类型 | 解释 | 备注 |
---|---|---|
tinyint | 微整型 | 范围有负数: -177 ~ 178 无负数: 0 ~ 255 |
int | 整型 | |
bigint | 大整型 | |
float | 浮点 | 不准确,会省略一定位数后的数值 |
double | 双精度小数 | |
decimal(10,5) | 十进制多精度小数 | 总长度,保留小数后几位,最大精度38 |
字符
类型 | 解释 | 备注 |
---|---|---|
char(10) | 固定长度字符 | 固定长度,不足填充空数值,查找快 |
varchar(10) | 长度可变字符 | 可变长度,节省空间 |
text | 文本 | |
longtext | 长文本 | |
emum(‘a‘,‘b‘,‘c‘,‘d‘) | 枚举 | abcd任选其一 |
set(‘a‘,‘b‘,‘c‘,‘d‘) | 组合 | abcd选n个做组合 |
日期
类型 | 解释 | 备注 |
---|---|---|
date | 日期 | |
time | 时间 | |
year | 年 | |
datetime | 日期及时间 | |
timestamp | 时间戳 | 日期时分秒。从1970年1月1日 00:00:00 开始的秒数总和 |
创建表
字段名+类型+是否允许空+是否自增+是否主键
create table t1(
id int not null auto_increment primary key,
name char(10),
class_id int not null,
constraint xx_xx_id_pk foreign key(class_id) references class(cid)
)ENGINE=innodb DEFAULT CHARSET=utf8
auto_increment 为自增ID
primary key为主键
ENGINE使用innodb可以实现错误时回滚数据
mysql的存储引擎有哪些?以及各自的使用场景?
旧版本默认为MyISAM、新版本(5.5以后)为InnoDB。
MyISAM有较高的插入,查询速度,但不支持事务,适用于评论,发信息等不太注重数据安全性的业务 。
InnoDB为事务型数据库的首选引擎,支持ACID事务,支持行级锁定,适用于转帐等需要保证数据安全的业务
常用操作
插入数据
INSERT INTO course(cname,teacher_id) VALUES(‘生物‘,1),(‘体育‘,1),(‘物理‘,2);
查找数据
SELECT * FROM score;
删除数据
DELETE FROM student WHERE sid BETWEEN 4 AND 6;
修改数据
UPDATE course SET teacher_id=6 WHERE cid=1;
限制数量查找——limit
select * from t1 where name=yang limit 10,5; # 从第10个开始,选5个
查看自增ID
-- 查询及修改AUTO_INCREMENT起始值
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name="student";
ALTER TABLE student AUTO_INCREMENT=1 ;
有四种方法, 参考资料: http://blog.csdn.net/haiross/article/details/50456112
查看表的详细信息
desc table_name
查看约束关系
- 全部:
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
- 精简版:
select TABLE_NAME,CONSTRAINT_NAME,COLUMN_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
联合主键
即两个字段值可重复出现,但只有同一种组合
primary key(uid, name)
constraint pk_id_name_uid_uname foreign key(uid,uname) references useinfo(id,name)
外键 ——FOREIGN KEY
- 添加外键
先在本表设好用来关联外部的字段,然后通过约束constraint 指向外部表
语法:
alter table 从表 add constraint 外键名称(形如:FK从表主表) foreign key 从表(外键字段) references 主表(主键字段);
student_id int not null,
constraint fk_cos_sco_cid FOREIGN KEY(course_id) references course(cid) on update on delete
- 删除外键:
alter table 表名 drop foreign key 外键名称
DELETE FROM student WHERE sid BETWEEN 4 AND 6;
TRUNCATE TABLE student
- on update 和 on delete
关系约束后面可以跟的词语有四个no action
, set null
, set default
,cascade
no action -- 表示不做任何操作,
set null -- 表示在外键表中将相应字段设置为null
set default -- 表示设置为默认值
cascade -- 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除
一对一:一个外健只能对应一个外键
使用 foreign key + unique
多对多:双方均对应对方的多个外键
新建一张xxx关系表
用关系表的外键导入源表的ID
索引——INDEX
任何加入索引的行为就是加速查找
- 主键索引
规定该字段为唯一非空的主键,加速查找
- 唯一索引
唯一——UNIQUE
规定该字段为唯一字段,不能有重复项,可以为空
unique ul_uq(uid)
unique ul_uq(uid,name) # 联合索引
# 修改表的唯一约束
alter table t_user
add constraint user_name_un
unique(name);
分组——GROUD BY
select uid,count(id) as count from t1 group by count(id) having count(id)>5
group by
结果下再筛选必须用having
- 常用聚合函数
函数名 | 解释 | 备注 |
---|---|---|
count | 数符合条件的数据条数 | 常用形式count(1),效果与count(xx)一样但效率更高 |
max | 求最大数 | |
min | 求最小数 | |
sum | 求总数 | |
avg | 求平均数 |
表链接
- 左链接表(以table1包含的项为准)
SELECT student.sname,score.mark
FROM score
LEFT JOIN student
ON score.student_id=student.sid;
- 右链接表(以table2包含的项为准)
SELECT student.sname,score.mark
FROM score
RIGHT JOIN student
ON score.student_id=student.sid;
- 多表连接
SELECT student.sname,course.cname,score.mark
FROM score
LEFT JOIN student
ON score.student_id=student.sid
LEFT JOIN course
ON score.course_id=course.cid;
- INNER JOIN
关键字在表中存在至少一个匹配时返回行。如果LEFT JOIN没有匹配,就不会列出这些行。
排序——ODRED BY
ORDER BY DESC # 倒序
ORDER BY ASC # 顺序
临时表
(SELECT * FROM score) AS A
DISTINCT 去重,但效率不高
SELECT DISTINCT student_id FROM score WHERE mark<60
CASE 相当于IF
CASE WHEN num<20 THEN 1 ELSE 0 END
笛卡尔积用法
SELECT * FROM score AS s1,score AS s2
结果为
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3