mysql> alter table dc add power bigint;
Query OK, 0 rows affected (2.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc dc;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
| power | bigint | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
alter table 表名称 change 旧字段名 新字段名 新字段类型:修改字段
shell
mysql> alter table dc change power power_level int;
Query OK, 2 rows affected (2.36 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc dc;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
| power_level | int | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
alter table 表名称 modify 字段名称 新字段类型:只修改字段类型
shell
mysql> alter table dc modify power_level bigint;
Query OK, 2 rows affected (2.56 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> desc dc;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
| power_level | bigint | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
3.5.4 删
alter table 表名 drop 字段名:删除字段shell
ysql> alter table dc drop power_level;
Query OK, 0 rows affected (1.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc dc;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
3.6 数据操作sql
假设表dc的结构为
shell
mysql> desc dc;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| age | int | YES | | 30 | |
| powerlevel | int | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
3.6.1 查
查询表数据是最重要,也是最常用的sql语句。
3.6.1.1 基本语法
select 字段1 [as 别名1], 字段2 [as 别名2], ... from 表名 [where 条件] [order by 字段名 [desc|asc]] [limit 条数]:从表中选择满足条件的数据的指定字段,再按照某个字段排序后并限制前面多少条输出sql
mysql>select*from dc; -- 最简单的查询语句,查询所有记录,* 表示所有字段+----+-------------+------+------------+| id | name | age | powerlevel |+----+-------------+------+------------+|1| superman |35|10||2| wonderwoman |32|8||3| batman |35|4||4| flash |30|7||5| lantern |30|6||6| supergirl |33|8||7| cyborg |32|5|+----+-------------+------+------------+7rowsinset (0.00 sec)
mysql>select*from dc where age>=35; -- 加入条件查询年龄age大于等于25的记录+----+----------+------+------------+| id | name | age | powerlevel |+----+----------+------+------------+|1| superman |35|10||3| batman |35|4|+----+----------+------+------------+2rowsinset (0.00 sec)
mysql>select name, age, powerlevel from dc where age>=35orderby powerlevel; -- 在上一个查询基础上加入对结果按powerlevel排序,默认按升序(asc),加入关键词desc,可以使结果按降序+----+----------+------+------------+| id | name | age | powerlevel |+----+----------+------+------------+|3| batman |35|4||1| superman |35|10|+----+----------+------+------------+2rowsinset (0.00 sec)
mysql>select*from dc limit 3; -- 查询记录只显示前面3条+----+-------------+------+------------+| id | name | age | powerlevel |+----+-------------+------+------------+|1| superman |35|10||2| wonderwoman |32|8||3| batman |35|4|+----+-------------+------+------------+3rowsinset (0.00 sec)
3.6.1.2 聚合语法
select [字段1, 字段2, ...] 聚合函数3(字段3) [ [as] 别名3], 聚合函数4(字段4) [ [as] 别名4], ... from 表名 [group by 字段1, 字段2, ...]:对某几个字段聚合,即相同的归一类,然后对其他字段求聚合函数,比如最大最小值等sql
mysql>selectmax(powerlevel) from dc where age<35; -- 不加group by 对所有记录取聚合函数+-----------------+|max(powerlevel) |+-----------------+|8|+-----------------+1rowinset (0.00 sec)
mysql>select age, max(powerlevel) as mp from dc groupby age orderby mp desc; -- 查看年龄相同的数据中分别最大的powerlevel,并按照最大值降序排序,取别名 as 可以省略,直接 max(powerlevel) mp+------+------+| age | mp |+------+------+|35|10||32|8||33|8||30|7|+------+------+4rowsinset (0.00 sec)
select ... from 表1 [ [as] 别名1 ] [left|right|outer|inner] join 表2 [ [as] 别名2 ] on ([表1|别名1].字段1=[表2|别名2].字段1 [and 表1.字段1=表2.字段1]...):基于相同字段的值联合多个表查询
假设新增一个表dc_name,其数据为
sql
mysql>select*from dc_name;
+------+------------+------+| id | name | iq |+------+------------+------+|1| lex luthor |100||2| batman |100|+------+------------+------+2rowsinset (0.00 sec)
inner join
表示两个表取交集,即两个表都存在的数据取出
sql
select*from dc t1 innerjoin dc_name t2 on (t1.name=t2.name); -- 默认会输出两个表的所有字段,若只写join,则默认是inner join+----+--------+------+------------+------+--------+------+| id | name | age | powerlevel | id | name | iq |+----+--------+------+------------+------+--------+------+|3| batman |35|4|2| batman |100|+----+--------+------+------------+------+--------+------+1rowinset (0.00 sec)
mysql>select t1.*, t2.iq from dc t1 innerjoin dc_name t2 on (t1.name=t2.name); -- 只要t1的所有字段,t2的iq字段+----+--------+------+------------+------+| id | name | age | powerlevel | iq |+----+--------+------+------------+------+|3| batman |35|4|100|+----+--------+------+------------+------+1rowinset (0.00 sec)
outer join
表示两个表取并集,即两个表存在的数据都会取出,全称 full outer join,不过有些mysql版本不支持,具体可以使用下面介绍到的union语法替代
mysql>select t1.*, t2.iq from dc t1 leftjoin dc_name t2 on (t1.name=t2.name); -- 一般left join 或者 right join 会加入where条件过滤,比如where iq is not null,则效果相当于inner join的效果+----+-------------+------+------------+------+| id | name | age | powerlevel | iq |+----+-------------+------+------------+------+|1| superman |35|10|NULL||2| wonderwoman |32|8|NULL||3| batman |35|4|100||4| flash |30|7|NULL||5| lantern |30|6|NULL||6| supergirl |33|8|NULL||7| cyborg |32|5|NULL|+----+-------------+------+------------+------+7rowsinset (0.00 sec)
right join
与left join正好相反,右表的数据不会丢失
sql
mysql>select t1.*, t2.iq from dc t1 rightjoin dc_name t2 on (t1.name=t2.name);
+------+--------+------+------------+------+| id | name | age | powerlevel | iq |+------+--------+------+------------+------+|NULL|NULL|NULL|NULL|100||3| batman |35|4|100|+------+--------+------+------------+------+2rowsinset (0.00 sec)
注意:2个以上表的join语法
sql
select*from a
join b on (a.a1=b.b1)
join c on (a.a1=c.c1)
select ... from (select ... from ...) ...:嵌套查询,从中间查询结果中再次查询,一般会将中间查询结果与原表join后再查询sql
mysql>select dc.*from dc innerjoin (select age, max(powerlevel) as mp from dc groupby age) t1 on (dc.age=t1.age and dc.powerlevel=t1.mp); -- 查询年龄age相同的数据中,powerlevel最大的记录并包含名字name等所有原始信息的数据+----+-------------+------+------------+| id | name | age | powerlevel |+----+-------------+------+------------+|1| superman |35|10||2| wonderwoman |32|8||4| flash |30|7||6| supergirl |33|8|+----+-------------+------+------------+4rowsinset (0.00 sec)
3.6.1.5 查询结果合并
union语法,可以合并多个select语句的查询结果,具体语法:
select ... from ... [distinct] union select ... from ...
sql
mysql>select*from dc t1 leftjoin dc_name t2 on (t1.name=t2.name)
->union->select*from dc t1 rightjoin dc_name t2 on (t1.name=t2.name); -- 使用union语句合并left join与right join的结果,相当于full outer join+------+-------------+------+------------+------+------------+------+| id | name | age | powerlevel | id | name | iq |+------+-------------+------+------------+------+------------+------+|1| superman |35|10|NULL|NULL|NULL||2| wonderwoman |32|8|NULL|NULL|NULL||3| batman |35|4|2| batman |100||4| flash |30|7|NULL|NULL|NULL||5| lantern |30|6|NULL|NULL|NULL||6| supergirl |33|8|NULL|NULL|NULL||7| cyborg |32|5|NULL|NULL|NULL||NULL|NULL|NULL|NULL|1| lex luthor |100|+------+-------------+------+------------+------+------------+------+8rowsinset (0.00 sec)
3.6.2 增
insert into 表名 (字段1, 字段2, ...) values (字段1数据, 字段2数据, ...):向表中添加一行数据
shell
mysql> insert into dc values (0, 'superman', 35, 10);
Query OK, 1 row affected (0.08 sec)
mysql> select * from dc;
+----+----------+------+------------+
| id | name | age | powerlevel |
+----+----------+------+------------+
| 1 | superman | 35 | 10 |
+----+----------+------+------------+
1 row in set (0.00 sec)
注意到:
如果不填字段名称,默认所有字段按顺序匹配
由于id是自增的,所以id默认从1开始,添加数据的时候也可以指定字段,这样id会自动加1。
shell
mysql> insert into dc (name, age) values ('wonderwoman', 34);
Query OK, 1 row affected (0.12 sec)
mysql> select * from mydatabase.dc;
+----+-------------+------+------------+
| id | name | age | powerlevel |
+----+-------------+------+------------+
| 1 | superman | 35 | 10 |
| 2 | wonderwoman | 34 | NULL |
+----+-------------+------+------------+
2 rows in set (0.00 sec)
注意到id自增1,powerlevel会取默认值NULL。
insert (into|overwrite) 表名 select查询语句:从另一表中中导入数据
into是追加方式
overwirte是重写方式
sql
mysql>create table dc_name (id int, name varchar(255)); -- 创建新表dc_name
Query OK, 0rows affected (2.56 sec)
mysql>show tables;
+----------------------+| Tables_in_mydatabase |+----------------------+| dc || dc_name |+----------------------+2rowsinset (0.00 sec)
mysql>insert into dc_name select id, name from dc; -- 从dc表中导入数据给新表dc_name
Query OK, 2rows affected (0.92 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>select*from dc_name;
+------+-------------+| id | name |+------+-------------+|1| superman ||2| wonderwoman |+------+-------------+2rowsinset (0.00 sec)