3.2 输入查询:
SELECT VERSION(), CURRENT_DATE;
:版本号和当前日期- 一个命令通常由SQL语句组成,随后跟着一个分号(有一些例外不需要分号)
- 能够以大小写输入关键词
SELECT SIN(PI()/4), (4+1)*5;
:它说明你能将mysql用作一个简单的计算器SELECT VERSION(); SELECT NOW();
:你可以在一行上输入多条语句,只需要以一个分号间隔开各语句- 也不必全在一个行内给出一个命令,较长命令可以输入到多个行中。mysql通过寻找终止分号而不是输入行的结束来决定语句在哪儿结束
3.3 创建并使用数据库
- 3.3.1. 创建并选择数据库
GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';
:开始创建前你应该询问MySQL管理员许可你使用自己的一个数据库- CREATE DATABASE menagerie;
- 在Unix下,
数据库名称是区分大小写的(不像SQL关键字,表名一样)
- 在Unix下,
- drop database db_name; :删除数据库
USE menagerie
:选定这个数据库
- 3.3.2 创建表
SHOW TABLES;
:这时候看是空的,较难的部分是决定你的数据库结构应该是什么:你需要什么数据库表,各数据库表中有什么样的列。CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
:尝试创建一个pet表DESCRIBE pet;
:查看表中的列的名称或类型
- 3.3.3. 将数据装入表中
-
LOAD DATA LOCAL INFILE '/home/hzq/pet.txt' INTO TABLE pet LINES TERMINATED BY '\n';
:如果你在/home/hzq/目录下有一个文件pet.txt,内容如下:(用TAB键分开)Whistler Gwen bird \N 1997-12-09 \N
-
INSERT INTO pet VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
:insert是一种更常用的方式
-
- 3.3.4. 从表检索信息
-
3.3.4.1. 选择所有数据
SELECT * FROM pet;
:选择所有数据DELETE FROM pet;
:清空表中的数据UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
:修改表
-
3.3.4.2. 选择特殊行
SELECT * FROM pet WHERE name = 'Bowser';
SELECT * FROM pet WHERE birth > '1998-1-1';
:选择1998年以后出生的SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm') OR (species = 'dog' AND sex = 'f');
:注意AND优先级更高,使用括号是个好主意
-
3.3.4.3. 选择特殊列
SELECT name, birth FROM pet;
SELECT owner FROM pet;
:找出谁拥有宠物SELECT DISTINCT owner FROM pet;
:关键字DISTINCT检索出每个唯一的输出记录SELECT name, species, birth FROM pet WHERE species = 'dog' OR species = 'cat';
:查询狗和猫的出生日期
-
3.3.4.4. 分类行
SELECT name, birth FROM pet ORDER BY birth;
:按日期排序
-
3.3.4.5. 日期计算
SELECT name, birth, CURDATE(),(YEAR(CURDATE())-YEAR(birth)) - (RIGHT(CURDATE(),5)<RIGHT(birth,5)) AS age FROM pet ORDER BY age;
:按age输出,(RIGHT(CURDATE(),5)意思是截取日期的右边5个字符SELECT name, birth, death,(YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5)) AS age FROM pet WHERE death IS NOT NULL ORDER BY age;
:查询已经死亡动物的死亡年龄并排序SELECT name, birth FROM pet WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
找出下个月生日的动物SELECT name, birth FROM pet WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
:功能同上
-
3.3.4.6. NULL值操作
SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
SELECT 1 IS NULL, 1 IS NOT NULL;
SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
:测试NULL的用法
-
3.3.4.7. 模式匹配
SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。
SELECT * FROM pet WHERE name LIKE 'b%';
:使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKESELECT * FROM pet WHERE name LIKE '%w%';
:找出包含“w”的名字SELECT * FROM pet WHERE name LIKE '_____';
:找出正好包含5个字符的名字
由MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE)
- ‘.’匹配任何单个的字符
- “[…]”匹配在方括号内的任何字符
- “ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符
- 如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。
- 为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。
SELECT * FROM pet WHERE name REGEXP '^b';
:找出以“b”开头的名字SELECT * FROM pet WHERE name REGEXP BINARY '^b';
:BINARY关键字使其中一个字符串变为二进制字符串,从而强制使REGEXP比较区分大小写SELECT * FROM pet WHERE name REGEXP 'fy$';
:找出以“fy”结尾的名字SELECT * FROM pet WHERE name REGEXP 'w';
:找出包含一个“w”的名字SELECT * FROM pet WHERE name REGEXP '^.....$';
:找出包含正好5个字符的名字,注意这里的^$不能省
-
3.3.4.8. 计数行
SELECT COUNT(*) FROM pet;
:计算动物数目SELECT owner, COUNT(*) FROM pet GROUP BY owner;
:每个主人有多少宠物- 注意,使用GROUP BY对每个owner的所有记录分组,没有它,你会得到错误消息:
SELECT species, COUNT(*) FROM pet GROUP BY species;
:每种动物的数量SELECT sex, COUNT(*) FROM pet GROUP BY sex;
:每种性别的动物数量SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
:按种类和性别组合的动物数量SELECT species, sex, COUNT(*) FROM pet WHERE species = 'dog' OR species = 'cat' GROUP BY species, sex;
:若使用COUNT( ),你不必检索整个表SELECT species, sex, COUNT(*) FROM pet WHERE sex IS NOT NULL GROUP BY species, sex;
:你仅需要知道已知性别的按性别的动物数目
-
3.3.4.9. 使用1个以上的表
CREATE TABLE event (name VARCHAR(20), date DATE,type VARCHAR(15), remark VARCHAR(255));
:先创建另外一个表,然后加入数据SELECT pet.name,(YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age, remark FROM pet, event WHERE pet.name = event.name AND event.type = 'litter';
:假定你想要找出每只宠物的年龄。我们前面看到了如何通过两个日期计算年龄。event表中有母亲的生产日期,但是为了计算母亲的年龄,你需要她的出生日期,存储在pet表中。说明查询需要两个表- FROM子句列出两个表
- 要指定一个表中的记录怎样能匹配其它表的记录。这很简单,因为它们都有一个name列。查询使用WHERE子句基于name值来匹配2个表中的记录
- 因为name列出现在两个表中,当引用列时,你一定要指定哪个表。把表名附在列名前即可以实现。
SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species FROM pet AS p1, pet AS p2 WHERE p1.species = p2.species AND p1.sex = 'f' AND p2.sex = 'm';
:为了在你的宠物之中繁殖配偶,你可以用pet联结自身来进行相似种类的雄雌配对
-
3.4. 获得数据库和表的信息
- SELECT DATABASE();
- SHOW TABLES;
- DESCRIBE pet; :查询表的结构
-
3.5. 在批处理模式下使用mysql
mysql < batch-file
:想要运行的命令放在一个文件中,然后告诉mysql从文件读取它的输入mysql -h host -u user -p < batch-file --force
:如果你需要在命令行上指定连接参数,命令应为- –force:出现错误的时候仍继续执行脚本
mysql < batch-file > mysql.out
:捕捉输出
-
3.6. 常用查询的例子
CREATE TABLE shop ( -> article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL, -> dealer CHAR(20) DEFAULT '' NOT NULL, -> price DOUBLE(16,2) DEFAULT '0.00' NOT NULL, -> PRIMARY KEY(article, dealer)); INSERT INTO shop VALUES -> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45), -> (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
- 3.6.1. 列的最大值
SELECT MAX(article) AS article FROM shop;
- 3.6.2. 拥有某个列的最大值的行
SELECT article, dealer, price FROM shop WHERE price=(SELECT MAX(price) FROM shop);
SELECT article, dealer, price FROM shop ORDER BY price DESC LIMIT 1;
- 3.6.3. 列的最大值:按组
SELECT article, MAX(price) AS price FROM shop GROUP BY article;
- 3.6.4. 拥有某个字段的组间最大值的行
SELECT article, dealer, price FROM shop s1 WHERE price=(SELECT MAX(s2.price) FROM shop s2 WHERE s1.article = s2.article);
- 3.6.5. 使用用户变量
SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop;
SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
:找出价格最高或最低的物品
- 3.6.6. 使用外键
- 。。。
- 3.6.1. 列的最大值
-
3.4 表的操作
-
3.4.1. 修改表
ALTER table <表名> [ add <新列名> <数据类型> [完整性约束] ] [ drop <完整约束名> ] [ alter column<列名> <数据类型> ]
- 例如:alter table student_info add stu_entrance date;
-
3.4.2 删除表
- drop table table_name1,table_name2;
- drop table if exists students;
-
3.4.3 插入记录
insert into <表名> [ (<属性1>,<属性2>...) values (<常量1>,<常量2>...) ]
- 例如:insert into s_info (s_id,s_name,s_sex,s_age) values (9028,‘陈东’,‘男’,18);
-
3.4.4 更新记录
updata <表名> set <列名>=<表达式>[,<列名>=<表达式>]... where <条件>
- 例如:updata s_info set s_age=22 where s_id=9028
-
3.4.5 删除记录
delete from <表名> [where <条件>]
- 例如:delete from s_info where s_id=9028