发表于: 2017-05-15 21:01:55
3 1228
Task1第一天(2017年5月15日)
今日计划
mysql和navicat的安装,mysql数据类型基本操作学习
完成本任务1-11.
一.参考修真院线下报名贴(学习资料-线下报名-北京报名)中报名的格式,整理出业务模型,确定需要几个对象,每个对象的属性是什么,对象和对象之间的关系是一对一,还是一对多
对象有以下几个:
序号 | 对象 | 数据类型 | |
1 | 姓名 | name | VARCHAR(20) |
2 | VARCHAR(15) | ||
3 | 修真类型 | profession | VARCHAR(50) |
4 | 预计入学时间 | join_date | BIGINT |
5 | 毕业院校 | gschool | VARCHAR(50) |
6 | 线上学号 | online_class | VARCHAR(20) |
7 | 日报链接 | daily_url | TEXT |
8 | 立愿 | oath | TEXT |
9 | 引荐师兄 | VARCHAR(20) | |
10 | 审核师兄 | VARCHAR(20) | |
11 | 辅导师兄 | conselor | VARCHAR(20) |
12 | 从何处了解到的修真院: | resource | TEXT |
1、VARCHAR(M)是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串。其中M代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。因此,对于那些难以估计确切长度的数据对象来说,使用VARCHAR数据类型更加明智。
2、Text——长文本型
最大字符数量:2的31次方 - 1个字符
宽度:定长16,代码中不写长度存放的是文本的指针
3、【百度到的经验】1) VARCHAR L+1个字节,其中L<=M且0 <=M<= 65535
TEXT L+2个字节,其中L< 216
2) 1.尽量用varchar
2.超过255字节的只能用varchar或者text
3.能用varchar的地方不用text(自己理解,使用varchar可以节省空间,因此优先使用varchar)
疑问:1、预计入学时间是一个日期为什么数据类型为BIGINT
第5条提示所有的时间都用long 在数据库里为BIGINT
2、根据前面第三条百度到的经验,似乎都可以使用VARCHAR()作为数据类型。
二.下载并安装及配置Mysql 5.5
http://www.jb51.net/softs/363920.html 脚本之家下载Mysql 5.5.55 for windows (64位)
http://www.cnblogs.com/hikarusun/archive/2012/04/26/2471039.html Mysql安装配置
1、安装已经完成
2、配置系统环境变量\\添加系统环境变量是为了在命令控制窗口里更方便点。
新建:MYSQL_HOME ==> D:\mysql \\需要根据自己安装的地址修改
追加:PATH==>;%MYSQL_HOME%\bin
3、修改MySQL5.5的配置文件,把my-small.ini改名为my.ini进行编辑a)在[mysqld]下追-------
basedir = "d:\\mysql" \\需要根据自己安装的地址修改
datadir = "d:\\mysql\\data" \\需要根据自己安装的地址修改
character-set-server = utf8
-------
b) 在[client]下追加
-------
default-character-set = utf8
4、启动服务
保存my.ini的配置, 然后打开命令行(开始菜单==>运行==>cmd )
输入: mysqld --console 然后回车将看到如下类似内容:
-------
C:\Windows\system32>mysqld --console
120410 14:25:22 [Note] Plugin 'FEDERATED' is disabled.
120410 14:25:22 InnoDB: The InnoDB memory heap is disabled
120410 14:25:22 InnoDB: Mutexes and rw_locks use Windows interlocked functions
120410 14:25:22 InnoDB: Compressed tables use zlib 1.2.3
120410 14:25:22 InnoDB: Initializing buffer pool, size = 128.0M
120410 14:25:22 InnoDB: Completed initialization of buffer pool
120410 14:25:22 InnoDB: highest supported file format is Barracuda.
120410 14:25:22 InnoDB: Waiting for the background threads to start
120410 14:25:23 InnoDB: 1.1.8 started; log sequence number 1595675
120410 14:25:23 [Note] Event Scheduler: Loaded 0 events
120410 14:25:23 [Note] mysqld: ready for connections.
Version: '5.5.22' socket: '' port: 3306 MySQL Community Server (GPL)
-------
==> 证明mysql服务已启动
我进行同样操作出现问题,显示如下:
未能启动。
[ERROR] Can't start server: Bind on TCP/IP port: No such file or directory
[ERROR] Do you already have another mysqld server running on port: 3306 ?
[ERROR] Aborting
端口3306被占用。
百度解决办法: 1、用命令 netstat -ano|findstr "3306" 查看3306占用情况
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 5164
2、用命令taskkill /f /pid 5164杀掉5164
成功: 已终止 PID 为 5164 的进程。
尝试再次启动Mysql
启动成功。
三.下载navicat,或者是Hedisql,连接Mysql
http://dl.dykxgww.com/soft1/navicatformysql.zip 下载
navicat for mysql)10.1.7 绿色中文版
解压完成
连接Mysql成功。
四.创建出来报名贴的业务表,并将表结构粘贴到日报中,对比之前师兄的表结构设计,看看有什么差别
基本一样对象数量略有区别,可能报名模板不一样?
还有我在ID那一行设置了主键,若不设置会无法保存,袁帅师兄所发截图并没有设置,经过尝试,若ID不设置自增则不用设置主键也可以保存。
五.使用navicat设计mysql数据库,数据库的每一个表中都要有三个基本的字段,ID(自增Long),create_at,update_at(所有的时间都用Long)
如上图。
六.从报名贴中找一条最近报名的师弟,用Mysql插入这条数据,并能够根据姓名查出来这条记录
姓名:童志荣
QQ:602840329
修真类型:java工程师
预计入学时间:2017年5月8日
毕业院校:上海应用技术学院
线上学号:java-1827
日报链接:https://www.jnshu.com/daily/22049?uid=11081
立愿:3个月后拿到offer
审核师兄:成都分院-李昂
引荐师兄:成都分院-李昂
从何处了解到的修真院:知乎
在Navicat里录入董志荣同学的信息(疑问:日期如何录入?20170508?)
Select出来很乱,百度学到用\G结尾可以改变显示方式
下面使用insert语句插入另外一条数据
姓名:韩筠宜 name
QQ:512952376 qq
修真类型:前端工程师 profession
预计入学时间:2017年5月18日 join_date
毕业院校:河海大学 gschool
线上学号:css-2508 online_class
日报链接:http://www.jnshu.com/daily/22881?uid=7777 daily_url
立愿:3个月后拿到offer oath
NULL introducer
NULL auditor
辅导师兄:[深圳分院|内门弟子]CSS-覃腾波 conselor
从何处了解到的修真院:知乎 resource
Insert into apply(create_at,update_at,name,qq,profession,join_date,gschool,online_class,daily_url,oath,introducer,auditor,conselor,resource)
Value(“20170515”,“20170515”,”韩筠宜”,”512952376”,”前端工程师”,”20170518”,”河海大学”,”css-2508”,”http://www.jnshu.com/daily/22881?uid=7777”,”3个月后拿到offer ”,”NULL”,”NULL”,”[深圳分院|内门弟子]CSS-覃腾波”,”知乎”);
添加完成,期间遇到问题insert into apply() 与value()中需要一一对应,不然会报错或者录入错误
根据姓名查找记录:select * from apply where name=”董志荣” \G
查找成功。
七.分别用Navciat和Sql语句去将本条数据记录的报名宣言改成老大最帅
Navciat 直接修改oath 就行了。
Sql语句使用update apply set oath=replace(oath,"3个月后拿到offer","老大最帅");
将apply表中的 oath字段中的“3个月后拿到offer”替换为“老大最帅”。
八.将表导出成Sql文件,并使用navciat和Sql分别尝试删除此条数据,并用之前备份的Sql恢复。
首先参考袁帅师兄日记,总结并熟悉一下“插入数据”,“查询数据”,“更新”,“删除”等操作:
向表中插入数据
insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:
insert into 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
查询表中的数据
select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:
select 列名称 from 表名称 [查询条件];
按特定条件查询:
where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;
更新表中的数据
update 语句可用来修改表中的数据, 基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;
删除表中的数据
delete 语句用于删除表中的数据, 基本用法为:
delete from 表名称 where 删除条件;
练习:
插入自己的信息:
姓名:苏笑 name
QQ:233403212 qq
修真类型:java工程师 profession
预计入学时间:2017年5月30日 join_date
毕业院校:天津大学 gschool
线上学号:java-1913 online_class
日报链接:NULL daily_url
立愿:3个月后拿到offer oath
NULL introducer
NULL auditor
辅导师兄:NULL conselor
从何处了解到的修真院:知乎 resource
Insert into apply(create_at,update_at,name,qq,profession,join_date,gschool,online_class,oath,resource)
Value(“20170515”,“20170515”,”苏笑”,”233403212”,”java工程师”,”20170530”,”天津大学”,”java-1913”,”3个月后拿到offer ”,”知乎”);
查询”苏笑”的毕业学校列:
Select gschool from apply where name=”苏笑”;
更新苏笑的立愿为:“学不好JAVA把键盘吃了”
Update apply set oath=”学不好JAVA把键盘吃了” where name=”苏笑”;
导出表结构及表数据mysqldump 用法
命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 數據库名 表名 脚本名;
1、导出數據库為dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚本名為db.sql)
mysqldump -uroot -pdbpasswd -d dbname >db.sql;
2、导出數據库為dbname某张表(test)结构
mysqldump -uroot -pdbpasswd -d dbname test>db.sql;
3、导出數據库為dbname所有表结构及表數據(不加-d)
mysqldump -uroot -pdbpasswd dbname >db.sql;
4、导出數據库為dbname某张表(test)结构及表數據(不加-d)
mysqldump -uroot -pdbpasswd dbname test>db.sql;
现在导出 test数据库里的apply表的结构及数据;
Mysqldump -uroot -p920901 test apply>apply.sql; (经过尝试该命令:导出到当前路径)
Mysqldump -uroot -p920901 test apply>c:\apply.sql; (导出到C盘根目录)
删除oath=”老大最帅” 这一行
已经删除掉了。导入刚刚导出的apply.sql
mysql -u用户名 -p密码 数据库名 < 数据库名.sql
mysql -uroot -p920901 test< C:\Users\Administrator\Desktop\MySQL文件\apply.sql
第一行又回来了。
九.给姓名建索引,思考一下还应该给哪些数据建索引
http://www.jb51.net/article/32149.htm 添加索引教程
1.添加PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
修改表中的索引:
alter table tablename drop primary key,add primary key(fileda,filedb)
给姓名(name)添加索引
alter table apply add index(name);
显示索引:show index from apply;
思考:我认为 qq、修真类型、班级、毕业院校、线上学号,这些内容不需要频繁更新,而且可能会经常作为查询条件,应该添加索引。
十.插入10条数据,查看有索引和无索引的情况下,Sql语句执行的效率
Insert into apply(create_at,update_at,name,qq,profession,join_date,gschool,online_class,daily_url,oath,introducer,auditor,conselor,resource)
Value(“NULL”,“NULL”,”李狗蛋”,”512952376”,”前端工程师”,”20170518”,”清华大学”,”css-2577”,”http://www.jnshu.com/daily/22881?uid=7777”,”两年月薪5万”,”NULL”,”NULL”,”李二狗”,”知乎”),(“NULL”,“NULL”,”王二麻”,”512952376”,”前端工程师”,”20170518”,”哈哈尔滨工业大学”,”css-2587”,”http://www.jnshu.com/daily/22881?uid=7777”,”成为海贼王”,”NULL”,”NULL”,”李大爷”,”知乎”),(“NULL”,“NULL”,”王三麻”,”512952376”,”前端工程师”,”20170518”,”南京大学”,”css-2587”,”http://www.jnshu.com/daily/22881?uid=7777”,”成为码农”,”NULL”,”NULL”,”李大爷”,”知乎”),(“NULL”,“NULL”,”王四麻”,”512952376”,”前端工程师”,”20170518”,”武汉大学”,”css-2587”,”http://www.jnshu.com/daily/22881?uid=7777”,”成为天下第一”,”NULL”,”NULL”,”白大妈”,”知乎”),(“NULL”,“NULL”,”王五麻”,”512952376”,”java工程师”,”20170518”,”南开大学”,”css-2587”,”http://www.jnshu.com/daily/22881?uid=7777”,”成为火影”,”NULL”,”NULL”,”肖大爷”,”知乎”),(“NULL”,“NULL”,”王六麻”,”512952376”,”前端工程师”,”20170518”,”华中科技大学”,”css-2587”,”http://www.jnshu.com/daily/22881?uid=7777”,”成为海贼王的男人”,”NULL”,”NULL”,”王大妈”,”知乎”),(“NULL”,“NULL”,”王七麻”,”512952376”,”前端工程师”,”20170518”,”哈哈尔滨工业大学”,”css-2587”,”http://www.jnshu.com/daily/22881?uid=7777”,”成为海贼王”,”NULL”,”NULL”,”李大爷”,”知乎”);
添加之后有了11条数据:
首先把之前给name添加的索引删除掉
无索引下执行select * from apply where name='王五麻';
给name 添加索引:alter table apply add index(name);
添加索引后执行select * from apply where name='王五麻';
添加索引前后执行时间都是0.00 sec 可能数据太少感受不到区别,之后数据多了再比较
十一.查看深度思考中Mysql相关的一些问题,将自己思考的结果写在日报中,并查阅之前师兄的日报,看看是否有合自己思路接近或者是完全不一致的地方。
为什么DB的设计中要使用Long来替换掉Date类型?
应该是使用Long节省空间,提高效率
自增ID在复制的时候可能会出现重复
而且删除一个之后,再添加新的依然会自增,导致ID不连续
不知道!
什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
创建索引可以大大提高系统的性能。
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引也有许多不利的方面。
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
十二.下载Java 7,并配置环境变量,百度搜索一下JDK和JRE的区别,并将结论用自己的话写在日报中。
JDK用于开发,提供了开发和运行环境
JRE用于运行,只提供了运行环境
明日计划
明日争取将该任务完成。
遇到问题
表中的汉字显示出来是乱码,每次运行前需要输入set names gdk; 才能显示正常,还没找到办法“一劳永逸”。
收获
第一天学习,刚开始没有方向不知道如何下手,看了师兄的日记之后有了突破口,借助网络资源逐步学习,解决问题,感觉不错;
初次接触数据库(其实大学有课,然而没听课),学会了navicat for MySQL 的一些图形操作以及命令行操作,收获颇丰。
评论