网站开发日志

2009年10月8日星期四

mysql命令行 - 删除表

上一节我们学习了如何删除表的条目。我们学到如果不加条件,表里的全部条目将全部被删除,但是这个操作不会删除表;表及其结构依然存在于数据库。这一节里我们要学习:

如何彻底地删除表?

如果你确定不再需要一个表了,你可以使用DROP。语法如下:

DROP TABLE tablename

例如,我们要把这个系列用到的表employee_data删除,我们可以用到:

DROP TABLE employee_data;
Query OK, 0 rows affected (0.01 sec)

好了,把eomplyee表删除也意味着这个mysql命令行系列的结束。在这个系列里我们一起学习了mysql的一些非常基本的查询语句,希望对mysql初学者可以提供一些帮助。当然在实际运用中,你往往要用到一些复杂的查询语句,但是万丈高楼平地起,相信在你掌握了这些基本知识以后,学习高级的mysql查询语句也不会太难。

最后要感谢这个系列教程的原版:http://www.webdevelopersnotes.com/tutorials/sql/index.php3。虽然有些章节我加入一些知识点,但是大部分都是翻译自这套mysql在线教程。

标签: ,

2009年10月6日星期二

mysql命令行 - 删除条目

在这一节里,我们要学习:

如何删除条目?

mysql删除条目用到DELETE,删除语句必须含有表的名称,通常我们还加上条件。如下:

DELETE from table_name [WHERE conditions];

注意:如果没有提供条件,那么表里的所有条目都将别删除!!!

例如我们有一个员工离开公司,我们用下面语句把该员工的数据从employee_data这个表里删除:

DELETE from employee_data    
WHERE emp_id = 10;
Query OK, 1 row affected (0.00 sec)

注意:因为个员工的ID是独一无二的,所以我们用emp_id作为条件。

如果你真的要删除表里所有条目,你可以使用DELETE FROM table_name,但是DELETE语句不能把表的Auto Increment列的值重新设为初始值(1)。如果你想彻底的删除表里的内容,建议使用TRUNCATE。语法如下:

TRUNCATE TABLE tablename;

注意:TRUNCATE在一些旧版本的MySQL表里也不能把Auto Increment列的值重设!

  1. MySQL3.23 MyISAM 表
  2. MySQL4.0 INNODB 表

标签: ,

2009年10月5日星期一

mysql命令行 - 表格联结

到目前为止,mysql命令行系列里用到查询语句都是针对一个表,在这一节里我们要学习:

如何在多个表里查询?

关系型数据库管理系统(RDBMS)的优点在于可以把不同表里的数据关联起来。如果两个表是关联的那么它们比较具备至少一个相关的列。例如:employee_data表的emp_id列和employee_per的e_id列是相关的。我们可以利用这个相关性,从employee_data里查询员工的名字,同时在employee_per里把对于的员工配偶的名字查找出来,如下:

select CONCAT(f_name, " ", l_name) AS Name,
s_name as 'Spouse Name' from
employee_data, employee_per
where m_status = 'Y' AND
emp_id = e_id;
+-----------------+-----------------+
| Name            | Spouse Name     |
+-----------------+-----------------+
| Manish Sharma   | Anamika Sharma  |
| John Hagan      | Jane Donner     |
| Ganesh Pillai   | Sandhya Pillai  |
| Anamika Sharma  | Manish Sharma   |
| John MacFarland | Mary Shelly     |
| Alok Nanda      | Manika Nanda    |
| Paul Simon      | Muriel Lovelace |
| Arthur Hoopla   | Rina Brighton   |
| Kim Hunter      | Matt Shikari    |
| Danny Gibson    | Betty Cudly     |
| Mike Harper     | Stella Stevens  |
| Monica Sehgal   | Edgar Alan      |
| Peter Champion  | Ruby Richer     |
+-----------------+-----------------+
13 rows in set (0.00 sec)

注意:这里我们用到SELECT f_name, l_name, s_name, 但是没有指明f_name或者s_name是那个表里的列。之所以可以这么写是因为f_name,l_name,s_name都是独一无二的列名,所以mysql知道它们指的是那个表里的值。但是在实际运用中,不同的表常常具有相同的列名。为了避免混淆,我们通常要用到标识,如下:

select CONCAT(employee_data.f_name, " ", employee_data.l_name)
AS Name, employee_per.s_name AS 'Spouse Name'
from employee_data, employee_per
where employee_per.m_status = 'Y'
AND employee_data.emp_id = employee_per.e_id;

注意:上述例子里employee_data.f_name指的是employee_data这个表里的f_name列;同理empoyee_per.s_name指的是employee_per表里的s_name列。此外还有另外一种相对简单的写法:

select CONCAT(a.f_name, " ", a.l_name)
AS Name, b.s_name AS 'Spouse Name'
from employee_data a, employee_per b
where a.m_status = 'Y'
AND a.emp_id = b.e_id;

注意:这个我们把employee_data用a来标识,employee_per用b来标识,这样就可以用a.f_name来表示employee_data这个表里的f_name列,是不是要简单许多?

标签: ,

2009年10月3日星期六

mysql命令行 - NULL 和 NOT NULL

NULL代表空值, 它是mysql里一个比较特殊的数据类型。在这一节里我们要学习:

如何处理NULL值?

如果一个列的值被设为NULL,那么我们不可以使用比较操作数作为条件来查询。例如:

SELECT * FROM sometable WHERE somefeild = NULL

上述查询语句是不正确的。mysql提供三种特殊的操作数来处理NULL值。

  1. IS NULL:如果列值为NULL,那么操作数返回真值
  2. IS NOT NULL: 如果列值为不为NULL,那么操作数返回真值
  3. <=>: 全等比较操作数,如何想比较的两个变量全等,那么换回真值,例如:
mysql> select null<=>null;
+-------------+
| null<=>null |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

因此,本文开头例子里的查询语句的正确写法应该是:

SELECT * FROM sometable WHERE somefield IS NULL
//或者
SELECT * FROM sometable WHERE somefield <=> NULL

标签: ,

2009年9月29日星期二

mysql命令行 - 日期的使用

在上一节我对日期这个数据类型做了简单的介绍,在这一节里我们要进一步学习

日期的其它使用方法

首先,要介绍的是日期的排序查询

select e_id, birth_date
from employee_per
ORDER BY birth_date;
+------+------------+
| e_id | birth_date |
+------+------------+
|   11 | 1957-11-04 |
|   16 | 1964-03-06 |
|   21 | 1964-06-13 |
|   14 | 1965-04-28 |
|   15 | 1966-06-23 |
|    7 | 1966-08-20 |
|   10 | 1967-07-06 |
|   20 | 1968-01-25 |
|   12 | 1968-02-15 |
...

上述例子里,我们用到ORDER BY对birth_date列进行排序,这里birth_date列的数据类型是日期(date)

接下来,让我在学习几个MYSQL的内置日期函数。

1. MONTH(date) - 该函数用来获取月份的数字表达(1-12),例如:

select e_id, birth_date
from employee_per
where MONTH(birth_date) = 3;
+------+------------+
| e_id | birth_date |
+------+------------+
|    1 | 1972-03-16 |
|   16 | 1964-03-06 |
+------+------------+
2 rows in set (0.00 sec)

上述例子,我们用MONTH(birth_date) = 3,查询出生月份为三月的员工信息。

2. MONTHNAME(birth_date) - 该函数用来获取月份的英文表达,例如:

select e_id, birth_date
from employee_per
where MONTHNAME(birth_date) = 'January';
+------+------------+
| e_id | birth_date |
+------+------------+
|    8 | 1975-01-12 |
|   19 | 1973-01-20 |
|   20 | 1968-01-25 |
+------+------------+
3 rows in set (0.00 sec)

上述例子,我们用MONTHNAME(birth_date) = 'January', 查询出生月份为一月的员工信息。注意:我们不可以把'January' 写出 'JANUARY',因为MONTHNAME()函数是区分大小写的。

3. 此外我们还可以用到YEAR(date)、DAYOFMONTH(date)来获取年份和月份里的特定天。mysql的日期函数有很多,需要的时候可以参考这里

标签: ,

2009年9月27日星期日

mysql命令行 - 日期数据类型

在前面的mysql命令行系列文章里,我们主要用到两种数据类型:文本(varchar) 和数字(int), 这在一节里我们要学习:

如何使用mysql的日期数据类型?

mysql里的日期是按照年月日来表示的,四位数的年、两位数的月、两位数的日用减号分隔开: YYYY-MM-DD。当我们要在表里加入日期或者查询日期时,都要用到这个格式。

我们可以对日期数据列进行排列,并且使用比较操作数建立日期测试条件进行数据查询。

1. 使用 =!=

select p_email, phone
from employee_per
where birth_date = '1969-12-31';
+---------------------------+---------+
| p_email                   | phone   |
+---------------------------+---------+
| killeratlarge@elmmail.com | 6666666 |
+---------------------------+---------+
1 row in set (0.00 sec)

上述例子里我们对出生日期等于1969-12-31的员工数据,注意日期必须用引号。

2. 使用 >=<=

select e_id, birth_date
from employee_per where
birth_date >= '1970-01-01';
+------+------------+
| e_id | birth_date |
+------+------------+
|    1 | 1972-03-16 |
|    4 | 1972-08-09 |
|    5 | 1974-10-13 |
|    8 | 1975-01-12 |
|   17 | 1970-04-18 |
|   18 | 1973-10-09 |
|   19 | 1973-01-20 |
+------+------------+
7 rows in set (0.00 sec)

标签: ,

2009年9月26日星期六

mysql命令行 - 更新记录

这几天比较忙,今天终于有空继续这个mysql命令行系列。在这一节里,我们要学习:

如何更新表的数据?

mysql里更新表的记录用到UPDATE,基本格式如下:

UPDATE table_name SET
column_name1 = value1,
column_name2 = value2,
column_name3 = value3 ...
[WHERE conditions];

例如我们要在员工数据表里,把CEO的工资从20万提高的22万,同时把额外津贴从5万提高到5.5万,我们可以使用下面的语句:

UPDATE employee_data SET 
salary=220000, perks=55000 
WHERE title='CEO';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

如果我们不知道CEO的先前的工资和额外津贴,但是知道工资要的提高2万、津贴要提高5千。我们还可以这么写:

UPDATE employee_data SET
salary = salary + 20000,
perks = perks + 5000
WHERE title='CEO';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

标签: ,

2009年9月16日星期三

mysql命令行 - 数学函数

除了基本的算术运算象加减乘除(+-*/),mysql还提供许多数学函数。在这一节里我们就要来学习:

mysql的自带数学函数

1.mysql - 求模 MOD(x,y)

select MOD(37, 13);
+-------------+
| MOD(37, 13) |
+-------------+
|          11 |
+-------------+
1 row in set (0.00 sec)

求模数也就求余数,这也可以用模数运算(% - Modulo)来完成,例如:

select 87 % 9;
+--------+
| 87 % 9 |
+--------+
|      6 |
+--------+
1 row in set (0.00 sec)

2. mysql - 求绝对值 ABS(x)

select ABS(-4.05022);
+---------------+
| ABS(-4.05022) |
+---------------+
|       4.05022 |
+---------------+
1 row in set (0.00 sec)
select ABS(4.05022);
+--------------+
| ABS(4.05022) |
+--------------+
|      4.05022 |
+--------------+
1 row in set (0.00 sec)

3. mysql - 判断正负 SIGN(X)

select SIGN(-34.22);
+--------------+
| SIGN(-34.22) |
+--------------+
|           -1 |
+--------------+
1 row in set (0.00 sec)
select SIGN(54.6);
+------------+
| SIGN(54.6) |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)
select SIGN(0);
+---------+
| SIGN(0) |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

根据上述例子,我们可以得知

  1. 如果x是正数,SIGN(x)=1
  2. 如果x是负数或者0, 那么SIGN(x)=0

4. mysql - 求乘方 POWER(x,y)

select POWER(4,3);
+------------+
| POWER(4,3) |
+------------+
|  64.000000 |
+------------+
1 row in set (0.00 sec)

5. mysql - 求平方根 SQRT(x)

select SQRT(3);
+----------+
| SQRT(3)  |
+----------+
| 1.732051 |
+----------+
1 row in set (0.00 sec)

6. mysql - 四舍五入 ROUND(x)ROUND(x,y)

  1. ROUND(x): 把小数四舍五入为整数
  2. ROUND(x,y): 把小数四舍五入到小数点后y位
select ROUND(14.492);
+---------------+
| ROUND(14.492) |
+---------------+
|            14 |
+---------------+
1 row in set (0.00 sec)
select ROUND(4.5002);
+---------------+
| ROUND(4.5002) |
+---------------+
|             5 |
+---------------+
1 row in set (0.00 sec)
select ROUND(-12.773);
+----------------+
| ROUND(-12.773) |
+----------------+
|            -13 |
+----------------+
1 row in set (0.00 sec)
select ROUND(7.235651, 3);
+--------------------+
| ROUND(7.235651, 3) |
+--------------------+
|              7.236 |
+--------------------+
1 row in set (0.00 sec)

7. mysql - 求基值 FLOOR(x)

FLOOR(x)用来求小于或者等于x的最大整数值,例如:

select FLOOR(23.544);
+---------------+
| FLOOR(23.544) |
+---------------+
|            23 |
+---------------+
1 row in set (0.00 sec)
select FLOOR(-18.4);
+--------------+
| FLOOR(-18.4) |
+--------------+
|          -19 |
+--------------+
1 row in set (0.00 sec)

8. mysql - 求顶值 CEILING(x)

CEILING(x)用来求大于或者等于x的最小整数值,例如:

select CEILING(54.22);
+----------------+
| CEILING(54.22) |
+----------------+
|             55 |
+----------------+
1 row in set (0.00 sec)
select CEILING(-62.23);
+-----------------+
| CEILING(-62.23) |
+-----------------+
|             -62 |
+-----------------+
1 row in set (0.00 sec)

9. mysql - 求正弦、余弦、正切 SIN(x), COS(x), TAN(x)

mysql> select SIN(0);
+----------+
| SIN(0)   |
+----------+
| 0.000000 |
+----------+
1 row in set (0.00 sec)
mysql> select tan(90);
+------------------+
| tan(90)          |
+------------------+
| -1.9952004122082 |
+------------------+
1 row in set (0.00 sec)
注意:运用SIN(x), COS(x), TAN(x)的时候,x指的是弧度,而不度数。例如SIN(90) != 1, 因为90这里指的是弧度,而不是直角。

标签: ,

2009年9月15日星期二

mysql命令行 - SELECT的特殊用法

mysql的SELECT命令类似于其他编程语言里的print或者write,你可以用它来显示一个字符串、数字、数学表达式的结果等等。在这一节里我们要学习

如何使用SELECT的特殊功能?

1.显示MYSQL的版本

mysql> select version();
+-----------------------+
| version()             |
+-----------------------+
| 6.0.4-alpha-community |
+-----------------------+
1 row in set (0.02 sec)

2. 显示当前时间

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-09-15 22:35:32 |
+---------------------+
1 row in set (0.04 sec)

3. 显示年月日

SELECT DAYOFMONTH(CURRENT_DATE);
+--------------------------+
| DAYOFMONTH(CURRENT_DATE) |
+--------------------------+
|                       15 |
+--------------------------+
1 row in set (0.01 sec)
SELECT MONTH(CURRENT_DATE);
+---------------------+
| MONTH(CURRENT_DATE) |
+---------------------+
|                   9 |
+---------------------+
1 row in set (0.00 sec)
SELECT YEAR(CURRENT_DATE);
+--------------------+
| YEAR(CURRENT_DATE) |
+--------------------+
|               2009 |
+--------------------+
1 row in set (0.00 sec)

4. 显示字符串

mysql> SELECT "welecome to my blog!";
+----------------------+
| welecome to my blog! |
+----------------------+
| welecome to my blog! |
+----------------------+
1 row in set (0.00 sec)

5. 当计算器用

select ((4 * 4) / 10 ) + 25;
+----------------------+
| ((4 * 4) / 10 ) + 25 |
+----------------------+
|                26.60 |
+----------------------+
1 row in set (0.00 sec)

6. 串接字符串

select CONCAT(f_name, " ", l_name)
AS Name
from employee_data
where title = 'Marketing Executive';
+---------------+
| Name          |
+---------------+
| Monica Sehgal |
| Hal Simlai    |
| Joseph Irvine |
+---------------+
3 rows in set (0.00 sec)
注意:这里用到CONCAT()函数,用来把字符串串接起来。另外,我们还用到以前学到的AS给结果列'CONCAT(f_name, " ", l_name)'起了个假名。

标签: ,