Mysql的基本命令

一、操作数据库基本命令

1、数据库的基本命令

copy
mysql -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的命令是不区分大小写的,中括号中的代码是可选部分,可填写也可以不填写

copy
CREATE 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

创建数据库表格式

copy
CREATE 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 进行操作

所有创建和删除都应该加上判断,以免报错

copy
ALTER 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

引用外键的关键代码

copy
KEY `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 连接方式查询

copy
SELECT 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、自连接

一张表进行自我拆分,自己对自己进行连接查询

copy
CREATE 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)

分页

copy
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 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的连接和使用

一、导入驱动包

二、测试代码

copy
import 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对象:

copy
statement.executeQuery();//执行查询的sql语句 statement.execute();//可以执行任何的sql statement.executeUpdate();//更新,插入,删除都是用该方法

resultSet 结果集映射,指定类型获取数据库中的数据,如果不知道数据库的类型,则使用resultSet.getObject();

posted @   花椒蛋炒饭  阅读(256)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起