您的位置:首页 > 数据库 > MySQL

【MySql】使用记录<五>

2015-08-11 22:10 591 查看
日期型

[code]Year 年(1字节)    95/1995,  [1901-2155],
在insert时,可以简写年的后2位,但是不推荐这样.
[00-69] +2000
[70-99] + 1900,   
即: 填2位,表示 1970 - 2069

Date 日期  1998-12-31
范围: 1000/01/01 ,9999/12/31

Time 时间  13:56:23
范围: -838:59:59 -->838:59:59

datetime 时期时间  1998-12-31 13:56:23
范围: 1000/01//01 00:00:00  ---> 9999:12:31 23:59:59


mysql> create table t(ya year,dt date,tm time,dm datetime);

[code]mysql> select * from t;
+------+------+------+------+
| ya   | dt   | tm   | dm   |
+------+------+------+------+
| 1901 | NULL | NULL | NULL |
+------+------+------+------+
1 row in set (0.00 sec)


mysql> insert into t values(95,’2000-01-03’,’12:12:12’,’1112-02-03 12:12:12’);

Query OK, 1 row affected (0.06 sec)

[code]mysql> select * from t;
+------+------------+----------+---------------------+
| ya   | dt         | tm       | dm                  |
+------+------------+----------+---------------------+
| 1901 | NULL       | NULL     | NULL                |
| 1995 | 2000-01-03 | 12:12:12 | NULL                |
| 1995 | 2000-01-03 | 12:12:12 | 1112-02-03 12:12:12 |
+------+------------+----------+---------------------+


timestamp 自动更新 时间戳

[code]时间戳: 
是1970-01-01 00:00:00 到当前的秒数. 
一般存注册时间,商品发布时间等,并不是用datetime存储,而是用时间戳.
因为datetime虽然直观,但计算不便.


列的默认值

避免列为NULL,使用NOT NULL default ”

值和value要前后对应;

主键与自增

primary key能够区分每一行的,此列不重复;主键一定不重复,不重复的未必是主键;

与auto_increment通常一起出现,但是不是必须的;只有auto_increment是无法生成表格的;

primarty key 和key都是可以的;

id int primary key; // primarty key(id); 语法相同

自增浪费资源,在oracle中是没有的;

案例

所有列,都定长,可以极大提高查询速度.

[code]主键   用户名         性别 体重(KG)   生日  工资     上次登陆      个人简介
id  Username    gender  weight  birth   salary  Lastlogin   intro

列名称             列类型         默认值       是否主键
Id                Int unsigned                     PRI
Username          Varchar(20)                      ''   
gender        Char(1) /tinyint/enum(男/女)        
weight           Tinyint unsigned       
Birth             Date      
Salary            Decimal(8,2)      
lastlogin        Datetime       
intro           Varchar(1500)       

这张表不够好,可以优化
分析:这张表除了username/intro列之外,每一列都是定长的.
我们不妨让其所有列,都定长,可以极大提高查询速度.
列名称             列类型     默认值 是否主键
Id              Int unsigned            PRI
Username         char(20)               ''  
gender          Char(1) /tinyint        
weight        Tinyint unsigned      
Birth              Date     
Salary          Decimal(8,2)        
lastlogin       Int unsigned        

Username char(10) 是会造成空间的浪费,但是提高的速度,值.
Intro char(1500) 却浪费的太多了,另一方面,人的简介,一旦注册完,改的频率也并不高.
我们可以把 intro列单独拿出来,另放一张表里.

列名称      列类型            默认值     是否主键
Id        Int unsigned                   PRI
Username    char(20)                     '' 
intro     Varchar(1500)     

在开发中,会员的信息优化往往是 把频繁用到的信息,优先考虑效率,存储到一张表中.
不常用的信息和比较占据空间的信息,优先考虑空间占用,存储到辅表中.


如何导入外部.sql语句

[code]mysql> source D:/Program Files/mys.sql;
Query OK, 0 rows affected (0.41 sec)

Query OK, 0 rows affected (0.40 sec)
//注意:不要加引号;

也可以:
c:\windows>cd c:\akura\Db Scripts

c:\akura\Db Scripts>mysql -u root -p root

mysql>\. EXECUTER_NEW_USER.sql

here EXECUTER_NEW_USER.sql my file name
//使用.\的方式导入,source属于linux中的语句


删除表

[code]drop table命令用于删除数据表。

drop table命令格式:drop table <表名>;

例如,删除表名为 MyClass 的表:
    mysql> drop table MyClass;


更改表名

[code]mysql> rename table  t3 to t5;
Query OK, 0 rows affected (0.21 sec)

或者:
mysql> alter table t5 rename to t3;
Query OK, 0 rows affected (0.26 sec)


更改属性表

[code]mysql> alter table t3
    -> add height tinyint unsigned not null default 0;
Query OK, 0 rows affected (0.78 sec)
Records: 0  Duplicates: 0  Warnings: 0  //默认在表后 可以使用after

更改列属性:
mysql> alter table t3 change weight tizhong smallint;
Query OK, 0 rows affected (0.62 sec)
Records: 0  Duplicates: 0  Warnings: 0

modify只能更改数据类型 不能更改列名
mysql> alter table t3 modify tizhong int;
Query OK, 0 rows affected (0.59 sec)
Records: 0  Duplicates: 0  Warnings: 0


删除列

[code]mysql> alter table t3 drop column height;
Query OK, 0 rows affected (0.51 sec)
Records: 0  Duplicates: 0  Warnings: 0


视图view

view被称为虚拟表,view是sql的查询结果。查view就相当于查sql语句表。

1.能够权限控制;【只允许某几个列给客户查询】

2.可以开放几列;

3.简化复杂的查询;

4.如何区分表和视图?【视图能不能更新和删除?视图存放到哪里?】

==>更改表必将影响视图的查询结果;

如果虚拟表和表完全是一对一的话,就会相互影响!反之无法更改视图表!【关键看能否映射回去】

[code]mysql> create view vgood as select cat_id,goods_id,goods_name,(market_price-shop_price)as sheng from goods;
Query OK, 0 rows affected (0.19 sec)   //vgood为view的表名


视图algorithm

对于简单查询形成的view,再对view查询是【where,order by】等,可以把建视图的语句+查视图的语句==合并==>查物理表 ====>这种视图的算法叫merge(合并);

视图的语句比较复杂,很难再和查询语句合并,mysql可以先创建语句把结果集形成内存中的临时表,然后再查临时表====>这种视图的算法叫temptable
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: