MySQL基本操作

1.数据库相关操作

功能描述 命令
启动/关闭服务 net start/stop mysql;
退出mysql exit;
使用某个数据库 use 数据库
修改密码 update mysql.user set authentication_string=password(‘新密码’) where user=‘root’ and Host =‘localhost’;
显示所有数据库/表 show databases; show tables;
显示表所有表信息 describe 表;
创建数据库 create database 数据库
删除数据库 drop database 数据库

2.数据类型

数值

类型 描述 大小
tinyint 小的数据 1字节
smallint 比较小的数据 2 字节
mediumint 中等数据 3字节
int 标准整数 4字节
bigint 较大的整数 8字节
float 单精度浮点数 4字节
double 双精度浮点数 8字节
decimal 字符串形式浮点数 \
char 固定大小字符串 0~255
varchar 可变大小字符串(对应String) 0~65535
tinytext 微型文本 2^8-1
text 文本串(大文本) 2^16-1

时间日期
java.util.Date

类型 描述 格式
date 年-月-日 YYYY-MM-DD
time 时:分:秒 HH:mm:ss
datetime 年-月-日 时:分:秒 YYYY-MM-DD HH:mm:ss
timestamp 时间戳 1970.1.1到现在的毫秒数
year YYYY

null

  • 没有值,未知
  • 注意:不要使用NULL运算,结果为NULL

3.表

创建表
字段加``引用以防和关键字冲突

CREATE TABLE `person` (
  `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 '性别',
  `birth` datetime DEFAULT NULL COMMENT '出生日期',
  `address` varchar(100) DEFAULT NULL COMMENT '家庭住址',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8

表操作

show create database test -- 查看创建数据库语句
show create table user -- 查看创建表语句
desc user -- 查看表结构
-- 修改表名
ALTER table 旧表名 rename as 新表名;
-- 添加字段
ALTER table 表名 add age int(4);
-- 修改表 约束
ALTER table 表名 modify age varchar(11);
-- 重命名
ALTER TABLE person CHANGE age grade INT(4);
-- 删除字段
ALTER TABLE person DROP grade;
-- 删除表
drop table if exists 表名;

4.外键

外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键用于与另一张表的关联。是能确定另一张表记录的字段,保持数据的一致性、完整性。

-- 从表
CREATE TABLE `student` (
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` VARCHAR(30) NOT NULL COMMENT '姓名',
  `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
  `birth` DATETIME DEFAULT NULL COMMENT '出生日期',
  `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
  `gradeId` INT(4) NOT NULL COMMENT '年级id',
  PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 主表
CREATE TABLE `grade` (
  `gradeId` INT(4) NOT NULL AUTO_INCREMENT COMMENT '年级id',
  `gradeName` VARCHAR(30) NOT NULL COMMENT '年级名',
  PRIMARY KEY (`gradeId`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 设置外键 gradeId
ALTER TABLE `student` 
ADD CONSTRAINT `FK_gradeId` FOREIGN KEY(`gradeId`) REFERENCES `grade`(`gradeId`);

5.CRUD操作

基本操作

-- 插入多个值
INSERT INTO `grade`(`gradeName`) VALUES('大一'),('大二');
-- 修改:UPDATE `表` SET `属性`= 'xxx' WHERE 条件;
UPDATE `student` SET `name`= 'xxx',`age` = 12 WHERE id > 3;
-- 删除
DELETE FROM `student` WHERE  id BETWEEN 3 AND 5;
-- 清空表
DELETE from `studebt`; --继续自增
TRUNCATE `student`; -- 自增计数清0;不影响事务;推荐使用
-- select查找
SELECT `name` AS 名字, `sex` AS 性别 FROM `student`;
-- 拼接显示结果为 姓名:xxx
SELECT CONCAT('姓名:',`name`) AS 名字 FROM `student`;
-- 去重
SELECT DISTINCT `name` FROM `student`;
-- 模糊查询where 属性 like %和_( %表示任意个字符 _表示一个字符、__表示两个字符)
SELECT * FROM `student` WHERE `name` LIKE 'a%'; -- a开头
SELECT * FROM `student` WHERE `name` LIKE '%s';-- s结尾
SELECT * FROM `student` WHERE `name` LIKE '_s_';--三个字符s在中间
SELECT * FROM `student` WHERE `name` LIKE '__y%';-- y前面两个字符,后面任意
-- 模糊查询 where 属性 in(集合范围)
SELECT * FROM `student` WHERE `id` IN(1,3,5) AND `name` LIKE 's%';
SELECT * FROM `student` WHERE `address` IN('北京'); -- 范围为 北京

其他操作

-- 如果一条id存在则修改,否则直接插入
UPDATE `user` SET `name` = 'xyz',`pwd`='010110' WHERE id = 10;
INSERT INTO `user` (`id`, `name`, `pwd` ) VALUES( 10, 'xyz', '010110');
-- 或者
REPLACE INTO `user`(`id`, `name`, `pwd` ) VALUES (10, 'xyz', '010110);

MySQL基本操作_第1张图片
连表查询
MySQL基本操作_第2张图片
说明:
1.AB相交部分是满足on条件的数据,相当于两份数据,AB不相交的部分为不满足on条件数据
2.相交部分Key肯定不为NULL,条件 key is null会把相交部分排除掉

join 用于把来自两个或多个表的行结合起来:join(连接的表) on(条件查询)

类型 描述
inner join 在表中存在至少一个匹配时返回行
left join 从左表返回所有的行,即使右表中没有匹配;
right join 从右表返回所有的行,即使左表中没有匹配

练习一下:
MySQL基本操作_第3张图片
1.查询一年级,语文第一名

select stu.stu_id,stu.name,stu.sex,stu.grade,score.sub,score.score from stu 

left join score on  stu.stu_id=score.stu_id where stu.grade = 1 and score.sub = 

'语文' order by score.score decs limit 1;

2.查询一年级,各科成绩第三名

select stu.stu_id,stu.name,stu.sex,stu.grade,score.sub,score.score from stu 

left join score on stu.stu_id = score.stu_id where stu.grade=1 group by 

score.sub order by score.score desc limit 3;

2.各年级总成绩第一名

select stu.stu_id,stu.name,stu.sex,stu.grade sum(score.score) as s from stu 

left join score on stu.stu_id = score.stu_id group by score.grade,stu.name 

order by s desc limit 1;

你可能感兴趣的:(笔记,mysql)