sql培训内容(精简)
作者:vlife
SQL定义:SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。
SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
db2数据类型
CHAR():定长字符串 最大长度为 254
VARCHAR():变长字符 最大长度为 4000
SMALLINT:短整型数字 长度为 2 字节
INTEGER:整型数字 长度为 4 字节
REAL:单精度浮点 32 位近似值
DOUBLE:双精度浮点 64 位近似值
DECIMAL(m,n):数字 精度为m小数位为n
DATE:日期时间
TIME:日期时间
TIMESTAMP:日期时间
DDL—数据库定义语言:直接提交的。
CREATE:用于创建数据库对象。
DECLARE:除了是创建只在过程中使用的临时表外,DECLARE语句和CREATE语句非常相似。唯一可以被声明的对象是表。并且必须放入用户临时表空间。
DROP:可以删除任何用CREATE(数据库对象)和DECLARE(表)创建的对象。
ALTER:允许修改某些数据库对象的信息。不能修改索引。
下面主要基于对象介绍基本的语法:
1、数据库:
创建数据库:CREATE DATABASE database-name [USING CODESET codeset TERRITORY territory]
注:代码页的问题。
删除数据库:drop database dbname
2、表:
创建新表:
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old
B:create table tab_new as select col1,col2… from tab_old definition only
修改表:
增加一个列:
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。添加主键:
Alter table tabname add primary key(col)
删除主键:
Alter table tabname drop primary key(col)
删除表:drop table tabname
3、表空间:
创建表空间:create tablespace tbsname pagesize 4k managed by database using (file ‘file’ size)
表空间加入容器:alter tablespace tablespace_name add(file 'filename' size)
注:该操作是不可逆的,加入容器后将不能将其删除,因此在加入的时候注意。
删除表空间:drop tablespace tbsname
4、索引:
创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
5、视图:
创建视图:create view viewname as select statement
删除视图:drop view viewname
注:视图唯一能修改的是引用类型列,改变列的范围。其他定义好了都不能修改。当视图基于的基表drop后,视图变为无效。
DML—数据库操纵语言,它不隐式地提交当前事务 ,是否提交视环境设定而定。
SELECT:从表中查询符合数据
注:条件中连接的问题,避免出现笛卡儿乘积
DELETE:删除已有表的数据
UPDATE:更新已有表的数据
INSERT:向已有表中插入数据
注:DELETE,UPDATE和INSERT是否直接提交取决与执行语句所在的环境。
在执行时注意事务日志满的情况。
1、select时,注意索引谓词和非索引谓词,尽量在有索引的列上使用索引谓词。
谓词类型 可索引 注 释
Col∝con Y ∝代表>;,>;=,=,<=,<,但是<>;不是可索引的。
Col between con1 and con2 Y 在匹配系列中必须是最后的。
Col in list Y 仅对一个匹配列
Col is null Y
Col like ‘xyz%’ Y 模糊匹配%在后面。
Col like ‘%xyz’ N 模糊匹配%在前面。
Col1∝Col2 N Col1和col2来自同一个表
Col∝Expression N 例如:c1(c1+1)/2
Pred1 and Pred2 Y Pred1和Pred2都是可索引的,指相同索引的列
Pred1 or Pred2 N 除了(c1=a or c1=b)外,他可以被认为是c1 in(a,b)
Not Pred1 N 或者任何的等价形式:Not between,Not in,Not like等等。
使用索引的例子介绍:
<1>;、单个表上索引查询的介绍 :
A:select * from t1 where c1 = 10;
在c1列上无索引,如何检索
在c1列上有索引,如何检索
B:select * from t1 where c1 =10 and c2 between 5 and 10 and c3 like ‘A%’
仅在c1列上有索引
在c1,c2和c3列上有单独的索引
在c1,c2和c3列上有联合索引
此处可以填加索引匹配规则和高级规则,比较难理解!!
<2>;、两个或多个表上索引查询的介绍:
(1)、使用循环嵌套法执行查询
A:select t1.c1,t1.c2,t2.c3,t2.c4 from t1,t2 where t1.c1=10 and t1.c2 =t2.c3
介绍查询的方法,看看哪列上最需要索引。
B:select t1.c1,t1.c2,t2.c3,t2.c4 from t1,t2 where t1.c1=10 and t2.c4 = 10 and t1.c2 =t2.c3
(2)、使用归并连接执行连接查询
例:select t1.c1,t1.c2,t2.c3,t2.c4 from t1,t2 where t1.c1=10 and t2.c4 = 10 and t1.c2 =t2.c3
(3)、三个以上的表进行连接查询采取的规则或者方法
(2)、GROUP BY:实现简单分组的功能,当用group by时,查询选择列中除了在group by中出现的和常量外,其他的列上要用分组函数。可以使用一些分组函数实现一些列不在group by中出现,min,max等。
(3)、HAVING的使用,对一些分组列进行条件判断。
(4)、ORDER BY子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDER BY 子句指定的表达式的值确定。
2、DELETE:从表中删除记录
语法格式:
DELETE FROM tablename WHERE (conditions)
3、INSERT:向表中插入记录
语法格式:
INSERT INTO tablename (col1,col2,…) VALUES (value1,value2,…);
INSERT INTO tablename (col1,col2,…) VALUES (value1, value2,…), (value1, value2,…),……
Insert不会等待任何程序,不会导致锁定。
4、UPDATE:
语法格式:
UPDATE tabname SET (col1=values1,col2=values2,…) WHERE (conditions);
注:update的速度比较慢,要在相应列上建立索引。
DCL—数据控制语言
GRANT—授予用户权限
REVOKE—撤消用户权限
COMMIT—提交事务,可以使数据库的修改永久化
ROLLBACK—回滚事务,消除上一个COMMIT命令后的所做的全部修改,使得数据库的内容恢复到上一个COMMIT执行后的状态.。
1、GRANT:所有着或者管理员把访问权限赋给其他用户
语法格式:
grant [all privileges|privileges,….] on tabname | viewname to [public|user,….]
2、REVOKE:取消某一用户的某中访问权限
语法格式:
Revoke [all privileges|privileges,….] on tabname | viewname from [public|user,….]
注:不能取消实例级别的用户的任何权限,他们不是通过grant授权的,是通过组实现的权限。
3、COMMIT:把事务中所做的修改永久化记录到数据库。
语法格式:
commit [work]
4、ROLLBACK:将上次提交以来所做的更改全部撤消。
语法格式:
Rollback [work]
高级sql简单介绍
一、查询间使用运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
二、外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
注:复合外连接按照从左到右的顺序执行连接,左边连接的结果集和右边连接
三、超级分组和移动函数
A:grouping sets:用来在单个sql中形成多级分组。
例:select company_id,node_id,count(customer_id) from customer group by grouping sets(company_id,node_id)
B:rollup:可以在单个数据库操作中形成多个分组。
例:select company_id,node_id,count(customer_id) from customer group by rollup(company_id,node_id)
注:rollup操作不是可交换的操作,指定用户组的顺序是很重要的。
C:cube: 生成分组表中分组的所有组合。
例:select company_id,node_id,count(customer_id) from customer group by cube(company_id,node_id)
D:over:移动函数可以帮助实现移动的数据分析
Select date,avg(qty) over(order by date rows between 1 preceding and 1 following) as values from sale
附录:常用函数介绍
1、类型转化函数:
转化为数字类型的:
decimal, double, Integer, smallint,real
Hex(arg):转化为参数的16进制表示。
转化为字符串类型的:
char, varchar
Digits(arg):返回arg的字符串表示法,arg必须为decimal。
转化为日期时间的:
date, time,timestamp
2、时间日期:
year, quarter, month, week, day, hour, minute ,second
dayofyear(arg):返回arg在年内的天值
Dayofweek(arg):返回arg在周内的天值
days(arg):返回日期的整数表示法,从0001-01-01来的天数。
midnight_seconds(arg):午夜和arg之间的秒数。
Monthname(arg):返回arg的月份名。
Dayname(arg):返回arg的星期。
3、字符串函数:
length,lcase, ucase, ltrim, rtrim
Coalesce(arg1,arg2….):返回参数集中第一个非null参数。
Concat (arg1,arg2):连接两个字符串arg1和arg2。
insert(arg1,pos,size,arg2):返回一个,将arg1从pos处删除size个字符,将arg2插入该位置。
left(arg,length):返回arg最左边的length个字符串。
locate(arg1,arg2,<pos>
:在arg2中查找arg1第一次出现的位置,指定pos,则从arg2的pos处开始找arg1第一次出现的位置。
posstr(arg1,arg2):返回arg2第一次在arg1中出现的位置。
repeat(arg1 ,num_times):返回arg1被重复num_times次的字符串。
replace(arg1,arg2,arg3):将在arg1中的所有arg2替换成arg3。
right(arg,length):返回一个有arg左边length个字节组成的字符串。
space(arg):返回一个包含arg个空格的字符串。
substr(arg1,pos,<length>
:返回arg1中pos位置开始的length个字符,如果没指定length,则返回剩余的字符。
4、数学函数:
Abs, count, max, min, sum
Ceil(arg):返回大于或等于arg的最小整数。
Floor(arg):返回小于或等于参数的最小整数。
Mod(arg1,arg2):返回arg1除以arg2的余数,符号与arg1相同。
Rand():返回1到1之间的随机数。
Power(arg1,arg2):返回arg1的arg2次方。
Round(arg1,arg2):四舍五入截断处理,arg2是位数,如果arg2为负,则对小数点前的数做四舍五入处理。
Sigh(arg):返回arg的符号指示符。-1,0,1表示。
truncate(arg1,arg2):截断arg1,arg2是位数,如果arg2是负数,则保留arg1小数点前的arg2位。
5、其他:
nullif(arg1,arg2):如果2个参数相等,则返回null,否则,返回参数1
摘要: 1.DB2
产品的级别有那些
?
企业版的
NTERPRISEEDITION
工作组版
WORKGROUPEDITION
企业扩展版
ENTERPRISEEXTENDEDEDITION
个人版的
PERSONALEDITION
卫星版的
SATELL...
阅读全文
函数名 说明
AVG() 返回一组数值的平均值
VAR(), 返回一组数值的方差
ASCII() 返回整数参数最左边的字符的ASCII码
BIGINT() 返回整型常量中的数字或字符串的64位整数表示
CHAR() 返回日期时间型,字符串,整数,十进制或双精度浮点数的字符串表示
CHR() 返回具有由参数指定的ASCII码的字符
CONCAT(str1,str2) 返回两个字符串的连接
YEAR() 返回数值的年部分
UCASE() 返回字符串的大写
TIME() 返回一个数值中的时间
SUBSTR(EXP1,EXP2) 返回EXP1串自EXP2处开始的子串
SECOND() 返回一个数值的秒部分
RTRIM() 删除字符串尾部的空格
ROUND(EXP1,EXP2) 返回EXP1小数点右边的第EXP2位置处开始的四舍五入值
REPLACE(EXP1,EXP2,EXP3) 用EXP3替代EXP1中所有的EXP2
REAL() 返回一个数值的单精度浮点数表示
RAND() 返回0和1之间的随机浮点数
POSSTR(EXP1,EXP2) 返回EXP2在EXP1中的位置
MONTH() 返回一个数值的月部分
MOD(EXP1,EXP2) 返回EXP1除以EXP2的余数
MINUTE() 返回一个数值的分钟部分
LTRIM() 删除字符串前面的空格
HOUR() 返回一个数值的小时部分
在現實的DB2應用中大家可能經常會遇到一些錯誤,錯誤的原因是對DB2的
限制不太了解而引起的,在此我簡單地總結一下,歡迎大家繼續﹐以便和大家共享﹐
共同探討﹐共同近步﹗(以下主要以DB2 7.X為例)。
1. CHAR 的最大長度(字節數)<=254
2. VARCHAR 的最大長度(字節數)<=32672
3. LONG VARCHAR 的最大長度(字節數)<=32700
4. CLOB 的最大長度(字節數)<=2147483647
5. GRAPHICCHAR 的最大長度(字節數)<=127
6. VARGRAPHIC 的最大長度(字節數)<=16336
7. LONG VARGRAPHIC 的最大長度(字節數)<=16350
8. DBCLOB 的最大長度(字節數)<=1073741823
9. BLOB 的最大長度(字節數)<=2147483647
10. 字符常量的最大長度(字節數)<=32672
11. 圖形常量的最大長度(字節數)<=16336
12. 串聯字符串的最大長度(字節數)<=2147483647
13. 串聯圖形串的最大長度(字節數)<=1073741823
14. 串聯二進制串的最大長度(字節數)<=2147483647
15. 十六進制常量數字的最大長度(字節數)<=16336
16. 分類注釋的最大長度(字節數)<=254
17. 運行時結构類型列對象的最大長度(字節數)<=1
DAYNAME 返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。
DAYOFWEEK 返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期日。
DAYOFWEEK_ISO 返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期一。
DAYOFYEAR 返回参数中一年中的第几天,用范围在 1-366 的整数值表示。
DAYS 返回日期的整数表示。
JULIAN_DAY 返回从公元前 4712 年 1 月 1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。
MIDNIGHT_SECONDS 返回午夜和参数中指定的时间值之间的秒数,用范围在 0 到 86400 之间的整数值表示。
MONTHNAME 对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。
TIMESTAMP_ISO 根据日期、时间或时间戳记参数而返回一个时间戳记值。
TIMESTAMP_FORMAT 从已使用字符模板解释的字符串返回时间戳记。
TIMESTAMPDIFF 根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。
TO_CHAR 返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是 VARCHAR_FORMAT 的同义词。
TO_DATE 从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是 TIMESTAMP_FORMAT 的同义词。
WEEK 返回参数中一年的第几周,用范围在 1-54 的整数值表示。以星期日作为一周的开始。
WEEK_ISO 返回参数中一年的第几周,用范围在 1-53 的整数值表示。
要使当前时间或当前时间戳记调整到 GMT/CUT,则把当前的时间或时间戳记减去当前时区寄存器:
current time - current timezone
current timestamp - current timezone
给定了日期、时间或时间戳记,则使用适当的函数可以单独抽取出(如果适用的话)年、月、日、时、分、秒及微秒各部分:
YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)
因为没有更好的术语,所以您还可以使用英语来执行日期和时间计算:
current date + 1 YEAR
current date + 3 YEARS + 2 MONTHS + 15 DAYS
current time + 5 HOURS - 3 MINUTES + 10 SECONDS
从时间戳记单独抽取出日期和时间也非常简单:
DATE (current timestamp)
TIME (current timestamp)
而以下示例描述了如何获得微秒部分归零的当前时间戳记:
CURRENT TIMESTAMP - MICROSECOND (current timestamp) MICROSECONDS
如果想将日期或时间值与其它文本相衔接,那么需要先将该值转换成字符串。为此,只要使用 CHAR() 函数:
char(current date)
char(current time)
char(current date + 12 hours)
要将字符串转换成日期或时间值,可以使用:
TIMESTAMP ('2002-10-20-12.00.00.000000')
TIMESTAMP ('2002-10-20 12:00:00')
DATE ('2002-10-20')
DATE ('10/20/2002')
TIME ('12:00:00')
TIME ('12.00.00')
TIMESTAMP()、DATE() 和 TIME() 函数接受更多种格式。上面几种格式只是示例,我将把它作为一个练习,让读者自己去发现其它格式。
有时,您需要知道两个时间戳记之间的时差。为此,DB2 提供了一个名为 TIMESTAMPDIFF() 的内置函数。但该函数返回的是近似值,因为它不考虑闰年,而且假设每个月只有 30 天。以下示例描述了如何得到两个日期的近似时差:
timestampdiff (<n>, char(
timestamp('2002-11-30-00.00.00')-
timestamp('2002-11-08-00.00.00')))
对于 <n>,可以使用以下各值来替代,以指出结果的时间单位:
1 = 秒的小数部分
2 = 秒
4 = 分
8 = 时
16 = 天
32 = 周
64 = 月
128 = 季度
256 = 年
当日期很接近时使用 timestampdiff() 比日期相差很大时精确。如果需要进行更精确的计算,可以使用以下方法来确定时差(按秒计):
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
为方便起见,还可以对上面的方法创建 SQL 用户定义的函数:
CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP)
RETURNS INT
RETURN (
(DAYS(t1) - DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) - MIDNIGHT_SECONDS(t2))
)
@
如果需要确定给定年份是否是闰年,以下是一个很有用的 SQL 函数,您可以创建它来确定给定年份的天数:
CREATE FUNCTION daysinyear(yr INT)
RETURNS INT
RETURN (CASE (mod(yr, 400)) WHEN 0 THEN 366 ELSE
CASE (mod(yr, 4)) WHEN 0 THEN
CASE (mod(yr, 100)) WHEN 0 THEN 365 ELSE 366 END
ELSE 365 END
END)@
最后,以下是一张用于日期操作的内置函数表。它旨在帮助您快速确定可能满足您要求的函数,但未提供完整的参考。有关这些函数的更多信息,请参考 SQL 参考大全。
SQL 日期和时间函数
DAYNAME 返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。
DAYOFWEEK 返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期日。
DAYOFWEEK_ISO 返回参数中的星期几,用范围在 1-7 的整数值表示,其中 1 代表星期一。
DAYOFYEAR 返回参数中一年中的第几天,用范围在 1-366 的整数值表示。
DAYS 返回日期的整数表示。
JULIAN_DAY 返回从公元前 4712 年 1 月 1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。
MIDNIGHT_SECONDS 返回午夜和参数中指定的时间值之间的秒数,用范围在 0 到 86400 之间的整数值表示。
MONTHNAME 对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。
TIMESTAMP_ISO 根据日期、时间或时间戳记参数而返回一个时间戳记值。
TIMESTAMP_FORMAT 从已使用字符模板解释的字符串返回时间戳记。
TIMESTAMPDIFF 根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。
TO_CHAR 返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是 VARCHAR_FORMAT 的同义词。
TO_DATE 从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是 TIMESTAMP_FORMAT 的同义词。
WEEK 返回参数中一年的第几周,用范围在 1-54 的整数值表示。以星期日作为一周的开始。
挺身而上
主唱:秦勇
演奏:北京青年演奏家交响乐团
音乐录音:马丁(小)
从来不甘心,平平常常
却为什么苦守在这个地方
有时也想想,过得怎样
面对着所有人我坦坦荡荡
青春与你共享
苦恼先放一放
危难中发出力量
就是现在,就是我们,挺身而上
亲爱的战友你在何方
心中多少话儿要对你讲
我还是相信地久天长
风雨路上有你和我一起前往
男儿绝不退让
做一回生死较量
重任由谁来担当
就是现在就是我们挺身而上
男儿绝不退让
做一回生死较量
重任由谁来担当
就是现在就是我们挺身而上
男儿绝不退让
做一回生死较量
重任由谁来担当
就是现在就是我们挺身而上
今日在网上闲逛,偶得一文章,感觉很不错。对正在工作中的年轻人很有帮助,现发表在此。
给年轻工程师的十大忠告
诸位,咱当电子工程师也是十余年了,不算有出息,环顾四周,也没有看见几个有出息的!回顾工程师生涯,感慨万千,愿意讲几句掏心窝子的话,也算给咱们师弟师妹们提个醒,希望他们比咱们强!
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!
[2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!
[3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!
[4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!
[5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!
[6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!
[7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,尽管你可能技术不错!
[8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!
[9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...
[10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功!
我很长一段时间都在煎熬中度过,已经快到而立之年,对自己的发展方向、前途却还很迷茫。这么多年来,我一直受兴趣指引,走了很长的路,或曲或直,但我从来没有后悔过。可决定未来的方向却让我痛苦不已。
1987年,我开始在CONMAX(记得不是很清楚了)机器上学习BASIC,从此和程序语言结下了不解之缘。当时学校仅有两台苹果II型电脑,我们连碰的机会都没有。CONMAX机器开机就是BASIC,没有操作系统,没有磁盘(使用录音机记录程序),在这样的机器上,我和我的同学们用SHAPE命令编程序在屏幕上写自己的名字,写赛车游戏、碰碰球游戏。编程给我带来了无穷的乐趣。
93年考入大学,因为当时外贸非常热门,我放弃了感兴趣的自动化专业、机械专业,开始学习工业外贸。由于是工业外贸,所以在课程设置上包含了机械、电子、经济、英语、外贸等方向的多门课程。凭着自己的兴趣,在机械相关的课程上,我的平均成绩不在97分之下(画法几何还考了100分)。这也奠定了后来学习Auto CAD、3DS MAX的基础。电子类课程成绩也不错,基本上都是班中第一。我对外语和外贸并不是很感兴趣,但在周围同学的强大压力下,还是以73.5分的成绩通过了六级考试,并在全院第一个拿到了BEC2的证书,更没想到的是5年后我竟然成为了BEC的口语考官。
大学的生活非常紧张,除了在学生会任职之外,我还把学校中所有的计算机培训班课程学了一个遍,在这期间我接触了PASCAL、C语言、FoxBASE、FoxPro,也为我参加数学建模竞赛奠定了计算机基础。1995年,学校组队参加全国大学生数学建模竞赛,我没有被选中。在强烈要求下,我作为旁听生参加了近一年半的数学建模的培训。虽经过艰苦的准备,但最终由于一个小失误导致我们组在全国大学生数学建模竞赛上只拿到了河北省二等奖。为了挽回失去的荣誉,我放弃了考研,毅然决定与队友参加美国大学生数学建模竞赛,并最终取得了一等奖的好成绩。可笑的是,在参赛获奖的两组六个人中,竟然有三个人是当时的“旁听生”。
虽然外贸专业课没有学好,但大学的学习为我的英语、数学、计算机打下了很好的基础,这也是我的兴趣带我到这一步的。毕业后留校,并转行管理信息系统。比起管理信息系统专业的学生来,我欠缺了太多的知识。我把“计算机技术”作为我的专攻方向,不断追赶。VFP、VB、DELPHI、.NET、SQL Server……甚至成为了MCT,在计算机技术上走了很远。
现在,我忽然发现“累”了。我发现我对编程、对计算机技术不象以前那么专注了。我更加感兴趣技术后面的东西:设计模式、分析模式、财务管理、营销策略、企业信息化……想起当时我的老师说管理信息系统是“数学”、“管理”、“计算机”的交叉地带,我现在花了7年的时间才明白“技术”不能代表一切。
很多象我一样对计算机技术“狂热”的人,其中一个原因恐怕是“编程”容易上手,花上个把月的时间就可以学到一些“高深”东西,并且可以编程炫耀一番了。另外,编程是创造的过程,看着自己的想法付诸实现,总会有成就之感,即使程序编写的很糟糕。编程也能处处体现征服困难的喜悦,每当一个问题被解决,心里面总有一种成就感,即使这个问题早就有人解决过了。这也是为什么有人花上大量时间,用尽各种技巧用JavaScript编写一个Web控件,而根本不去琢磨是否有一种智能客户端的技术,可以使用功能丰富的Windows控件。
编程中的这种体会引导着我的兴趣,让我走了很远,也失去了很多。“专注于计算机技术”让很多人放弃了外语、放弃了数学、放弃了管理。很多人说这种放弃是心甘情愿的,你可能花了两年的时间学习英语,然而收获很少,为什么不去学计算机呢,至少能够“速成”,而且喜悦伴随着整个的学习过程。可是,这错了。编程创造的价值是什么呢?当你开发一套系统的时候,这套系统的管理内涵决定了应用信息系统的价值,而不是编程技巧的高低。编程技巧的高低可以决定开发效率,但不能决定企业应用信息系统究竟能带来多大的收益。编程是一种机械性的工作,它里面的创新并不能象优化管理流程一样对企业带来的巨大的利润。Web Service技术也不是凭空出现的,而是应企业应用集成的需求而出现的。
现在的编程技术也降低了编程的门槛(很多人的虚荣心可以更容易的实现了),寒枫天伤有一次推荐自动代码生成的一系列网站,我看了一些,其中“Constructor”软件让程序编写.net系统变的如此容易。应用MDA后恐怕更容易。也许有一天人们不用再写那么多的代码。程序开发员的价值是否也意味着会不断贬值呢?
“开发”阵营的人往往感慨为什么中国程序员没有超过30的,为什么中国没有人能够创造出一门语言来。不再专注于技术不意味着放弃技术。过分专注技术,就会陷入一种“技术成功”做成的陷阱中,最终变成一个“快乐的井底之蛙”。另外,只有知道技术的发展方向,才能更好的专注于技术,而技术的发展方向往往不取决于技术本身。设想有一天,一个跨国公司经营的几千万种商品一小时内完成清点,配货,及时针对竞争对手作出决策,所有这一切都是技术本身的功劳吗?我想不全是,其中一大部分取决于管理。用过ERP产品的程序员都说,其实每个界面都很简单,但ERP的价值不在于编程是否简单,其最重要的价值就是理顺的管理流程,推动了企业的运转。
我跟着兴趣走得太远了,而且这个“兴趣”实际上是“过分关注编程技术”带来的小恩小惠积累起来的,它让我走了条弯路(但我不后悔)。现在这个问题困扰了我太久了,我实在是很难割舍这些“小恩小惠”,可我还要割舍掉。我曾经放弃过自动化、机械选择了工业外贸,也曾经放弃了考研选择了参加美国大学生数学建模竞赛,还曾经放弃了我的大学专业工业外贸转行管理信息系统,现在我也要放弃“专注于技术”,将更多的精力专注在管理、财务、企业信息化上面。我不放弃技术,也会继续在博客园发表技术文章,只是不想再专注于技术这一方面了。