3.MySQL基本的命令行操作
一.使用SQLyog和基本命令行操作
1.SQLyog需要学会新建数据库,新建表和字段,执行语句:
2.基本命令行操作:
1 -- MySQL数据库单行注释 2 /* 3 MySQL数据库多行注释 4 */ 5 6 -- 所有的语句都以分号结尾 7 8 mysql -u root -p123456 --连接数据库 9 10 update mysql.user set authentication_string=password('654321') where user='root' and host='localhost'; 11 flush privileges; --修改用户密码并刷新权限 12 13 -------------------------------------------------- 14 15 show databases; --查看所有的数据库 16 use school; --切换数据库使用use 数据库名 17 show tables; --查看数据库中的所有表 18 describe student; --显示数据库中student表的信息 19 20 create database westos; --创建一个数据库 21 22 exit; --退出连接
二.结构化查询语句分类
三.操作数据库
-
操作数据库:增删改查四个操作
-
操作数据库中的表:字段类型,字段属性(约束),表类型(引擎),表字符集,增删改查四个操作
-
操作数据库中表的数据:外键,DML语言(增删改),DQL语言(查)
1.操作数据库(了解)
- 创建数据库: create database [if not exists] westos; --中括号表示可选项
- 删除数据库: drop database [if exists] test;
- 使用数据库: use `school`; --使用数据库,如果名称是一个特殊的字段,需要加反引号。
- 查看数据库: show databases; --查看所有的数据库
补充: show warnings; --查看warning
2.操作数据库中的表
(1)数据库字段的列类型
- 数值:
- tinyint:十分小的数据,1个字节
- samllint:较小的数据,2个字节
- mediumint:中等大小的数据,3个字节
- int:标准的整数,4个字节,常用
- bigint:较大的数据,8个字节
- float:浮点数,4个字节
- double:浮点数,8个字节(有精度问题)
- 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.1到现在的毫秒数。
- year:年份
- 理解为"没有值"或"未知值"(注意不要使用NULL进行运算,如果运算结果为NULL)
(2)数据库字段的列属性/列约束(重点)
- Unsigned:
- 无符号的整数
- 声明了该列不能声明为负数
- zerofill:
- 0填充的
- 不足的位数,使用0来填充,
- 自增:
- 通常理解为自增,自动在上一条记录的基础上加1(默认)
- 通常用来设计唯一的主键索引,必须为整数类型
- 可以自定义设计主键自增的起始值和步长
- null 和 not null:
- 设置为not null,如果不赋值就会报错
- 设置为null,如果不填写值,默认就为null
- 默认:
- 设置默认的值!
(2.1)拓展:表设计规范
1 /* 每个表,都必须存在以下五个字段!未来做项目会使用,表示一个记录存在的意义! 2 id 主键 3 `version` 乐观锁 4 is_delete 伪删除 5 gmt_create 创建时间 6 gmt_update 修改时间 7 */
(3)数据表的类型
-
MySQL的数据表的类型 : MyISAM , InnoDB , HEAP , BOB , CSV等...
-
常见的 MyISAM 与 InnoDB 类型
(3.1)两种类型支持的功能上的区别:
(3.2)适用场合:
- 适用MyISAM : 节约空间及相应速度
- 适用InnoDB : 安全性 , 事务处理及多用户操作数据表
(3.3)数据表的存储位置:
- MySQL数据表以文件方式存放在磁盘中
- 包括表文件 , 数据文件 , 以及数据库的选项文件
- 位置 : Mysql安装目录\data\下存放数据表 . 目录名对应数据库名 , 该目录下文件名对应数据表
- 两种类型物理文件上的区别:
- InnoDB类型数据表只有一个 *.frm文件 , 以及上一级目录的ibdata1文件
- MyISAM类型数据表对应三个文件 :
- * . frm -- 表结构定义文件
- * . MYD -- 数据文件(data)
- * . MYI -- 索引文件(index)
(4) 数据表的字符集编码
- 注:不设置的话,会使用mysql默认的字符集编码(不支持中文)
1 CREATE TABLE 表名( 2 ...... 3 )CHARSET = utf8;
(5)创建数据库中的表
(5.1)格式:
1 create table [if not exists] `表名`( 2 `字段名` 列类型 [属性] [索引] [注释], 3 ....... 4 `字段名` 列类型 [属性] [索引] [注释], 5 `字段名` 列类型 [属性] [索引] [注释] 6 )[表类型] [字符集设置] [注释]
(5.2)案例:
1 # 创建学生表(列,字段) 2 # 学号int 登录密码varchar(20) 姓名,性别varchar(2),出生日期(datatime),家庭住址,email 3 # 创建表之前 , 一定要先选择数据库 4 5 # 字符串使用单引号括起来! 6 # 所有的语句后加英文逗号,最后一个不用加 7 # PRIMARY KEY 主键 8 CREATE TABLE IF NOT EXISTS `student` ( 9 `id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号', 10 `name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', 11 `pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码', 12 `sex` varchar(2) NOT NULL DEFAULT '男' COMMENT '性别', 13 `birthday` datetime DEFAULT NULL COMMENT '生日', 14 `address` varchar(100) DEFAULT NULL COMMENT '地址', 15 `email` varchar(50) DEFAULT NULL COMMENT '邮箱', 16 PRIMARY KEY (`id`) 17 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
(5.3)常用命令:
- 通过已经创建的数据库,查看创建数据库的语句
- 通过已经创建的数据表,查看创建数据表的语句
1 # 查看创建数据库的SQL语句 2 SHOW CREATE DATABASE school; 3 # 查看创建数据表的SQL语句 4 SHOW CREATE TABLE student; 5 # 显示表结构 6 DESC student; 7 # 设置严格检查模式(不能容错了) 8 SET sql_mode='STRICT_TRANS_TABLES';
(6)修改数据库中的表
(6.1)格式:
- 添加字段 :
- ALTER TABLE 表名 ADD 字段名 列属性[属性]
删除字段 :
- ALTER TABLE 表名 DROP 字段名
- ALTER TABLE 旧表名 RENAME AS 新表名
- ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
- ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型[属性]
注:
-
change:一般只用于修改表的列名,这里修改了列类型可能出错,当赋值了varchar类型后不能转换为int类型
- modify:用于修改表的列类型和列属性/列约束
(6.2)案例:
1 -- 增加表的字段 2 ALTER TABLE teacher ADD age INT(3) 3 4 -- 删除表的字段 5 ALTER TABLE teacher DROP age1 6 7 -- 修改表名 8 ALTER TABLE student RENAME AS teacher 9 10 -- 修改表的字段(修改约束,重命名) 11 ALTER TABLE teacher MODIFY age VARCHAR(11) -- 修改约束(用于修改表的列类型和列属性/列约束) 12 ALTER TABLE teacher CHANGE age age1 INT(1) -- 重命名(一般只用于修改表的列名,这里修改了列类型可能出错,当赋值了varchar类型后不能转换为int类型)
(7)删除数据库中的表
(7.1)格式:
1 DROP TABLE [IF EXISTS] 表名
(7.2)案例:
-- 删除表 DROP TABLE [IF EXISTS] teacher
注:当表不存在时,如果不写if exists会报错
(8)查看数据库表的结构
1 -- 查看表的结构 2 DESCRIBE teacher 3 -- 简写 4 DESC teacher
3.操作数据库中表的数据
(1)外键
(1.1)外键概念
- 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。
- 在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。
- 注意:
- 外键不要一定是另一个表的主键,但必须是唯一性索引。
- 主键约束和唯一性约束都是唯一性索引。
(1.2)外键作用
- 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据,约束。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。
(1.3)创建外键
- 方式一:建表时指定外键约束
- 方式二:建表后修改外键约束
(1.3.1)建表时指定外键约束
-
创建年级表,然后在创建学生表,年级表中的id为学生表年级的外键。
- 其中关键为:声明外键和指定约束 KEY `FK_gradeid` (`gradeid`), CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
- 注意:删除主表grade时必须先删除与它相关的从表,然后再删除主表。
1 # 年级表(id\年级名称) 2 CREATE TABLE `grade` ( 3 `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID', 4 `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称', 5 PRIMARY KEY (`gradeid`) 6 ) ENGINE=INNODB DEFAULT CHARSET=utf8 7 8 # 学生信息表 9 #(学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号) 10 11 CREATE TABLE `student` ( 12 `studentno` INT(4) NOT NULL COMMENT '学号', 13 `studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名', 14 `sex` TINYINT(1) DEFAULT '1' COMMENT '性别', 15 `gradeid` INT(10) DEFAULT NULL COMMENT '年级', 16 `phoneNum` VARCHAR(50) NOT NULL COMMENT '手机', 17 `address` VARCHAR(255) DEFAULT NULL COMMENT '地址', 18 `borndate` DATETIME DEFAULT NULL COMMENT '生日', 19 `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱', 20 `idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号', 21 PRIMARY KEY (`studentno`), 22 KEY `FK_gradeid` (`gradeid`), 23 CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`) 24 ) ENGINE=INNODB DEFAULT CHARSET=utf8
(1.3.2)建表后修改外键约束
- 先建立年级表,再建立学生表,最后绑定外键约束
- 基本语法:alter table 从表名 add constraint 约束名 foreign key(从表中作为外键的列名) references 主表名(主表中的列名)
# 年级表(id\年级名称) CREATE TABLE `grade` ( `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级ID', `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称', PRIMARY KEY (`gradeid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 # 学生信息表 #(学号,姓名,性别,年级,手机,地址,出生日期,邮箱,身份证号) CREATE TABLE `student` ( `studentno` INT(4) NOT NULL COMMENT '学号', `studentname` VARCHAR(20) NOT NULL DEFAULT '匿名' COMMENT '姓名', `sex` TINYINT(1) DEFAULT '1' COMMENT '性别', `gradeid` INT(10) DEFAULT NULL COMMENT '年级', `phoneNum` VARCHAR(50) NOT NULL COMMENT '手机', `address` VARCHAR(255) DEFAULT NULL COMMENT '地址', `borndate` DATETIME DEFAULT NULL COMMENT '生日', `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱', `idCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号', PRIMARY KEY (`studentno`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 # 创建外键方式二 : 创建子表完毕后,修改子表添加外键 ALTER TABLE student ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`);
以上操作都是物理外键(数据库级别的外键),小型数据库不在乎效率使用物理外键,大型数据库不建议这么使用!
大型数据库最佳实践:
- 数据库就是单纯的表,只用来存储数据,只有行(记录)和列(字段)
- 我们想使用多张表的数据,想使用外键则通过程序去实现
(1.4)删除外键
(1.4.1)删除主表:需要先删除具有外键的从表,再删除主表
(1.4.2)删除从表的外键约束:先删除从表的外键,再删除从表的索引
1 # 删除外键 2 ALTER TABLE student DROP FOREIGN KEY FK_gradeid; 3 # 发现执行完上面的,索引还在,所以还要删除索引 4 # 注:这个索引是建立外键的时候默认生成的 5 ALTER TABLE student DROP INDEX FK_gradeid;
(2)DML语言:(重点)
(2.1)数据库的意义
- 数据存储
- 数据管理
(2.2)DML语言:数据操作语言
- 增:insert
- 删:delete
- 改:update
(2.3)增加:insert
(2.3.1)语法:
INSERT INTO 表名[(字段1,字段2,字段3,...)] VALUES('值1','值2','值3', ...),('值1','值2','值3', ...), ...
(2.3.2)注意事项:
- 字段名和值之间都必须用英文逗号隔开
- 字段名可以省略,但是字段值必须与表结构中的字段值一一对应
- 可同时插入多条记录,用小括号和逗号隔开
(2.3.3)用例:
1 INSERT INTO grade(gradename) VALUES ('大一'); 2 3 # 主键自增,那能否省略呢? 4 INSERT INTO grade VALUES ('大二'); 5 6 # 查询:INSERT INTO grade VALUE ('大二')错误代码: 1136 7 # Column count doesn`t match value count at row 1 8 9 # 得出结论:'字段1,字段2...'该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致. 10 11 # 一次插入多条数据 12 INSERT INTO grade(gradename) VALUES ('大三'),('大四');
(2.4)删除:delete
(2.4.1)语法:
- delete
- DELETE FROM 表名 [WHERE condition];
- 注意 : condition为筛选条件 , 如不指定则删除该表的所有列数据
- turncat
- TRUNCATE [TABLE] table_name;
- 用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ;
(2.4.2)注意事项:
- 相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
- 不同 :
- 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
- 使用TRUNCATE TABLE不会对事务有影响
(2.4.3)用例:
1 # 创建一个测试表 2 CREATE TABLE `test` ( 3 `id` INT(4) NOT NULL AUTO_INCREMENT, 4 `coll` VARCHAR(20) NOT NULL, 5 PRIMARY KEY (`id`) 6 ) ENGINE=INNODB DEFAULT CHARSET=utf8 7 8 # 插入几个测试数据 9 INSERT INTO test(coll) VALUES('row1'),('row2'),('row3'); 10 11 # 删除表数据(不带where条件的delete) 12 DELETE FROM test; 13 # 结论:如不指定Where则删除该表的所有列数据,自增当前值依然从原来基础上进行,会记录日志. 14 15 # 删除表数据(truncate) 16 TRUNCATE TABLE test; 17 # 结论:truncate删除数据,自增当前值会恢复到初始值重新开始;不会记录日志. 18 19 # 同样使用DELETE清空不同引擎的数据库表数据.重启数据库服务后 20 # InnoDB : 自增列从初始值重新开始 (因为是存储在内存中,断电即失) 21 # MyISAM : 自增列依然从上一个自增数据基础上开始 (存在文件中,不会丢失)
(2.5)修改:update
(2.5.1)语法: UPDATE 表名 SET column_name=value [,column_name2=value2,...] [WHERE condition];
(2.5.2)注意事项:
- column_name 为要更改的数据列
- value 为修改后的数据 , 可以为变量 , 具体指 , 表达式或者嵌套的SELECT结果
- condition 为筛选条件 , 如不指定则修改该表的所有列数据
(2.5.3)用例:
1 UPDATE `student` SET `studentname`='小明',`gradeid`= 1 WHERE `studentname`='明明' AND studentno = 1; 2 UPDATE `student` SET `borndate`= CURRENT_TIME WHERE `studentname`='红红'
(2.5.4)where条件字句:可以简单的理解为 : 有条件地从表中筛选数据
转载:https://www.cnblogs.com/hellokuangshen/p/10250196.html