基础命令
show databases; --查看当前所有的数据库
use 数据库名; --打开指定的数据库
show tables; --查看所有的表
describe/desc 表名; --显示表的信息
create database 数据库名; --创建一个数据库
exit --退出连接
数据库的操作
- 数据库不存在,创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名;
- 删除数据库
DROP DATABASE [if EXISTS] 数据库名;
- 进入数据库并使用
use 数据库名;
- 查看数据库
SHOW DATABASES;
MySQL的数据类型
数值
| 数据类型 | 描述 | 大小 |
|---|---|---|
| tinyint | 十分小的数据 | 1个字节 |
| smallint | 较小的数据 | 2个字节 |
| mediumint | 中等大小的数据 | 3个字节 |
| int | 标准的整数 | 4个字节 |
| bigint | 较大的数据 | 8个字节 |
| float | 浮点数 | 4个字节 |
| double | 浮点数 | 8个字节 |
| decimal | 字符串形式的浮点数,一般用于金融计算 |
字符
| 数据类型 | 描述 | 大小 |
|---|---|---|
| char | 字符串固定大小 | 0~255 |
| varchar | 可变字符串 | 0~65535 |
| tinytext | 微型文本 | 2^8-1 |
| text | 文本串 | 2^16-1 |
时间日期
| 数据类型 | 描述 | 格式 |
|---|---|---|
| date | 日期格式 | YYYY-MM-DD |
| time | 时间格式 | HH:mm:ss |
| datetime | 最常用的时间格式 | YYYY-MM-DD HH:mm:ss |
| timestamp | 时间戳,1970.1.1到现在的毫秒数 | |
| year | 年份表示 |
表字段的设计规范,一般以下五个字段是必要的 |名称 | 描述 | | ---------- | ---- | | id | 主键 | | version | 乐观锁 | | is_delete | 伪删除 | | gmt_create | 创建时间 | | gmt_update | 修改时间
sql脚本规范
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
- 表和字段名最好用''括起来
- 每一个语句后都要使用,隔开
- 主键声明一般放在最后或者最前,以便于查看
数据库引擎
| MYISAM | INNODB | |
|---|---|---|
| 事务支持 | 不支持 | 支持 |
| 数据行锁定 | 不支持 | 支持 |
| 外键约束 | 不支持 | 支持 |
| 全文索引 | 支持 | 不支持 |
| 表空间大小 | 较小 | 较大,约为2倍 |
外键
A表中的主键是B表的某一字段存在某种关系,但是不一定要同名,建立联系,类型要相同,字段宽度也要一致。例如班级表class中的主键classid和学生表student中的classid就是一种外键关系,其中班级表class被称作主表。
因此主表删除时必须保证所有从表都被删除,否则主表无法被删除。
数据库操作
DML操作
Data Manipulation Luaguge:数据操作语言
insert操作
注意省略字段的这种用法,必须要保证插入的数据和数据表的字段一一对应
-- 普通用法
INSERT INTO `student`(`name`) VALUES ('zsr');
-- 插入多条数据
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('zsr','200024','男'),('gcc','000421','女');
-- 省略字段
INSERT INTO `student` VALUES (5,'Bareth','123456','男','2000-02-04','武汉','1412@qq.com',1);
update操作
-- 修改学员名字,指定条件
UPDATE `student` SET `name`='zsr204' WHERE id=1;
-- 不指定条件的情况,会改动所有表
UPDATE `student` SET `name`='zsr204';
-- 修改多个属性
UPDATE `student` SET `name`='zsr',`address`='湖北' WHERE id=1;
-- 通过多个条件定位数据
UPDATE `student` SET `name`='zsr204' WHERE `name`='zsr' AND `pwd`='200024';
delete操作
-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`;
-- 删除指定数据
DELETE FROM `student` WHERE id=1;
总结
insert语法:INSERT INTO 表名([字段1,字段2..])VALUES('值1','值2'..),[('值1','值2'..)..];
update语法:UPDATE 表名 SET 字段1=值1,[字段2=值2...] WHERE 条件[];
delete语法:DELETE FROM 表名 [WHERE 条件]
DQL查询数据
Data QueryLanguage: 数据查询语言
- 查询SQL模板
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY ...] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 指定查询的记录从哪条至哪条
虚表:查询结果是虚表。
- 普通查询
-- 查询全部学生
SELECT * FROM student;
-- 查询指定的字段
SELECT `LoginPwd`,`StudentName` FROM student;
-- 别名 AS(可以给字段起别名,也可以给表起别名)
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student AS 学生表;
-- 函数 CONCAT(str1,str2,...)
SELECT CONCAT('姓名',`StudentName`) AS 新名字 FROM student;
-- 查询系统版本(函数)
SELECT VERSION();
-- 用来计算(计算表达式)
SELECT 100*53-90 AS 计算结果;
-- 查询自增步长(变量)
SELECT @@auto_increment_increment;
-- 查询有哪写同学参加了考试,重复数据要去重
SELECT DISTINCT `StudentNo` FROM result;
- 条件查询
-- 单一条件查询
select * from A where condition = ?
-- 多条件查询
select * from A where condition1 = ? and condition2 = ?
-- 范围条件查询
select * from A where condition in ('value1','value2',...)
-- 模糊查询,含有某个字符d
select * from A where condition like '%d%'
-- 模糊查询,倒数第2个字符为d
select * from A where condition like '%d_'
- 分组查询
select 分组函数,分组后的字段
from 表
[where 筛选条件]
group by 分组的字段
[having 分组后的筛选]
[order by 排序列表]
| 使用关键字 | 筛选的表 | 位置 | |
|---|---|---|---|
| 分组前筛选 | where | 原始表 | group by的前面 |
| 分组后筛选 | having | 分组后的结果 | group by 的后面 |
相当于说where筛选的是原始的表,但是having筛选的是经过where和group by处理后的虚表
- 连接查询
-- 左外连接
select * from A left (outer) join B on A.key = B.key
-- 右外连接
select * from A right (outer) join B on A.key = B.key
-- 内连接
select * from A inner join B on A.key = B.key
-- 左连接
select * from A left (outer) join B on A.key = B.key where B.key is null
-- 右连接
select * from A right (outer) join B on A.key = B.key where A.key is null
-- 全外连接
select * from A full (outer) join B on A.key = B.key
-- 两表不重复部分
select * from A full (outer) join B on A.key = B.key where A.key is null or B.key is null
- 分页查询
select * from A limit offset,pageSize
这里的offset表示开始索引,默认从0开始,pageSize表示每页的条数。现在已经很少自己计算开始索引等参数,基本都是通过各种第三方分页插件实现。
- 子查询
部分情况下可以替代连接查询,连接查询是通过某一关联字段相等作为条件进行查询的,那么可以直接使用where A.关联字段 = (select 关联字段 from B where condition = ?)
-- 查询'课程设计'的所有考试结果(学号,科目编号,成绩)降序排列
-- 方式一:使用连接查询
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
FROM result r
INNER JOIN `subject` s
on r.StudentNo=s.SubjectNo
WHERE SubjectName='课程设计'
ORDER BY StudentResult DESC;
-- 方式二:使用子查询(由里到外)
SELECT StudentNo,SubjectNo,StudentResult
from result
WHERE SubjectNo=(
SELECT SubjectNo FROM `subject`
WHERE SubjectName='课程设计'
)
参考博文:blog.csdn.net/qq_45173404…
作者:Baret-H