1)&:与运算,将两个数分别转化成补码,然后进行运算(全1得1,有0出0)。
2)!:非运算,将数字自身取反(转化成补码,按位取反——1变0,0变1)。
3)<<:左移运算符,将某个十进制转换成二进制之后末尾的n个二进制数以此往左移动,溢出的n位用0在末尾补足。
4)>>:带符号右移运算符:将某个十进制转换成二进制之后末尾的n个二进制数以此往右移动,溢出的n位在最前面视情况而定:1补1,0补0,共补n位。
5)>>>:不带符号右移运算符:将某个十进制转换成二进制之后末尾的n个二进制数以此往右移动,溢出的n位在最前面一律补n个0。
int g = a >> 1;// 有符号右移1位,左侧缺的位以符号位补齐,正数就是0, "00000000000000000000000000001101" = 13
int f = b>> 1; // 有符号右移1位,左侧缺的位以符号位补齐,负数就是1, “11111111111111111111111111111111”= -1 ......
一、MySQL 获得当前日期时间 函数
1.1 获得当前日期+时间(date + time)函数:now()
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+
除了 now() 函数能获得当前的日期时间外,MySQL 中还有下面的函数:
current_timestamp()
,current_timestamp
,localtime()
,localtime
,localtimestamp -- (v4.0.6)
,localtimestamp() -- (v4.0.6)
这些日期时间函数,都等同于 now()。鉴于 now() 函数简短易记,建议总是使用 now() 来替代上面列出的函数。
1.2 获得当前日期+时间(date + time)函数:sysdate()
sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:
mysql> select now(), sleep(3), now();
+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------- ......
索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。如果一个表有1000行,这比顺序读取至少快100倍。注意如果你需要访问大部分行,顺序读取要快得多,因为此时我们避免磁盘搜索。
大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B树中存储。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。
字符串自动地压缩前缀和结尾空格。
总的来说,按后面的讨论使用索引。本节最后描述hash索引(用于MEMORY表)的特征。
索引用于下面的操作:
· 快速找出匹配一个WHERE子句的行。
· 删除行。如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引。
· 当执行联接时,从其它表检索行。
· & ......
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。
该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。对于在SELECT语句中其他地方使用的列,必须具有SELECT权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限。
视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为db_name.view_name。
mysql> CREATE VIEW test.v AS SELECT * from t;
表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。
视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由SELECT语句检索的列名将用作视图列名。要想为视图列定义明确的名称,可使用可选的column_list子 ......
一.先看一些最简单的例子
例子
Table A
aid adate
1 a1
2 a2
3 a3
TableB
bid bdate
1 b1
2 b2
4 b4
两个表a,b相连接,要取出id相同的字段
select * from a inner join
b on a.aid = b.bid这是仅取出匹配的数据.
此时的取出的是:
1 a1 b1
2 a2 b2
那么left join 指:
select * from a left join
b on
a.aid = b.bid
取出a表所有数据,拿b的数据与a比较,相同的取出,不同的b取空值取出
此时的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字符
同样的也有right join
select * from a right join
b on
a.aid = b.bid
取出b表所有数据,拿a的数据与b比较,相同的取出,不同的a取空值取出
此时的取出的是:
1 a1 b1
2 a2 b2
4 空字符 b4
注:
都是在on的条件下
二. left join/right join/inner join操作演示
表A记录如下:
aID aNum
1 ......
索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式
保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就
越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至
少要比顺序扫描记录快100倍。
假设我们创建了一个名为people的表:
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );
然后,我们完全随机把1000个不同name值插入到people表。下图显示了people表所在数据文件的一小部分:
可以看到,在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列:
对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录的
peopleid(SQL命令为“SELECT peopleid from people WHERE
name='Mike';”),MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相 ......