MySQL基础

Posted lzyang121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL基础相关的知识,希望对你有一定的参考价值。

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 actionset nullset defaultcascade

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

以上是关于MySQL基础的主要内容,如果未能解决你的问题,请参考以下文章

linux中怎么查看mysql数据库版本

从mysql的片段中加载ListView

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

使用 json rereiver php mysql 在片段中填充列表视图

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段