很久没有写sql语句了,今天当需要讲数据库的时候(是的,就是那样~),发现已经手生了,深夜看文档后写下了这篇文章。
这篇文章主要是针对有一定数据库基础知识的盆友。是的,就像走两步是检验脚一样,作为了解数据库的我们,得:写两句。当然,如果是对数据库知之甚少的伙伴,按照本文的示例也能初步感受sql语句的魅力(就那么几句)。数据库版本尤其是商用版本够多,但是基本sql语句都是大同小异,本文主要是针对MySql。
开发过程中,个人非常热衷官方文档。能用看文档解决的问题,都不是大问题,如果有问题,那就再看一遍!
所以,不得不第一个提起的就是:
>mysql --help
Step 1, connecting&disconnecting
当我们需要数据库服务的时候,首先得通过既有账号和密码连接到数据库。
>mysql -h host -u user -p
Enter password:
-h:what host(不填则为连接本机上的MySQL), -u:user name, -p:password to use,输入密码后就可以对数据库进行各种温柔的交流了。
当我们不再需要操作数据库的时候,作为一个有始有终的人,这个时候一定不能原谅自己忘了断开连接。
mysql> QUIT(or \q)
如果使用的是Unix,也可通过 Control+D 断开数据库连接。
Step 2,写两句
第一步我们已经成功与数据库建立连接,下面就开始本文的重点啦,嗯,写上两句。
2.1 首先,得有数据库
查看当前server上已经存在数据库,[关键词 SHOW]:
mysql>SHOW DATABASES;
特别注意:当前用户是否拥有SHOW_DDATABASES 权限。
如果没有既有的数据库,则需要创建数据库(库名:test),[关键词 CREATE]:
mysql> CREATE DATABASE test;
注意:Unix环境下是区分大小写的,所以,建表的时候表名避免大小写混写,数据库命名也是如此!
访问数据库(本地存在该数据库,本文测试数据库名均为test),[关键词 USE]:
mysql> USE test
2.2 其次,得有表
基于步骤2.1已经访问到特定数据库后,产看当前数据库所有表,[关键词 SHOW TABLES]:
mysql> SHOW TABLES;
如果没有需要的表的时候,则创建一张新的表(表名 user),[关键词 CREATE TABLE]:
mysql> CREATE TABLE user (name VARCHAR(20), sex CHAR(1), birth DATE);
表名:user,每个user都有name,sex以及birth三个属性值。VARCHAR长度可以为1-65535,为“节能减排”,对某些属性设置特定长度可以有效的减小资源占用,如name设置长度为20。当后期有变更的时候,可以使用ALTER TABLE对已有表添加、修改或删除列。
mysql> create table users (id int(4) primary key not null auto_increment,name varchar(20) not null default '', gender char(1) not null default 'm',address varchar(20), tel varchar(20));
表名:users,每个user都有一个自增的主键id,name,gender,address以及tel三个属性值。
当成功创建表需要查看创建表语句检验是否符合设计预期,或者忘记表中列的属性定义的时候,可以查看表各列及其属性,[关键词 DESCRIBE 或 DESC]:
mysql> DESCRIBE user;
2.3 填充数据
将本地文件按顺序填充到数据库:
mysql> LOAD DATA LOCAL INFILE '/path/users.txt' INTO TABLE user;
若文件是在Windows上创建,则需要将上述语句改成:
mysql> LOAD DATA LOCAL INFILE '/path/users.txt' INTO TABLE user LINES TERMINATED BY '\r\n\';
在OS X系统上,对应修改成 LINES TERMINATED BY '\r'。
插入数据,[关键词 INSERT]:
mysql> INSERT INTO user VALUES ('John', 'f', '1999-01-01');
当插入值缺失的时候,用NULL代替。
2.4 操作表
·1 最简单的方式,获取表中所有数据 [关键词SELECT]
mysql> SELECT * FROM user;
·2 获取特定行
mysql> SELECT * FROM user WHERE name = 'Tommy';
mysql> SELECT * FROM user WHERE birth >= '2000-01-01';
mysql> SELECT * FROM user WHERE name = 'Tommy' OR name = 'Tom';
mysql> SELECT * FROM user WHERE (sex = 'm' AND birth >= '2000-01-01') OR (sex = 'f' AND birth >= '2005-01-01');
·3 获取特定列
mysql> SELECT name, birth FROM user;
mysql> SELECT DISTINCT birth FROM user;
DISTINCT:相同结果只输出一次。
·4 排序,[关键词 ORDER BY,默认排序为升序,降序则添加关键词 DESC]
mysql> SELECT name, birth FROM user ORDER BY birth;
mysql> SELECT name, birth FROM user ORDER BY birth DESC;
mysql>SELECT name, birth FROM user ORDER BY sex, birth DESC;
关键词DESC只对紧邻产生影响(birth)。
·5 修改一条数据的值,[关键词 UPDATE]
mysql> UPDATE user SET birth = '2000-01-01' WHERE name = 'Tommy';
·6 ALTER
(1)修改表名:
mysql> ALTER TABLE user RENAME TO db_user;
(2)增加主键:
mysql> ALTER TABLE user ADD id int(5) unsigned NOT NULL AUTO_INCREMENT , ADD PRIMARY KEY(id);
(3)修改id为自增,并设置为主键:
mysql> ALTER TABLE user MODIFY id INT AUTO_INCREMENT PRIMARY KEY;
(4)增加字段:
mysql> ALTER TABLE user ADD (address varchar(20));
(5)修改字段默认值:
mysql> ALTER TABLE user ALTER COLUMN gender set default 0;
(6)在某个自断后增加字段:
mysql> ALTER TABLE user ADD COLUMN email VARCHAR(20) NOT NULL DEFAULT ''AFTER tel;
(7)修改原字段名称及类型,修改字段名时必须重新制定字段类型:
mysql> ALTER TABLE user CHANGE project project_new varchar(20) NOT NULL DEFAULT '';
(8)删除字段:
mysql> ALTER TABLE db_teacher DROP address;
(9)修改一个字段类型:
mysql> ALTER TABLE db_teacher MODIFY gender INT(1) UNSIGNED DEFAULT 0;
·7 NULL
NULL虐我千百遍,还得待她如初恋~
官方文档对于NULL的定义是:a missing unknown value。
对于值的NULL判断,[关键词 IS NULL,IS NOT NULL]:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
1不为NULL,故上述结果分别是0,1。
注意:将一个值与NULL进行比较运算(=, <, <>),结果均为NULL。
·8 统计数据条数 [关键方法 COUNT(*)]
mysql> SELECT COUNT(*) FROM user; 注:统计用户数
mysql> SELECT sex, COUNT(*) FROM user GROUP BY sex; 注:统计male,female (如果有NULL则还有NULL)人数
·9 Pattern Matching
MySQL提供了正则表达式相关的模式匹配方法。
(1),"_":匹配一个字符,“%”:匹配任意字符数(包括0);
(2),不区分大小写;
mysql> SELECT * FROM user WHERE name LIKE 'a%'; 注:名字以a开头
mysql> SELECT * FROM user WHERE name LIKE '%s'; 注:名字以s结束
mysql> SELECT * FROM user WHERE name NOT LIKE '%b%'; 注:名字不包含b
mysql> SELECT * FROM user WHERE name LIKE '___'; 注:名字长度为5个字符
·10 多表查询
为准确记录用户一些重大事件,目前仅只有一张user表已经无法满足我们的需求了,新增一张event表,分别记录用户名,日期,事件类型以及备注。
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, type VARCHAR(15), describe VARCHAR(255));
将数据导入或插入表中。
event表中记录用户一条type为marry的结婚事件,现在需要查询各用户的结婚年龄:
mysql> SELECT user.name, TIMESTAMPDIFF(YEAR,birth, date) AS age, desc FROM user INNER JOIN event ON user.name = event.name WHERE event.type = 'marry';
有时候也用当前表join表本身用于计算。
mysql> SELECT u1.name, u1.sex FROM user AS u1 INNER JOIN user AS u2 ON u1.birth = u2.birth AND u1.sex = 'f' AND u2.sex = 'm';
·11 日期计算
日期计算在数据库使用中非常普遍。MySQL也提供了日期相关的计算方法。
计算年龄,[方法 TIMESTAMPDIFF()]
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM user;
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM user ORDER BY age;
mysql> SELECT name, birth, CURDATE(), TIMESTAMPDIFF(YEAR,birth, CURDATE()) AS age FROM user WHERE birth IS NOT NULL ORDER BY age;
上述sql语句执行结果是:输出会增加显示当前时间(CURDATE()),年龄age(TIMESTAMPDIFF(YEAR,birth,CURDATE()))。
mysql> SELECT name, birth, MONTH(birth) FROM user;
获取特定日期的月份使用 MONTH(),相似方法还有YEAR(),MONTH(),DAYOFMONTH()等,查看MySQL更过日期、时间计算方法。
好了,本次关于找回MySQL曾经内容就到这了,后续会写深入MySQL相关内容。
文中若有疏漏及错误,烦请斧正,谢谢。
在中秋假期的最后一天祝各位看官中秋快乐~
附:官方文档地址 MySQL 5.6 Reference Manual