MYSQL学习(二)
操作MySQL数据库
向表中插入数据
insert 语句可以用来将一行或多行数据插到数据库表中, 使用的一般形式如下:
insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);
其中 [] 内的内容是可选的, 例如, 要给 samp_db 数据库中的 students 表插入一条记录, 执行语句:
insert into students values(NULL, "王刚", "男", 20,"13811371377");
按回车键确认后若提示 Query Ok, 1 row affected(0.05 sec) 表示数据插入成功。 若插入失败请检查是否已选择需要操作的数据库。
有时我们只需要插入部分数据, 或者不按照列的顺序进行插入, 可以使用这样的形式进行插入:
insert intostudents (name, sex, age) values("孙丽华", "女", 21);
查询表中的数据
select 语句常用来根据一定的查询规则到数据库中获取数据, 其基本的用法为:
select 列名称 from 表名称 [查询条件];
例如要查询students 表中所有学生的名字和年龄, 输入语句select name, age from students; 执行结果如下:
mysql>select name, age from students;
+--------+-----+
|name | age |
+--------+-----+
|王刚 | 20|
|孙丽华 | 21 |
|王永恒 | 23 |
|郑俊杰 | 19 |
|陈芳 | 22|
|张伟朋 | 21 |
+--------+-----+
6rows in set (0.00 sec)
也可以使用通配符* 查询表中所有的内容, 语句: select * fromstudents;
检索不同的行的用法:使用关键字DISTINCT
SELECT DISTINCT vend_id FROM products;
返回指定的行数的用法:使用关键字LIMIT 后跟一个指定的行数。
SELECTprod_name FROM products LIMIT 5
返回从指定行开始到指定行数结束的内容:使用关键字LIMIT 后跟两个指定的数字,第一个表示开始的行号,第二个表示需要显示的行数。
SELECTprod_name FROM products LIMIT 5,5
排序数据使用ORDERBY子句
SELECTprod_name FROM products ORDER BY prod_name
按多个列排序:
SELECTprod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;
按价格降序排序产品:降序使用了关键字DESC。
SELECTprod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
多列排序,首先价格按照降序排序,然后名字按默认升序排序。DESC关键字只应用到直接位于其前面的列名。相对应的有升序关键字ASC(默认值)
SELECT prod_id,prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
演示如何找出最昂贵物品的值:注意子句的顺序。
SELECTprod_price FROM products ORDER BY prod_price DESC LIMIT 1;
按特定条件查询:
where 关键词用于指定查询条件, 用法形式为: select 列名称 from 表名称 where 条件;
以查询所有性别为女的信息为例, 输入查询语句: select * from students wheresex="女";
where 子句不仅仅支持"where 列名 = 值" 这种名等于值的查询形式, 对一般的比较运算的运算符都是支持的, 例如 =、>、<、>=、<、!= 以及一些扩展运算符 is [not] null、in、like等等。 还可以对查询条件使用 or 和 and 进行组合查询, 以后还会学到更加高级的条件查询方式, 这里不再多做介绍。
示例:
查询年龄在21岁以上的所有人信息: select * from students where age > 21;
查询名字中带有"王" 字的所有人信息: select *from students where name like "%王%";
查询id小于5且年龄大于20的所有人信息:select * from students where id<5 and age>20;
简单相等测试:
SELECTprod_name, prod_price FROM products WHERE prod_price = 2.50;
WHERE子句的操作符请注意:不等于有两种表示 <>或者!=,还有一个操作符是BETWEEN.
SELECTprod_name, prod_price FROM products WHERE prod_name = 'fuses';
SELECTprod_name, prod_price FROM products WHERE prod_price < 10;
SELECTprod_name, prod_price FROM products WHERE vend_id <> 1003;
SELECTprod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查:
SELECTprod_price FROM products WHERE prod_price IS NULL;
组合WHERE子句:
SELECTprod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 ANDprod_price <= 10;
计算顺序:
SELECTprod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 ANDprod_price >= 10;
SELECTprod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003)AND prod_price >= 10;
AND的优先级高于OR,所以上面的两条语句执行的结果不一样。遇到多子句的时候需要使用圆括号明确地分组相应的操作符。
IN操作符:用来指定条件范围,在范围中的每个条件都可以进行匹配。IN中可以包含其他SELECT语句。
SELECTprod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BYprod_name;
NOT操作符:否定它之后所跟的任何条件:
SELECTprod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;
用通配符过滤:
%是百分号通配符,表示任何字符出现任意次数(0,1,或者多个),注意%不能够匹配NULL值。
SELECTprod_name, prod_price FROM products WHERE prod_name LIKE 'jet%';
搜索任意以jet起头的词。
SELECTprod_id,prod_name, prod_price FROM products WHERE prod_name LIKE '%anvil%';
搜索任意位置包含anvil的值。
SELECTprod_name FROM products WHERE prod_name LIKE 's%e';
(_)是下划线通配符,表示匹配单个字符,要求一个字符不能多也不能少。
SELECTprod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
用正则表达式搜索:
REGEXP关键字告诉MySQL:REGEXP后所跟的东西作为正则表达式处理。
SELECT prod_name FROMproducts WHERE prod_name REGEXP '1000' ORDER BY prod_name;
SELECTprod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
.是正则表达式中一个特殊的字符。它表示匹配任意一个字符。
SELECTprod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
|是正则表达式的OR操作符。它表示匹配其中之一。
SELECTprod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
[ ]是另一种形式的OR语句,它表示匹配123其中之一。
SELECTprod_name FROM products WHERE prod_name REGEXP '[^123] Ton' ORDER BY prod_name;
^表示否定,[^123]表示匹配除了123这些字符外的任何东西。
SELECTprod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
-用来定义一个范围,[0123456789]=[0-9]
[a-z]匹配任意字母字符。
SELECTvend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;
转义:为了匹配特殊字符,比如., |, -, [],必须使用\\为前导,\\-表示查找-,\\.表示查找.,\\\匹配反斜杠\本身。
* 0个或多个匹配
+ 1个或多个匹配(等于{1,})
? 0个或1个匹配(等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
SELECT prod_name FROM products WHEREprod_name REGEXP '\\([0-9] sticks?\\)' ORDER BY prod_name;
+----------------+
| prod_name |
+----------------+
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
SELECT prod_name FROM products WHEREprod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;
注意使用的正则表达式[[:digit:]]{4}有两层中括号[[]],如果少一层,查询不到结果。
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
定位元字符:
^ 文本的开始
$ 文本的结尾
[[:<:] 词的开始
[[:>:]] 词的结尾
SELECT prod_name FROM products WHEREprod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
+--------------+
SELECT prod_name FROM products WHEREprod_name REGEXP '[0-9\\.]' ORDER BY prod_name;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| JetPack 1000 |
| JetPack 2000 |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
注意上面两条SQL语句查询结果的差异,上一条使用的开始定位符^,意思是查询出.或者任何以数字为串中第一个字符时才匹配他们。下面这一条语句没有要求匹配数字的位置。
SELECT 'hello'REGEXP '[0-9]';
上面的执行结果为0,表示字符串hello中没有数字。
拼接字段
SELECT CONCAT(vend_name, ' (', vend_country,')') FROM vendors ORDER BY vend_name;
+-------------------------------------------+
| CONCAT(vend_name, '(', vend_country, ')') |
+-------------------------------------------+
| ACME(USA) |
| Anvils R Us(USA) |
| Furball Inc.(USA) |
| Jet Set(England) |
| Jouets Et Ours(France) |
| LT Supplies(USA) |
+-------------------------------------------+
在MySQL的SELECT语句中,可以使用Concat( )函数来拼接两个列。
使用别名
SELECT CONCAT(RTRIM(vend_name), ' (',RTRIM(vend_country), ')') AS vend_title FROM vendors ORDER BY vend_name;
+-------------------------+
| vend_title |
+-------------------------+
| ACME (USA) |
| Anvils R Us (USA) |
| Furball Inc. (USA) |
| Jet Set (England) |
| Jouets Et Ours (France) |
| LT Supplies (USA) |
+-------------------------+
别名是一个字段或值的替换名。别名用AS关键字赋予。也称导出列。
执行算术计算
SELECT prod_id, quantity, item_price FROMorderitems WHERE order_num = 20005;
+---------+----------+------------+
| prod_id | quantity | item_price |
+---------+----------+------------+
| ANV01 | 10 | 5.99 |
| ANV02 | 3 | 9.99 |
| TNT2 | 5 | 10.00 |
| FB | 1 | 10.00 |
+---------+----------+------------+
SELECT prod_id, quantity, item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20005;
+---------+----------+------------+----------------+
| prod_id | quantity | item_price |expanded_price |
+---------+----------+------------+----------------+
| ANV01 | 10 | 5.99 | 59.90 |
| ANV02 | 3 | 9.99 | 29.97 |
| TNT2 | 5 | 10.00 | 50.00 |
| FB | 1 | 10.00 | 10.00 |
+---------+----------+------------+----------------+
更新表中的数据
update 语句可用来修改表中的数据, 基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;
使用示例:
将id为5的手机号改为默认的"-": update students settel=default where id=5;
将所有人的年龄增加1: update students set age=age+1;
将手机号为13288097888 的姓名改为 "张伟鹏",年龄改为 19: update students set name="张伟鹏", age=19 where tel="13288097888";
删除表中的数据
delete 语句用于删除表中的数据, 基本用法为:
delete from 表名称 where 删除条件;
使用示例:
删除id为2的行: delete from students where id=2;
删除所有年龄小于21岁的数据: delete from students where age<20;
删除表中的所有数据: delete from students;
创建后表的修改
alter table 语句用于创建后对表的修改, 基础用法如下:
添加列
基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];
示例:
在表的最后追加列address: alter table students add address char(60);
在名为 age 的列后插入列 birthday: alter table students add birthday date after age;
修改列
基本形式: alter table 表名 change 列名称 列新名称 新数据类型;
示例:
将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default"-";
将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null;
删除列
基本形式: alter table 表名 drop 列名称;
示例:
删除birthday 列: alter table students drop birthday;
重命名表
基本形式: alter table 表名 rename 新表名;
示例:
重命名students 表为 workmates: alter table students renameworkmates;
删除整张表
基本形式: drop table 表名;
示例: 删除workmates 表: drop table workmates;
删除整个数据库
基本形式: drop database 数据库名;
示例: 删除samp_db 数据库: drop database samp_db;