MySxQL可视化工具的常用关键字和乱码问题
使用可视化工具时遇到的一个问题.
昨天我用黑框口储存了一些历史人物信息,今天安装了MySQL的可视化工具SQLyog,在用这个工具打开我之前储存的数据的时候,我发现里面所有的中文数据都变成了乱码了,于是我做了各种有关调试字符集的操作,但依然没有将数据恢复成中文.然后我就上网找答案,网上有各种各样的答案,每一个我几乎都试过了,但依然没有解决我的问题,最后我找了老师才解决了问题. 原因是因为某些编码规则,原来的数据已经无法再变回中文,所以我再改也改不回来了.但之后的添加的数据是可以显示中文的,
如果你以后再用到这类工具的时候,最好先用一些数据测试一下工具的属性,不要直接把数据仍进去.
在数据库查询数据常用的关键字和语法
1.我创建了两张表,一张是部门表,里面有人事部,后勤部,保安部.一张是员工表,里面有6个员工.我在给两张表添加关联的时候出现了问题:alter table ku.yg_table add constraint FK_yg_table FOREIGN KEY ('duishu') REFERENCES bm_table (bid)
什么意思,根本看不懂......过了一会儿,我找出问题所在,(duishu)是我定义的字段,它类名字是用引号快起来的,于是我去检查了一下我定义的字段类型,原来是我把数字类型定义成了字符类型,这件事情告诉了我,类型定义错误可能是以后常会遇到的问题,还有,不管问题的表达形式是中午还是英文,只要耐下性子分析,总能解决问题.
2.成功的完成一对多的表格案例,我又创建了一个数据库,在里面创建了3张表,这次我的需求是让目标形成多对多的关系.我创建了一个学生表,里面有学生的id和姓名,接着我创建了一张课程表,里面有课程的id和课程名,一个学生可以选择多门课程,一门课程也可以被多名学生学习.这就是多对多的关系.要想表达这种关系,我必须再创建一张表,把学生的id和课程的id都放进去,再做的时候我又遇见一个错误,那就是在每次创建关联的时候系统会给一个默认关联名,你在创建第二个关联的时候,依然是那个默认名子,于是名字重复了.还有,通过这次错误,我知道了在哪里看错误信息,我之前一直在最上面,可事实是在下面......
这大概也是粗心之人长犯之错,写下来注意下.
3.这次增加了一个需求,每个学生都有自己的班级,班级和学生的关系是一对多,一个班级可以有多
个学生,一个学生只能有一个班级.建立一对多关系有一个原则:必须在多的那个表里添加一个外键(和外部链接的"键"(代表唯一)).
4.这是一个练习题:实现一个网上商城案例,在商城中会有用户,商品,订单,商品分类。
分析:
它们的流程是:用户---订单---商品
用户和订单的关系:一个用户可以有多个订单,一个订单只能有一个用户,关系为一对多.
商品和订单的关系:一个商品可以有多个订单,一个订单可以有多个商品,关系为多对多.
商品和商品分类:一个类里面可以有多个商品,但普遍一个商品只能属于一个类.关系为一对多.
分析其实写的很对,但是最做的过程中就乱套了,反过来把分析改了好几次,改来改去又改回来了.
多表查询
(查询语句中的*号是所有记录的意思)
交叉查询:SELECT * FROM 表名1,表名2;
内连接查询:
显示内连接:SELECT * FROM 表名1 INNER JOIN 表名2 WHERE 表头名=表头名;
// 查询 * 从 此表到 内部连接的 表2 表头相等的那些.
//如果不加WHERE,得出来的数据有重复(也叫垃圾数据)
隐式内连接:SELECT * FROM 表名1,表名2 WHERE 表头名=表头名;
// 查询 * 从 表1到表2 表头相等的那些.
// 如果不加WHERE,得出来的数据有重复,
外连接:
左外连接:SELECT * FROM 表名1 LEFT OUTER JOIN 表名2 ON 表头名=表头名;
//查询 * 从 表1 的左边外面的链接 打开表2找两个表头里相等的元素.
//如果不加会报错
右外链接:SELECT * FROM 表名1 RIGHT OUTER JOIN 表名2 ON 表头名=表头名;
//查询 * 从 表1 的右边外面的链接 打开表2找两个表头里相等的元素.打开表2找表头相等的.
//如果不加条件会报错.
子查询-IN SELECT * FROM shangping WHERE sid IN(
//查询 所有记录 从 表1 sid里 1,7
//这里括号外的查询条件由括号里面的查询结果决定
//注意:里面如果有多条查询结果,就会报错
SELECT yid FROM yonghu WHERE qian<100000);
//这行语句得出的id是1,7
子查询-EXISTS
SELECT * FROM shangping WHERE sid EXISTS(
//如果括号里面所查询的物品存在,就执行括号外的语句.
SELECT yid FROM yonghu WHERE qian<100000);
子查询-ANY
SELECT * FROM shangping WHERE sid<ANY (
SELECT did FROM dingdan);
//sid大于括号里面的任意数,举个例子:
//括号内id--1,2,3,4 (用这里面任意一个数和它比较,你会发现,用里面最小的数比较是最省事的.)
//括号外id 括号内id
1 > 1 不成立
2 > 1 成立
3 > 1 成立
4 > 1 成立
//得出来的id号就是2,3,4
//有人会问,为什么要用最小的数来比较呢?这里面其实没有什么大不了的逻辑,只是用最小数来比较会省事一些.
//这个WHERE和比较试中间可以加个NOT,为反条件执行.
//我有一个问题:如果把 > 换成 < 结果是什么样的?
子查询--ALL
SELECT * FROM shangping WHERE sid>ALL (
SELECT did FROM dingdan);
//这个比较要求,查询大于括号内所有id的括号外id.
//这个WHERE和比较试中间可以加个NOT,为反条件执行.
查询练习
先找出分均分大于80的人的id,再用COUNT统计一共有多少id
先找出分均分大于80的人的id
SELECT xid FROM chengjibiao GROUP BY xid HAVING AVG(chengji>80)
再用COUNT统计一共有多少id
SELECT COUNT(*) FROM student s WHERE s.xid IN(SELECT xid FROM chengjibiao GROUP BY xid HAVING AVG(chengji>80));
本来还有几个练习,但因为自己太笨,暂时没做出来,于是就只写了一道.
解释部分
这篇文章可以说是笔记,也可以说是我的进化记录,因为在做这些事情的过程中,我在弥补我的思维漏洞.学习这件事,一定要放弃自己智商.智商这东西学习不能靠它.我总觉得自己解决问题是一件很了不起的事情.虽然大多数人认为效率更重要,认为时间是宝贵的,15分钟解决不了一个问题是可耻的.这时候就要请人帮忙,说这叫做面向对象的思想.
但我不是这么定义效率的.我认为的效率是多维度的,而不是一个维度上的15分钟,对于人来说,分析问题的能力可以说是学习能力中最重要的,没有之一.我常常一道题要做很长时间,最长的一次是从中午一点做到晚上八点,于是我就思考,我什么我的速度会这么慢,而有的人10分钟就搞定了.这些差异是怎么来的?
差异来自积累,一切的差异都源自积累,分析能力的差异也必须来自积累.
重新定义效率
下面所说的效率,仅代表学习效率.
你所认为的效率正的是效率吗?上面说了,分析能力是积累出来的,那么请问!你每一次都叫别人来解决问题,你的分析能力从哪里来?所以,你所认为的高效,本质上是用另一个更为重要的方面的低效换来的.我知道一个简单易懂的提高分析能力的方法:
- 遇到问题自己解决
- 解决不了就记录下来,以后解决.
这样一来,虽然你在单位时间解决问题变慢了,但是你在解决问题的时候不仅增长了知识,培养了耐心,还积累了分析能力,这样一来,你是一份努力三份回报,这才是效率吧!
....