目录
1 创建数据表
2 连接数据表
①笛卡尔积(交叉连接)
②条件连接
③自然连接
④内连接
⑤外连接
⑥联合查询(union join)
3 删除数据表
4 表插入数据
5 查询表中的数据
6 删除表中数据
7 修改表中数据
8 增加字段
9 修改表名
10 自动创建修改表的时间
11 字符串
命令:create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);
例如,建立一个名为MyClass的表,
字段名 |
数字类型 |
数据宽度 |
是否为空 |
是否主键 |
自动增加 |
默认值 |
id |
int |
4 |
否 |
primary key |
auto_increment |
|
name |
char |
20 |
否 |
|
|
|
sex |
int |
4 |
否 |
|
|
0 |
degree |
double |
16 |
是 |
|
|
|
mysql> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));
简单的方法:
交叉连接的两种方式,得到的结果为笛卡尔积形式:
隐式交叉连接:select * from student, score;
显示交叉连接:select * from student cross join score;
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。
条件连接就是在多个表的笛卡尔积中选取满足条件的行的连接
例如:select * from A,B where A.a > A.b
等值连接(特殊的条件连接)
例如:select * from A,B where A.a = B.b(条件为某字段=某字段时)
专业术语:自然连接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。
自然连接(Natural join)是一种特殊的等值连接,自然连接无需指定连接列,SQL会检查两个表中是否相同名称和类型的列,如果没有则返回错误。它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
select * from table1 natural [inner/left outer/right outer/full outer] join table2;
返回连接表中符合连接条件和查询条件的数据行
1)隐式内连接(等值连接)
select * from table1t1, table2 t2 where t1.field1=t2. field2;
2)显式内连接
select * from table1t1 inner join table2 t2 on t1. field1 =t2. field2;
内连接和等值连接的区别:执行效果等价,只是写法不一样。等值连接用where,内连接用inner join … on
(在某种意义上,笛卡尔积、条件连接、自然连接、等值连接均可以归类为内连接,因为都是在笛卡尔积的基础上加上条件进行筛选。)
1.左外连接(左连接)left join或left outer join (会将left outer join左侧的表的所有内容显示出来,没有对应的值为空)
语法:
select *
from students
left outer join score sc on s.studentid=sc.studentid;
左向外联接的结果集包括 left outer子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
语法:
select *
from students
right outer join score sc on s.studentid=sc.studentid;
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3.全外连接(全连接)full join 或 full outer join
语法:
select *
from students
full outer join score sc on s.studentid=sc.studentid;
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。
命令:drop table <表名>
例如:删除表名为 MyClass 的表
mysql> drop table MyClass;
DROP TABLE用于取消一个或多个表。您必须有每个表的DROP权限。所有的表数据和表定义会被取消,所以使用本语句要小心!
注意:对于一个带分区的表,DROP TABLE会永久性地取消表定义,取消各分区,并取消储存在这些分区中的所有数据。DROP TABLE还会取消与被取消的表有关联的分区定义(.par)文件。
对与不存在的表,使用IF EXISTS用于防止错误发生。当使用IF EXISTS时,对于每个不存在的表,会生成一个NOTE。
RESTRICT和CASCADE可以使分区更容易。目前,RESTRICT和CASCADE不起作用。
命令:insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )]
例如:往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99, 编号为3 的名为Wang 的成绩为96.5。
mysql> insert into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (2,'Wang', 96.59);
注意:insert into每次只能向表中插入一条记录。
1)、查询所有行
命令: select <字段1,字段2,...> from < 表名 > where < 表达式 >
例如:查看表 MyClass 中所有数据
mysql> select * from MyClass;
2)、查询前几行数据
例如:查看表 MyClass 中前2行数据
mysql> select * from MyClass order by id limit 0,2;
select一般配合where使用,以查询更精确更复杂的数据。
3)、显示表结构(属性)
mysql> describe class;
mysql>desc calss;
条件:
Where
or|and|in|between|is|like
_划线代表0-1个字符
%代表0-多个 字符
如果要查询带%的字段 需要用escape指定转义字符
值为空的通过命令:值 IS NULL 进行查询
命令:delete from 表名 where 表达式
truncate table 表名 where 表达式
例如:删除表 MyClass中编号为1 的记录
mysql> delete from Class where id=1;
mysql> truncate table Class where id=1;
例子2:删除表MyClass中以王结尾的 以李开头的 名字中带有孙的
mysql> delete from Class like name=%王;
mysql> delete from Class like name=李%;
mysql> delete from Class like name=%孙%;
下面是一个删除数据前后表的对比。
FirstName |
LastName |
Age |
Peter |
Griffin |
35 |
Glenn |
Quagmire |
33 |
下面以PHP代码为例删除 "Persons" 表中所有 LastName='Griffin' 的记录:
$con = mysql_connect("localhost","peter","abc123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
mysql_query("DELETE FROM Persons WHERE LastName='Griffin'"); mysql_close($con);
?>
在这次删除之后,表是这样的:
FirstName |
LastName |
Age |
Glenn |
Quagmire |
33 |
语法:update 表名 set 字段=新值,… where 条件
mysql> update MyClass set name='Mary' where id=1;
例子1:单表的MySQL update语句:
update [low_priority] [ignore] tbl_name set col_name1=expr1 [,col_name2=expr2...] [where where_definiton] [order by...] [limit row_count]
例子2:多表的update语句:
update [low_priority] [ignore] table_references set col_name1=expr1 [, col_name2=expr2 ...] [where where_definition]
update语法可以用新值更新原有表行中的各列。SET子句指示要修改哪些列和要给予哪些值。where子句指定应更新哪些行。如果没有where子句,则更新所有的行。如果指定了order by子句,则按照被指定的顺序对行进行更新。limit子句用于给定一个限值,限制可以被更新的行的数目。
命令:alter table 表名 add字段 类型 其他;
例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0
mysql> alter table MyClass add passtest int(4) default '0'
加索引
mysql> alter table 表名 add index 索引名 (字段名1[,字段名2 …]);
例子: mysql> alter table employee add index emp_name (name);
加主关键字的索引
mysql> alter table 表名 add primary key (字段名);
例子: mysql> alter table employee add primary key(id);
加唯一限制条件的索引
mysql> alter table 表名 add unique 索引名 (字段名);
例子: mysql> alter table employee add unique emp_name2(cardnumber);
删除某个索引
mysql> alter table 表名 drop index 索引名;
例子: mysql>alter table employee drop index emp_name;
增加字段:
mysql> ALTER TABLE table_name ADD field_name field_type;
修改原字段名称及类型:
mysql> alter table table_name change old_field_name new_field_name char(30);
mysql> alter table table_name modify field_name char(30);
说明:
modify和change都可以改变字段的属性(数据类型),不同在于change在改变字段属性(数据类型)的同时还可以同时更改字段名称,change后面需要跟两个字段名,第一个是原字段名,第二个是更改后的字段名。
删除字段:
mysql> alter table table_name drop column field_name;
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass
mysql> rename table MyClass to YouClass;
当你执行 RENAME 时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限。
如果在多表更名中,MySQL 遭遇到任何错误,它将对所有被更名的表进行倒退更名,将每件事物退回到最初状态。
RENAME TABLE 在 MySQL 3.23.23 中被加入。
CORRENT_TIMESTAMP
一.从左开始截取字符串
用法:left(str, length),即:left(被截取字符串, 截取长度)
SELECT LEFT('www.yuanrengu.com',8)
结果为:www.yuan
二.从右开始截取字符串
用法:right(str, length),即:right(被截取字符串, 截取长度)
SELECT RIGHT('www.yuanrengu.com',6)
结果为:gu.com
三.截取特定长度的字符串
用法:
1.从字符串的第9个字符开始读取直至结束
SELECT SUBSTRING('www.yuanrengu.com', 9)
结果为:rengu.com
2.从字符串的第9个字符开始,只取3个字符
SELECT SUBSTRING('www.yuanrengu.com', 9, 3)
结果为:ren
3.从字符串的倒数第6个字符开始读取直至结束
SELECT SUBSTRING('www.yuanrengu.com', -6)
结果为:gu.com
4.从字符串的倒数第6个字符开始读取,只取2个字符
SELECT SUBSTRING('www.yuanrengu.com', -6, 2)
结果为:gu
四.按关键字进行读取
用法:substring_index(str, delim, count),即:substring_index(被截取字符串,关键字,关键字出现的次数)
1.截取第二个“.”之前的所有字符
SELECT SUBSTRING_INDEX('www.yuanrengu.com', '.', 2);
结果为:www.yuanrengu
2.截取倒数第二个“.”之后的所有字符
SELECT SUBSTRING_INDEX('www.yuanrengu.com', '.', -2);
结果为:yuanrengu.com
3.如果关键字不存在,则返回整个字符串
SELECT SUBSTRING_INDEX('www.yuanrengu.com', 'sprite', 1);
结果为:www.yuanrengu.com
4.字符串连接CONCAT(str1,str2,str3…)