zoukankan      html  css  js  c++  java
  • mysql 操作详解


            1.0 创建并选择数据库
            
            2.0 创建表
                VARCHAR适合于name、owner和species列,因为这些列值的长度是可以变化的,这些列的长度不必都相同,而且不必是20。你可以从1到65535选择一个最合理的值作为列属性值的长度。如果选择得不合适,MySQL提供一个ALTER TABLE语句来修改表格(后来证明你需要一个更长的字段)。
                DATE (日期)数据类型    
            
            3.0 将数据加载到表中
            
        2.0 从表检索信息
            1.0 选择所有的数据
                
            2.0 选择特殊行
                
            3.0 选择特殊列
                
            4.0 行分类
            
            5.0 日期计算
                可以使用函数TIMESTAMPDIFF()计算当前日期的年和出生日期之间的差也可以按照直接使用语句(YEAR(CURDATE())-YEAR(birth))计算,其中函数CURDATE()是计算当前的日期。如果当前日期的日历年比出生日期早,则减去一年。以下代码是查询每个宠物的出生日期、当前日期和年龄(以年作为计算单位),其中关键字age是年龄这个计算结果的标签。
                    mysql> SELECT name, birth, CURDATE(),
                        -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
                        -> FROM pet;
                    # 比较这两个查询语句的结果
                    mysql> SELECT name, birth, CURDATE(),
                        -> (YEAR(CURDATE())-YEAR(birth))
                        -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) AS age  
                        -> FROM pet;
                此处,YEAR()提取日期的年部分,RIGHT()提取日期最右面5个字符的MM-DD (月份和日期)部分。MM-DD值的表达式部分的值一般为1或0,如果CURDATE()的年比birth的年早,则年份应减去1。整个表达式看起来有些难懂,使用age来使输出的列标记更有意义。
                尽管查询可行,但是人类的欲望是永无止尽的,如果以某个顺序排列行,那么会使得浏览结果变得更加轻松。添加ORDER BY name子句则能够实现按照名字进行排序输出。
                    mysql> SELECT name, birth, CURDATE(),
                        -> (YEAR(CURDATE())-YEAR(birth))
                        -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
                        -> AS age
                        -> FROM pet ORDER BY name;
                为了按age而非name排序输出,只要再使用一个ORDER BY子句:
                    mysql> SELECT name, birth, CURDATE(),
                        -> (YEAR(CURDATE())-YEAR(birth))
                        -> - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
                        -> AS age
                        -> FROM pet ORDER BY age;
                可以使用一个类似的查询来确定已经死亡动物的死亡年龄。你通过检查death值是否为NULL来确定是哪些动物已经死亡,然后对于那些非NULL值的动物,需要计算出death和birth值之间的差来知道他们在这个世界上所存在的时间:
                    mysql> SELECT name, birth, death,
                        -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))
                        -> AS age
                        -> FROM pet WHERE death IS NOT NULL ORDER BY age;查询使用death IS NOT NULL而非death != NULL,因为NULL是特殊的值,不能使用普通比较符来比较。
                如果你想要知道哪个动物下个月过生日怎么办?对于这类计算,年和天是无关的,你只需要提取birth列的月份部分。MySQL提供几个日期方面的提取函数,例如YEAR()、MONTH()和DAYOFMONTH()。在这里MONTH()是我们需要的函数。为了观察它的实现原理,可以运行以下简单的查询显示birth和MONTH(birth)的值:
                    mysql> SELECT name, birth, MONTH(birth) FROM pet;
                找出下个月生日的动物也很简单。假定当前月是4月,那么月值是4,你需要找在5月出生的动物,方法是:
                    mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
                如果当前月份是12月,就有点复杂了。你不能只把1加到月份数(12)上并寻找在13月出生的动物,因为没有这样的月份。相反,你应寻找在1月出生的动物。
                你甚至可以编写查询,不管当前月份是什么它都能执行。因此不必在查询中使用一个特定的月份,DATE_ADD()允许在一个给定的日期上加上时间间隔。如果在NOW()值上加上一个月,然后用MONTH()提取月份,产生生日所在月份:
                    mysql> SELECT name, birth FROM pet
                        -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
                完成该任务的另一个方法是加1得出当前月份的下一个月(在使用取模函数MOD()后,如果月份当前值是12,则“返回”到值0):
                    mysql> SELECT name, birth FROM pet
                        -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
                --注意,MONTH返回在1和12之间的一个数字,且MOD(something,12)返回在0和11之间的一个数字,因此必须在MOD()后加1,否则我们将从11月(11)跳到1月(1)

            6.0 NULL 值操作
                
            7.0 模式匹配
            
            8.0 计算行数
                数据库经常用于回答这个问题,“查询出某个类型的数据在表中出现的频数是多少?”
                例如,你可能想要知道你有多少宠物,或每位主人有多少宠物,或你可能想要对你的动物进行各种类型的普查。
                计算你拥有动物的总数目与“在pet表中有多少行?”是同样的问题,因为每个宠物都对应一条记录。COUNT(*)函数计算行数,所以计算动物数目的查询应为:
                    mysql> SELECT COUNT(*) FROM pet;
                在前面的章节中,你检索了拥有宠物的人的名字。如果你想要知道每个主人有多少宠物,你也可以使用COUNT(*)函数:
                    mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
                --注意,使用GROUP BY对每个owner的所有记录分组,没有它,你会得到错误消息:
                    mysql> SELECT owner, COUNT(*) FROM pet;
                    ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)
                    with no GROUP columns is illegal if there is no GROUP BY clause
                COUNT(*)和GROUP BY以各种形式分类你的数据。下列例子显示出以不同方式进行动物普查操作。
                查看每种动物的数量:
                    mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
                查看每种性别的动物数量:
                    mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
                按种类和性别组合分类的动物数量:
                    mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
                若使用COUNT(*),你不必检索整个表。例如, 当只对狗和猫进行查询时,应为:
                    mysql> SELECT species, sex, COUNT(*) FROM pet
                        -> WHERE species = 'dog' OR species = 'cat'
                        -> GROUP BY species, sex;
                或,如果你仅需要知道已知性别的按性别分组的动物数目:
                    mysql> SELECT species, sex, COUNT(*) FROM pet
                        -> WHERE sex IS NOT NULL
                        -> GROUP BY species, sex;

            
            9.0 使用一个以上的表
                ?
                    mysql> SELECT pet.name,
                        -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
                        -> remark
                        -> FROM pet, event
                        -> WHERE pet.name = event.name AND event.type = 'litter';
                --关于该查询要注意以下几件事:
                    FROM子句连接两个表,因为查询需要从两个表中提取信息。
                    当从多个表组合(联结)信息时,你需要指定其中一个表中的列明以期匹配其它表的列名。这很简单,因为它们都有一个name列,查询可以通过使用WHERE子句基于name值来匹配两个表中的记录。
                    因为name列都存在两个表中,因此当引用该列时,一定要指定是哪个表,把表名附在列名前即可以实现。 如果你想要将一个表的记录与该表的其它记录进行比较,可以将该表联结到自身。例如,为了在你的宠物之中选择繁殖中的配偶,你可以用pet表联结自身来进行相同种类的雄雌配对:

                    mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
                        -> FROM pet AS p1, pet AS p2
                        -> WHERE p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
                在这个查询中,我们为表名指定别名p1和p2以便能引用它们的列并且使得每一个列的引用更直观。
            
        获得数据库和表的信息

  • 相关阅读:
    嵌入式软件设计第8次实验报告
    嵌入式软件设计第7次实验报告
    140201129-贾杰峰
    java.第二次作业
    java.第一次作业
    故宫博物院参观
    中国国家博物馆参观
    北京鼓楼
    6.1下午数学
    6.1下午
  • 原文地址:https://www.cnblogs.com/mysterious-killer/p/9881732.html
Copyright © 2011-2022 走看看