Mysql的基本命令
一、操作数据库基本命令
1、数据库的基本命令
copymysql -u root -p123456 --连接数据库
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; --修改用户密码
flush privileges; --刷新权限
show databases; --查看所有数据库
use 数据库名 --切换数据库 use命令
Database change
show tables; --查看数据库中的所有表
describe 数据库名; --显示数据库中所有的表的信息
create database 数据库名; --创建一个数据库
exit; --退出连接
-- 单行注释(sql原本的注释)
/* sql的多行注释 */
2、数据库的操作命令
mysql的命令是不区分大小写的,中括号中的代码是可选部分,可填写也可以不填写
copyCREATE DATABASE [IF NOT EXISTS] `数据库名`; --创建数据库
DROP DATABASE IF EXISTS `数据库名`; --删除数据库
--`student`反引号的作用:如果表名或字段名是一个特殊字符,那就需要带上反引号 `tableName`
USE `数据库名`; --使用数据库
SHOW DATABASES; --查看所有的数据库
SHOW CREATE DATABASE `数据库名`; -- 查看创建数据库的语句
SHOW CREATE TABLE `表名`; -- 查看创建数据表的语句
DESC `表名`; -- 显示数据表的结构
二、数据库的列类型
数值
- tinyint 十分小的数据 1个字节
- smallint 比较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
- int 标准的整数 4个字节 最常用
- bigint 较大的数据 8个字节
- float 单精度浮点数 4个字节
- double 双精度浮点数 8个字节(浮点数存在精度问题)
- decimal 字符串形式的浮点数 金融计算一般使用decimal
字符串
- char 字符串固定大小的 0~255
- varchar 可变字符串 0~65535 常用,与java中的string一起使用
- 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.10到现在的毫秒数 较为常用
- year 年份表示
null
-
没有值,未知的值
-
注意,不要使用null进行运算,结果为null
三、数据库字段属性
Unsigned: 无符号的整数 声明了该列不能声明为负数,否则报错
zerofill: 0填充 把不足的为数用0填充
自增:
- 通常理解为自增,自动在上一条的记录的基础上+1(默认)
- 通常用来设计唯一的主键 index,必须是整数类型
- 可以自定义设计主键自增的起始值和步长
非空 NULL not null
- 假设设置为非空,如果不给它赋值,就会报错
- 默认为null时,如果不填值,默认为null
默认:
- 设置默认的值!
- sex,默认值为男,如果不指定该列的值,则会有默认值
四、扩展
每张表必须存在的字段
- id 主键
- version 乐观锁
- is_delete 伪删除
- gmt_create 创建时间
- gmt_update 修改时间
五、创建数据库表
需要注意的单词
-- AUTO_INCREMENT 自增
-- COMMENT 注释
-- DEFAULT 默认
-- PRIMARY KEY 主键,唯一的
-- ENGINE 引擎,一般使用INNODB
-- CHARSET 字符集 utf8
copy-- 目标:创建一个school数据库
-- 创建一个学生表(列、字段) 使用sql语法创建
-- 学号 int 登录密码varchar(20) 姓名varchar(5) 性别varchar(2) 出生日期(datatime) 家庭住址varchar(20) email varchar(20)
-- 注意点: 使用英文() 表的名称和字段尽量使用``反引号括起来
-- AUTO_INCREMENT 自增
-- COMMENT 注释
-- DEFAULT 默认
-- PRIMARY KEY 主键,唯一的
-- ENGINE 引擎,一般使用INNODB
-- CHARSET 字符集 utf8
-- 字符串使用单引号括起来!
-- 所有的语句后面加上英文的逗号,最后一句不用添加逗号
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学生id',
`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
创建数据库表格式
copyCREATE TABLE [IF NOT EXISTS] `表名`(
`字段名` 列类型(必填) [属性] [索引] [注释],
`字段名` 列类型(必填) [属性] [索引] [注释],
`字段名` 列类型(必填) [属性] [索引] [注释],
`字段名` 列类型(必填) [属性] [索引] [注释],
PRIMARY KEY(`字段名`)
)[ENGINE=INNODB DEFAULT CHARSET=utf8]
[表类型][字符集设置][注释]
六、数据库引擎的区别(INNODB和MYISAM)
copy-- 关于数据库引擎
/*
INNODB 默认使用
MYISAM 早些年使用
*/
区别 | MYISAM | INNODB |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁定 | 不支持,但支持表锁定 | 支持 效率高 |
外键约束 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
表空间大小(表的内存) | 较小 | 越为MYISAM的两倍 |
常规使用操作
- MYISAM 节约空间,速度较快
- INNODB 安全性高,事务的处理,多表多用户操作
所有的数据库文件都存在 data 目录下
MySQL引擎在物理文件上的区别
-
INNODB在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
-
MYISAM对应文件
*.frm 表结构的定义文件
*.MYD 数据文件(data)
*.MYI 索引文件(index)
CHARSET=utf8 不设置的话,会是mysql的默认字符集编码(不支持中文)
七、修改表
有关于表的操作用 ALTER 进行操作
所有创建和删除都应该加上判断,以免报错
copyALTER TABLE `原来的表名` RENAME AS `修改后的表名`; -- 修改表名 ALTER TABLE `dda` RENAME AS `test`;
ALTER TABLE `表名` ADD `[字段名]` 字段的列属性; -- 在表中添加字段 ALTER TABLE `test` ADD `age` INT(11);
ALTER TABLE `表名` MODIFY `需要修改的字段名` 字段的属性; -- 修改表中字段的属性 ALTER TABLE `test` MODIFY `age` VARCHAR(11); -- 修改表中字段的属性
ALTER TABLE `表名` CHANGE `旧的字段名` `新的字段名` 字段的列属性; -- 修改字段名 ALTER TABLE `test` CHANGE `age` `sex` INT(11); -- 修改字段名
ALTER TABLE `表名` DROP `字段名`; -- 删除表中的字段 ALTER TABLE `test` DROP `sex`;
DROP TABLE IF EXISTS `表名`; -- 删除表 DROP TABLE IF EXISTS `dda`; -- 删除表
八、外键
外键的创建和引用
物理外键,数据库级别的外键,不建议使用(避免数据库过多而造成困扰)
方式一:
copy-- 创建两个表 学生表和年级表
/*
学生表的 gradeid 字段要引用年级表的 gradeid
1、定义外键 key
2、给这个外键添加约束(执行引用) references 引用 constraint 约束
*/
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学生id',
`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '学生姓名',
`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
`gradeid` INT(10) NOT NULL COMMENT '学生年级',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 创建年级表
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
`gradename` VARCHAR(20) NOT NULL COMMENT '年级名称',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
引用外键的关键代码
copyKEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
/*
KEY `FK_引用的外键名` (`需要引用的外键名`),
CONSTRAINT `FK_引用的外键名` FOREIGN KEY (`需要引用的外键名`) REFERENCES `引用的外键来源表` (`引用的外键来源表的主键名`)
*/
方式二:
copy-- 使用alter操作添加外键约束
ALTER TABLE `student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade` (`gradeid`);
/*
ALTER TABLE `需要外键的表名` ADD CONSTRAINT `约束名` FOREIGN KEY(`作为外键的列`) REFERENCES `被引用外键的表名` (`被引用外键的表名的字段`);
*/
注意点:
删除存在外键关系的表时,必须先删除引用的表(从表),再删除被引用的表(主表),例如,要删除年级表时,首先删除学生表。
九、insert 插入数据语句
公式:
注意点:
- 当字段被设置为非空时,要注意将字段的值插入,否则会报错
- 向表中插入数据,要注意插入的值与字段名一一对应,否则插入不成功
- 省略字段名插入时,要注意将值与表中的字段一一对应
copy-- insert into `表名`([字段名1,字段名2,字段名3,...]) values('值1'),('值2'),('值3'),('值4'),....
copy-- 向年级表插入数据
-- insert 插入语句
INSERT INTO `grade`(`gradename`) VALUES('大一');
-- 由于主键自增,可以省略主键的值(如果不写字段名,那么久会报错,插入语句的值是一一对应的)
-- insert into `grade` values('大三');
-- 插入多个值
INSERT INTO `grade`(`gradename`) VALUES('大二'),('大一');
向学生表中插入数据:
copy-- 向学生表中插入数据
INSERT INTO `student`(`name`,`gradeid`)VALUES('张三',1);
-- 向学生表插入对应字段的值
INSERT INTO `student`(`name`,`pwd`,`sex`,`gradeid`,`birthday`,`address`,`email`)VALUES('李四','789456','男',1,'2020-01-01','广州','123456@qq.com');
-- 向学生表中插入多条数据
INSERT INTO `student`(`name`,`pwd`,`sex`,`gradeid`,`birthday`,`address`,`email`)
VALUES('李四','789456','男',1,'2020-01-01','广州','123456@qq.com'),('王五','789456','男',1,'2020-01-01','广州','123456@qq.com');
-- 省略字段名插入数据
INSERT INTO `student`
VALUES(5,'李四','789456','男',1,'2000-01-01','广州','123456@qq.com'),
(6,'王五','789456','男',1,'2000-02-02','广州','123456@qq.com');
十、update修改语句
copy-- 语法
UPDATE `表名` SET colnum_name = value,[colnum_name = value,colnum_name = value,....] WHERE [条件]
-- 修改学生名字
UPDATE `表名` SET `字段名` = '需要修改的值' WHERE 需要指定的条件; --UPDATE `student` SET `name` = 'hello' WHERE id = 1;
-- 不指定条件修改,除非是批量修改同一个字段,否则要添加指定条件
UPDATE `表名` SET `字段名` = '需要修改的值'; -- UPDATE `student` SET `name` = 'hello';
-- 修改多个属性,需要指定属性名和属性值,中间用英文逗号隔开,加上判断条件
UPDATE `student` SET `name` = '张三',`pwd` = 'adfdafd',`sex` = '男',`email` = '4515@qq.com' WHERE id = 1;
-- 通过多个判断条件修改
UPDATE `student` SET `name` = '李四' WHERE `name` = '张三' AND `sex` = '女';
UPDATE `student` SET `name` = 'lll' WHERE id BETWEEN 2 AND 5;
-- 通过对value设置值,修改数据,value也可以是一个变量 CURRENT_TIME 当前时间变量
UPDATE `student` SET `birthday` = CURRENT_TIME WHERE `name` = '李四' AND `sex` = '女';
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 假如条件为5=6 | false |
<> 或 != | 不等于 | 假如 5<> 6或 5!=6 | false |
> | 大于 | 5>6 | false |
< | 小于 | 5<6 | true |
>= | 大于或等于 | 5>=6 | false |
<= | 小于或等于 | 5<=6 | true |
BETWEEN....AND... | 区间 | [2,5] | true |
AND | && | 5>1 AND 1>3 | false |
OR | || | 5>1 AND 1>3 | true |
十一、delete删除数据
copy-- 避免这样使用(这样使用会导致数据库被清空)
DELETE FROM `表名`; -- DELETE FROM `student`;
-- 清空数据库表数据
TRUNCATE `表名`; -- TRUNCATE `student`;
-- 需要加上判断条件
DELETE FROM `表名` WHERE [判断条件]; -- DELETE FROM `student` WHERE id = 6;
DELETE 和 TRUNCATE的区别:
相同点:都能删除数据,但不会删除表的结构
不同点:
- TRUNCATE 重新设置自增列的计数器,计数器会归零
- TRUNCATE 不会影响事务
DELETE删除的问题,当使用DELETE删除数据之后,存在的现象
- 使用INNODB引擎,重启数据库后,自增列会从1开始(数据存在内存中,断电即失)
- 使用MyISAM引擎,重启数据库后,继续从上一个自增量开始(存在文件中,不会丢失)
十二、query查询语句
准备数据和表格
copy-- 创建学校数据库
CREATE DATABASE IF NOT EXISTS `school`;
-- 使用学校数据库
USE `school`;
-- 删除学生表
DROP TABLE IF EXISTS `student`;
-- 创建学生表
CREATE TABLE IF NOT EXISTS `student`(
`studentno` INT(4) NOT NULL COMMENT '学号',
`loginpwd` VARCHAR(20) DEFAULT NULL,
`studentname` VARCHAR(20) DEFAULT NULL COMMENT '学生名字',
`sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',
`gradeid` INT(11) DEFAULT NULL COMMENT '年级编号',
`phone` VARCHAR(11) NOT NULL COMMENT '联系电话,允许为空',
`address` VARCHAR(255) NOT NULL COMMENT '地址,允许为空',
`borndate` DATETIME DEFAULT NULL COMMENT '出生时间',
`email` VARCHAR(50) NOT NULL COMMENT '邮箱账号允许为空',
`identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
PRIMARY KEY(`studentno`),
UNIQUE KEY `identitycard`(`identitycard`),
KEY `email`(`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8
-- 删除年级表
DROP TABLE IF EXISTS `grade`;
-- 创建年级表
CREATE TABLE IF NOT EXISTS `grade`(
`gradeid` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
`gradename` VARCHAR(50) NOT NULL COMMENT '年级姓名',
PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 删除科目表
DROP TABLE IF EXISTS `subject`;
-- 创建科目表
CREATE TABLE IF NOT EXISTS `subject`(
`subjectno` INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
`subjectname` VARCHAR(20) DEFAULT NULL COMMENT '课程名称',
`classhour` INT(4) DEFAULT NULL COMMENT '学时',
`gradeid` INT(4) DEFAULT NULL COMMENT '年级编号',
PRIMARY KEY(`subjectno`)
)ENGINE=INNODB AUTO_INCREMENT = 19 DEFAULT CHARSET=utf8
-- 删除成绩单
DROP TABLE IF EXISTS `result`;
-- 创建成绩单
CREATE TABLE `result`(
`studentno` INT(4) NOT NULL COMMENT '学号',
`stubjectno` INT(4) NOT NULL COMMENT '课程编号',
`examdate` DATETIME NOT NULL COMMENT '考试日期',
`studentresult` INT(4) NOT NULL COMMENT '考试成绩',
KEY `subjectno`(`stubjectno`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
-- 向科目表subject插入数据
INSERT INTO `subject`(`subjectno`,`subjectname`,`classhour`,`gradeid`)
VALUES(1,'高等数学-1',110,1),
(2,'高等数学-2',110,2),
(3,'高等数学-3',100,3),
(4,'高等数学-4',130,4),
(5,'C语言-1',110,1),
(6,'C语言-2',110,2),
(7,'C语言-3',100,3),
(8,'C语言-4',130,4),
(9,'Java程序设计-1',110,1),
(10,'Java程序设计-2',110,2),
(11,'Java程序设计-3',100,3),
(12,'Java程序设计-4',130,4),
(13,'数据库结构-1',110,1),
(14,'数据库结构-2',110,2),
(15,'数据库结构-3',100,3),
(16,'数据库结构-4',130,4),
(17,'C#基础',130,1);
-- 向学生表插入数据
INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1000,'123456','张伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456198001011234'),
(1001,'123456','赵强',1,3,'13800002222','广东深圳','1990-1-1','text111@qq.com','123456199001011233'),
(1002,'123456','张dd',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456198001011235'),
(1003,'123456','非伟',0,2,'13800001234','北京朝阳','1930-1-1','text123@qq.com','123456198001011534'),
(1004,'123456','张发',0,2,'13800001234','北京朝阳','1970-1-1','text123@qq.com','123456198201011234');
INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1005,'123456','王伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456798001011234'),
(1006,'123456','值强',1,3,'13800002222','广东深圳','1990-1-1','text111@qq.com','123456899001011233'),
(1007,'123456','黄的',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456998001011235'),
(1008,'123456','菲菲',0,2,'13800001234','北京朝阳','1930-1-1','text123@qq.com','123450198001011534'),
(1009,'123456','发发',0,2,'13800001234','北京朝阳','1970-1-1','text123@qq.com','123451198201011234');
INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1010,'123456','王伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456798001011237'),
(1011,'123456','值强',1,3,'13800002222','广东深圳','1990-1-1','text111@qq.com','123456899001011273'),
(1012,'123456','黄的',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456998701011235'),
(1013,'123456','菲菲',0,2,'13800001234','北京朝阳','1930-1-1','text123@qq.com','123450797001011534'),
(1014,'123456','发发',0,2,'13800001234','北京朝阳','1970-1-1','text123@qq.com','123471198201011234');
INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1015,'123456','王伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123156798001011234'),
(1016,'123456','值强',1,3,'13800002222','广东深圳','1990-1-1','text111@qq.com','183456899001011233'),
(1018,'123456','黄的',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','623456998001011235'),
(1019,'123456','菲菲',0,2,'13800001234','北京朝阳','1930-1-1','text123@qq.com','125450198001011534'),
(1020,'123456','发发',0,2,'13800001234','北京朝阳','1970-1-1','text123@qq.com','133451198201011234');
-- 插入科目
INSERT INTO `subject`(`subjectno`,`subjectname`,`classhour`,`gradeid`)VALUES
(1,'高等数学-1',110,1),
(2,'高等数学-2',110,2),
(3,'高等数学-3',100,3),
(4,'高等数学-4',130,4),
(5,'C语言-1',110,1),
(6,'C语言-2',110,2),
(7,'C语言-3',100,3),
(8,'C语言-4',130,4),
(9,'Java程序设计-1',110,1),
(10,'Java程序设计-2',110,2),
(11,'Java程序设计-3',100,3),
(12,'Java程序设计-4',130,4),
(13,'数据库结构-1',110,1),
(14,'数据库结构-2',110,2),
(15,'数据库结构-3',100,3),
(16,'数据库结构-4',130,4),
(17,'C#基础',130,1);
-- 插入年级数据
INSERT INTO `grade` (`gradeid`,`gradename`) VALUES(1,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'预科班');
-- 插入学生成绩
INSERT INTO `result`(`studentno`,`stubjectno`,`examdate`,`studentresult`)
VALUES
(1000,1,'2013-11-11 16:00:00',85),
(1000,2,'2013-11-12 16:00:00',70),
(1000,3,'2013-11-11 09:00:00',68),
(1000,4,'2013-11-13 16:00:00',98),
(1000,5,'2013-11-14 16:00:00',58),
(1002,1,'2013-11-11 16:00:00',84),
(1002,2,'2013-11-12 16:00:00',80),
(1002,3,'2013-11-11 09:00:00',60),
(1002,4,'2013-11-13 16:00:00',90),
(1002,5,'2013-11-14 16:00:00',50),
(1000,1,'2013-11-11 16:00:00',86),
(1003,2,'2013-11-12 16:00:00',75),
(1003,3,'2013-11-11 09:00:00',66),
(1003,4,'2013-11-13 16:00:00',95),
(1003,5,'2013-11-14 16:00:00',56),
(1004,1,'2013-11-11 16:00:00',85),
(1004,2,'2013-11-12 16:00:00',70),
(1004,3,'2013-11-11 09:00:00',68),
(1004,4,'2013-11-13 16:00:00',98),
(1004,5,'2013-11-14 16:00:00',58),
(1005,1,'2013-11-11 16:00:00',85),
(1005,2,'2013-11-12 16:00:00',70),
(1005,3,'2013-11-11 09:00:00',68),
(1005,4,'2013-11-13 16:00:00',98),
(1005,5,'2013-11-14 16:00:00',58),
(1006,1,'2013-11-11 16:00:00',85),
(1006,2,'2013-11-12 16:00:00',70),
(1006,3,'2013-11-11 09:00:00',68),
(1006,4,'2013-11-13 16:00:00',98),
(1006,5,'2013-11-14 16:00:00',58),
(1007,1,'2013-11-11 16:00:00',85),
(1007,2,'2013-11-12 16:00:00',70),
(1007,3,'2013-11-11 09:00:00',68),
(1007,4,'2013-11-13 16:00:00',98),
(1007,5,'2013-11-14 16:00:00',58),
(1008,1,'2013-11-11 16:00:00',85),
(1008,2,'2013-11-12 16:00:00',70),
(1008,3,'2013-11-11 09:00:00',68),
(1008,4,'2013-11-13 16:00:00',98),
(1008,5,'2013-11-14 16:00:00',58),
(1009,1,'2013-11-11 16:00:00',85),
(1009,2,'2013-11-12 16:00:00',70),
(1009,3,'2013-11-11 09:00:00',68),
(1009,4,'2013-11-13 16:00:00',98),
(1009,5,'2013-11-14 16:00:00',58),
(1010,1,'2013-11-11 16:00:00',85),
(1010,2,'2013-11-12 16:00:00',70),
(1010,3,'2013-11-11 09:00:00',68),
(1010,4,'2013-11-13 16:00:00',98),
(1011,5,'2013-11-14 16:00:00',58),
(1011,1,'2013-11-11 16:00:00',84),
(1011,2,'2013-11-12 16:00:00',80),
(1011,3,'2013-11-11 09:00:00',60),
(1012,4,'2013-11-13 16:00:00',90),
(1012,5,'2013-11-14 16:00:00',50),
(1012,1,'2013-11-11 16:00:00',86),
(1012,2,'2013-11-12 16:00:00',75),
(1013,3,'2013-11-11 09:00:00',66),
(1013,4,'2013-11-13 16:00:00',95),
(1013,5,'2013-11-14 16:00:00',56),
(1014,1,'2013-11-11 16:00:00',85),
(1014,2,'2013-11-12 16:00:00',70),
(1014,3,'2013-11-11 09:00:00',68),
(1014,4,'2013-11-13 16:00:00',98),
(1014,5,'2013-11-14 16:00:00',58),
(1015,1,'2013-11-11 16:00:00',85),
(1015,2,'2013-11-12 16:00:00',70),
(1015,3,'2013-11-11 09:00:00',68),
(1015,4,'2013-11-13 16:00:00',98),
(1015,5,'2013-11-14 16:00:00',58),
(1016,1,'2013-11-11 16:00:00',85),
(1016,2,'2013-11-12 16:00:00',70),
(1016,3,'2013-11-11 09:00:00',68),
(1016,4,'2013-11-13 16:00:00',98),
(1016,5,'2013-11-14 16:00:00',58),
(1017,1,'2013-11-11 16:00:00',85),
(1017,2,'2013-11-12 16:00:00',70),
(1017,3,'2013-11-11 09:00:00',68),
(1017,4,'2013-11-13 16:00:00',98),
(1017,5,'2013-11-14 16:00:00',58),
(1018,1,'2013-11-11 16:00:00',85),
(1018,2,'2013-11-12 16:00:00',70),
(1018,3,'2013-11-11 09:00:00',68),
(1018,4,'2013-11-13 16:00:00',98),
(1018,5,'2013-11-14 16:00:00',58),
(1019,1,'2013-11-11 16:00:00',85),
(1019,2,'2013-11-12 16:00:00',70),
(1019,3,'2013-11-11 09:00:00',68),
(1019,4,'2013-11-13 16:00:00',98),
(1019,5,'2013-11-14 16:00:00',58),
(1020,1,'2013-11-11 16:00:00',85),
(1020,2,'2013-11-12 16:00:00',70),
(1020,3,'2013-11-11 09:00:00',68),
(1020,4,'2013-11-13 16:00:00',98),
(1020,5,'2013-11-14 16:00:00',58);
1、查询全部学生
copy-- 查询语句 查询表内全部信息
SELECT * FROM `表名`;
-- 查询指定字段
SELECT `字段名`,`字段名` FROM `表名`; -- select 和 from 之间可以放置多个字段,不只是两个字段
-- 别名 AS 给查询出来的表格的字段起一个名字,也可以给表起一个别名
SELECT `字段名` AS 字段别名,`字段名` AS 字段别名 FROM `表名` AS 表的别名;
-- 函数 例如拼接字符串函数:CONCAT(a,b) ab为参数
SELECT CONCAT('需要添加的字符串:',`属性的值`) AS 别名 FROM `表名`;
-- 去重 DISTINCT 去重关键字 重复的数据只显示一条
SELECT DISTINCT `需要去重的字段名` FROM `表名`;
SELECT VERSION(); -- 查询系统版本(函数)
SELECT 100*3-1 AS 计算结果; -- 用来计算 (表达式)
SELECT @@auto_increment_increment; -- 查询自增的步长(变量)
-- 查询结果 +1 处理
SELECT `字段名`,`可以计算的字段` +1 AS 别名 FROM `表名`;
2、where 条件子句
逻辑运算符:
运算符 | 语法 | 描述 |
---|---|---|
and && | a and b a&&b | 逻辑与,两个为真,结果为真 |
or || | a or b a || b | 逻辑或,其中一个为真,结果为真 |
not ! | not a ! a | 逻辑非,真为假,假为真 |
copy-- where 条件查询
SELECT * FROM `表名` WHERE 判断条件
-- 例如:SELECT `studentno`,`studentresult` FROM `result` WHERE `studentresult`>=90 AND `studentresult`<=100;
-- SELECT `studentno`,`studentresult` FROM `result` WHERE `studentresult`>=90 && `studentresult`<=100;
-- 区间查询 BETWEEN 最小值 AND 最大值; 在 AND 两边填入区间值
SELECT * FROM `表名` WHERE `需要判断的字段名` BETWEEN 最小值 AND 最大值;
-- 例如:SELECT `studentno`,`studentresult` FROM `result` WHERE `studentresult` BETWEEN 95 AND 100;
3、模糊查询
比较运算符
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a is null | 如果操作符 |
IS NOT NULL | a is not null | |
BETWEEN | a between b and c | |
LIKE | a like b | |
IN | a in (a1,a2,a3) |
copy-- 模糊查询
-- like结合 %(代表0到任意字符) _(代表一个字符)
SELECT `字段名`,`字段名` FROM `表名` WHERE `字段名` LIKE '条件%' -- %后面可以跟0个或多个字符
SELECT `字段名`,`字段名` FROM `表名` WHERE `字段名` LIKE '条件_' -- _后面只能代表一个字符
4、联表查询
七种join理论,联表查询
INNER JOIN 连接方式查询
copySELECT s.`studentno`,`studentname`,`stubjectno`,`studentresult` --需要查询的字段
FROM `student` AS s INNER JOIN `result` AS r --需要连接的表
WHERE s.`studentno` = r.`studentno` -- 两张表中相同的值
RIGHT JOIN 连接方式
copy-- right join
SELECT s.`studentno`,`studentname`,`stubjectno`,`studentresult`
FROM `student` AS s RIGHT JOIN `result` AS r
ON s.`studentno` = r.`studentno`
LEFT JOIN 连接方式
copy-- left join
SELECT s.`studentno`,`studentname`,`stubjectno`,`studentresult`
FROM `student` AS s LEFT JOIN `result` AS r
ON s.`studentno` = r.`studentno`
对比:
操作 | 说明 |
---|---|
INNER JOIN | 如果表中至少有一个匹配,就返回查询结果 |
LEFT JOIN | 会从左表中返回所有的值,即使在右表中没有匹配 |
RIGHT JOIN | 会从右表中返回所有的值,即使在左表中没有匹配 |
三表联表查询
copy-- 查询了参加考试的学生信息 学号,学生姓名,科目名,分数 三表查询
SELECT s.`studentno`,`studentname`,u.`subjectname`,r.`studentresult`
FROM `student` s INNER JOIN `subject` u RIGHT JOIN `result` r
ON s.`studentno` = r.`studentno` AND u.`subjectno` = r.`stubjectno`
5、自连接
一张表进行自我拆分,自己对自己进行连接查询
copyCREATE TABLE `category`(
`categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id',
`pid` INT(10) NOT NULL COMMENT '父id',
`categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字',
PRIMARY KEY(`categoryid`)
)ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
INSERT INTO `category`(`categoryid`,`pid`,`categoryName`)
VALUES('2','1','信息技术'),
('3','1','软件开发'),
('4','3','数据库'),
('5','1','美术设计'),
('6','3','web开发'),
('7','5','ps技术'),
('8','2','办公信息')
父类
categoryid | categoryName |
---|---|
2 | 信息技术 |
3 | 软件开发 |
5 | 美术设计 |
子类
pid | categoryid | categoryName |
---|---|---|
3 | 4 | 数据库 |
2 | 8 | 办公信息 |
3 | 6 | web开发 |
5 | 7 | ps技术 |
操作:查询父类对应的子类关系
这个表是将父类的对应的子类选项同时输入一张表中,通过categoryid和pid进行区别分类
父类 | 子类 |
---|---|
信息技术 | 办公信息 |
软件开发 | 数据库 |
软件开发 | web开发 |
美术设计 | ps技术 |
copy-- 查询父子关系
SELECT a.`categoryName` '父栏目',b.`categoryName` '子栏目'
FROM `category` a,`category` b
WHERE a.`categoryid` = b.`pid`
6、分页和排序
排序:升序 ASC 降序 DESC
copy-- 查询参加了 数据库结构-1 考试的学生信息 学号,名字,科目名,分数
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
WHERE sub.`subjectname` = '数据库结构-1'
ORDER BY `studentresult` DESC
-- 语法 在where判断后加上 order by `字段名` 排序方式(ASC、DESC)
分页
copySELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
WHERE sub.`subjectname` = '数据库结构-1'
ORDER BY `studentresult` DESC
LIMIT 0,5
-- 语法 limit 起始位置,需要查询的条数
copy-- 查询C语言-1课程成绩排名前十的学生,并且分数要大于80分的学生信息
-- 学号,姓名,课程,分数
SELECT s.`studentno`,`studentname`,`subjectname`,`studentresult`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
INNER JOIN `subject` sub
ON sub.`subjectno` = r.`stubjectno`
WHERE `subjectname` = 'C语言-1' AND `studentresult` >=80
ORDER BY `studentresult` DESC
LIMIT 0,10
7、子查询
本质: 在where语句中嵌套一个子查询语句
子查询的查询顺序是由里及外的
copy-- 先查询result表中的信息
-- 查询所有的 C语言-1 的课程编号
SELECT `studentno`,`stubjectno`,`studentresult`
FROM `result`
WHERE `stubjectno` = (
SELECT `subjectno` FROM `subject`
WHERE `subjectname` = 'C语言-1'
)
copy-- 联表查询中嵌套子查询
-- 分数不小于0分的学生的学号和名字
-- 去重 DISTINCT
SELECT DISTINCT s.`studentno`,`studentname`
FROM `student` s
INNER JOIN `result` r
ON s.`studentno` = r.`studentno`
WHERE `studentresult` > 0
AND `stubjectno` = (
SELECT `subjectno` FROM `subject`
WHERE `subjectname` = 'C语言-1'
)
无限套娃写法:
执行顺序是由里及外
copy-- 子查询再改造
SELECT `studentno`,`studentname` FROM `student` WHERE `studentno` IN (
SELECT `studentno` FROM `result` WHERE `studentresult` > 0 AND `stubjectno` = (
SELECT `subjectno` FROM `subject` WHERE `subjectname` = 'C语言-1'
)
)
-- 在where的判断条件后再添加需要进行的查询语句
十三、函数
常见函数
copy-- 函数
SELECT ABS(-10) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT RAND() -- 返回一个0~1之间的随机数
SELECT SIGN(10) -- 判断一个数的符号 负数返回-1,正数返回1
-- 字符串函数
SELECT CHAR_LENGTH('hello world') -- 字符串长度
SELECT CONCAT('hello','wor','ld') -- 拼接字符串
SELECT INSERT('我爱编程helloworld',1,2,'超级热爱') -- 查询,从某个位置开始替换某个长度
SELECT LOWER('HelloWorld') -- 小写字母
SELECT UPPER('helloworld') -- 大写字母
SELECT INSTR('helloworld','h') -- 返回第一次出现该字符的索引
SELECT REPLACE('helloworld','h','H') -- 替换中间出现的指定字符
SELECT SUBSTR('helloworld',4,6) -- 返回指定的子字符串(原字符串,截取位置,截取长度)
SELECT REVERSE('helloworld') -- 反转
-- 时间函数
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE() -- 获取当前时间
SELECT NOW() -- 获取当前时间,带有时分秒
SELECT LOCALTIME() -- 获取本地时间
SELECT SYSDATE() -- 获取系统时间
-- 获取时分秒
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
-- 系统
SELECT SYSTEM_USER() -- 系统用户
SELECT USER() -- 当前用户
SELECT VERSION() -- 当前版本-- 函数
SELECT ABS(-10) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4) -- 向下取整
SELECT RAND() -- 返回一个0~1之间的随机数
SELECT SIGN(10) -- 判断一个数的符号 负数返回-1,正数返回1
-- 字符串函数
SELECT CHAR_LENGTH('hello world') -- 字符串长度
SELECT CONCAT('hello','wor','ld') -- 拼接字符串
SELECT INSERT('我爱编程helloworld',1,2,'超级热爱') -- 查询,从某个位置开始替换某个长度
SELECT LOWER('HelloWorld') -- 小写字母
SELECT UPPER('helloworld') -- 大写字母
SELECT INSTR('helloworld','h') -- 返回第一次出现该字符的索引
SELECT REPLACE('helloworld','h','H') -- 替换中间出现的指定字符
SELECT SUBSTR('helloworld',4,6) -- 返回指定的子字符串(原字符串,截取位置,截取长度)
SELECT REVERSE('helloworld') -- 反转
-- 时间函数
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE() -- 获取当前时间
SELECT NOW() -- 获取当前时间,带有时分秒
SELECT LOCALTIME() -- 获取本地时间
SELECT SYSDATE() -- 获取系统时间
-- 获取时分秒
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
-- 系统
SELECT SYSTEM_USER() -- 系统用户
SELECT USER() -- 当前用户
SELECT VERSION() -- 当前版本
聚合函数 分组和过滤
函数名称 | 描述 |
---|---|
COUNT() | 计数 |
SUM() | 求和 |
AVG() | 平均值 |
MAX() | 最大值 |
MIN() | 最小值 |
... | ... |
copy-- 查询不同课程的平均分,最高分,最低分
-- 核心(根据不同课程分组)
SELECT `subjectname`,AVG(`studentresult`),MAX(`studentresult`),MIN(`studentresult`)
FROM `result` r
INNER JOIN `subject` sub
ON r.`stubjectno` = sub.`subjectno`
GROUP BY r.`stubjectno` -- 对什么字段进行分组
HAVING AVG(`studentresult`) > 60 -- 判断条件 在分组之后不能使用where,需要用HAVING 进行判断
十四、事务
事务的理解
同时两条sql一起执行,要么都成功,要么都失败
例子,加入A给B转账,A已经转账了,但是B没有收到,而且A的钱减少了,B的钱没有增加,这个就是事务需要解决的问题,要么都成功,要么都失败
事务就是将一组sql放在一个批次中执行
事务原则:ACID原则 原子性,一致性,隔离性,持久性 (脏读,幻读.....)
原子性:要么都成功,要么都失败,不允许一个成功一个失败
一致性:无论如何操作,到最后的所有值总和都不会改变
持久性:表示事务结束后数据不会随着外界的原因导致数据丢失
隔离性:针对多个用户同时操作,主要是排除其他事务对本次事务的影响
脏读:一个事务读取了另一个事务未提交的数据
幻读(虚读):一个事务内读取到了别的事务刚插入的数据,导致前后读取不一致
过程
copy-- 手动处理事务
SET autocommit = 0 /*关闭*/
-- 事务的开启
START TRANSACTION -- 标记一个事务的开始,从这之后的sql都在同一个事务中
-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK
-- 事务的结束
SET autocommit = 1 /*开启(默认的)*/
扩展点
copy SAVEPOINT 保存点 -- 设置一个事务的保存点,相当于存档
ROLLBACK TO SAVEPOINT 保存点 -- 回滚到保存点
RELEASE SAVEPOINT 保存点 -- 将事务的保存点删除
理解事务:模拟转账
copy-- 模拟转账
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION; -- 开启一个事务
UPDATE account SET money=money-500 WHERE `name` = 'A'; -- A减500
UPDATE account SET money=money+500 WHERE `name` = 'B'; -- B加500
COMMIT; -- 提交事务,数据持久化,将不会被回滚
ROLLBACK; -- 回滚
SET autocommit = 1; -- 开启自动提交
注意点:当关闭自动提交(SET autocommit = 0;)后,在后面要使用数据库,要将自动提交(SET autocommit = 1;)重新开启,否则将不会保存数据
十五、索引
在一个表中,主键索引只能有一个,唯一索引可以后很多个
- 主键索引(PRIMARY KEY)
- 唯一的标识,主键不可重复,只能有一个列作为主键
- 唯一索引(UNIQUE KEY)
- 避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
- 常规索引(KEY/INDEX)
- 默认的,index和key关键字来设置
- 全文索引(FullText)
- 快速定位数据
创建索引
copy-- 显示一个表中的所有索引
SHOW INDEX FROM `student`
-- 增加一个全文索引
ALTER TABLE school.`student` ADD FULLTEXT INDEX `studentname`(`studentname`)
-- id_表名_字段名
-- CREATE INDEX 索引名 on 表(字段名)
CREATE INDEX id_app_user_name ON app_user(`name`); -- 给name这个字段创建一个索引
插入100百万条数据函数
copy-- 插入100万条数据
-- sql 编程
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i<num DO
-- 插入语句
INSERT INTO `app_user`(`name`,`email`,`phone`,`gender`,`password`,`age`)VALUES(CONCAT('用户',i),'541511681@test.com',CONCAT('18',FLOOR(RAND()*((999999999-100000000)+100000000))),FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100));
SET i = i+1;
END WHILE;
RETURN i;
END;
索引原则
- 索引不是越多越好
- 不要对经常变动的数据添加索引
- 小数据量的表不需要添加索引
- 索引一般加载常用来查询的字段上
十六、jdbc的连接和使用
一、导入驱动包
二、测试代码
copyimport java.sql.*;
//我的第一个jdbc程序
public class JdbcTest01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1、加载驱动
Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动
// 2、用户信息和url
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=false";
String username = "root";
String password = "123456";
// 3、连接成功,数据库对象 connection相当于数据库
Connection connection = DriverManager.getConnection(url, username, password);
// 4、执行sql的对象 statement sql对象
Statement statement = connection.createStatement();
// 5、执行sql对象去执行sql
String sql = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(sql);//执行查询使用executeQuery ResultSet结果集
//循环输出结果集
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("name="+resultSet.getObject("NAME"));
System.out.println("pwd="+resultSet.getObject("PASSWORD"));
System.out.println("email="+resultSet.getObject("email"));
System.out.println("birthday="+resultSet.getObject("birthday"));
}
// 6、释放连接
resultSet.close();
statement.close();
connection.close();
}
}
connection对象:
copy//connection代表数据库
//数据库设置自动提交
connection.setAutoCommit(); //参数为布尔值
//事务提交
connection.commit();
//事务回滚
connection.rollback();
statement对象:
copystatement.executeQuery();//执行查询的sql语句
statement.execute();//可以执行任何的sql
statement.executeUpdate();//更新,插入,删除都是用该方法
resultSet 结果集映射,指定类型获取数据库中的数据,如果不知道数据库的类型,则使用resultSet.getObject();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步