MySQL学习之(三)数据表

目录


1 创建数据表

2 连接数据表

①笛卡尔积(交叉连接)

②条件连接

③自然连接

④内连接

⑤外连接

⑥联合查询(union join)

3 删除数据表

4 表插入数据

5 查询表中的数据

6 删除表中数据

7 修改表中数据

8 增加字段

9 修改表名

10 自动创建修改表的时间

11 字符串


 

 

 

 

1 创建数据表

命令: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));

简单的方法:

  •  

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子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

 

  1. 右外连接(右连接)right join 或 right outer join(会将连接表右侧的表中所有内容都显示出来)

语法:

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;

 

完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

⑥联合查询(union join)

这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。

3 删除数据表

命令:drop table <表名>

例如:删除表名为 MyClass 的表
   mysql> drop table MyClass;

DROP TABLE用于取消一个或多个表。您必须有每个表的DROP权限。所有的表数据和表定义会被取消,所以使用本语句要小心!

注意:对于一个带分区的表,DROP TABLE会永久性地取消表定义,取消各分区,并取消储存在这些分区中的所有数据。DROP TABLE还会取消与被取消的表有关联的分区定义(.par)文件。

对与不存在的表,使用IF EXISTS用于防止错误发生。当使用IF EXISTS时,对于每个不存在的表,会生成一个NOTE。

RESTRICT和CASCADE可以使分区更容易。目前,RESTRICT和CASCADE不起作用。

4 表插入数据

命令: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每次只能向表中插入一条记录。

5 查询表中的数据

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 进行查询

6 删除表中数据

命令: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

7 修改表中数据

语法: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子句用于给定一个限值,限制可以被更新的行的数目。

 

8 增加字段

命令: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);

说明:

modifychange都可以改变字段的属性(数据类型),不同在于change在改变字段属性(数据类型)的同时还可以同时更改字段名称,change后面需要跟两个字段名,第一个是原字段名,第二个是更改后的字段名。


删除字段:
mysql> alter table table_name drop column field_name;

 

9 修改表名

命令:rename table 原表名 to 新表名;

例如:在表MyClass名字更改为YouClass
   mysql> rename table MyClass to YouClass;

当你执行 RENAME 时,你不能有任何锁定的表或活动的事务。你同样也必须有对原初表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限。

如果在多表更名中,MySQL 遭遇到任何错误,它将对所有被更名的表进行倒退更名,将每件事物退回到最初状态。

RENAME TABLE 在 MySQL 3.23.23 中被加入。

 

10 自动创建修改表的时间

     CORRENT_TIMESTAMP

 

11 字符串

一.从左开始截取字符串

用法:left(str, length),即:left(被截取字符串, 截取长度)

SELECT LEFT('www.yuanrengu.com',8)

结果为:www.yuan

 

二.从右开始截取字符串

用法:right(str, length),即:right(被截取字符串, 截取长度)

SELECT RIGHT('www.yuanrengu.com',6)

结果为:gu.com

三.截取特定长度的字符串

用法:

  • substring(str, pos),即:substring(被截取字符串, 从第几位开始截取)
  • substring(str, pos, length),即:substring(被截取字符串,从第几位开始截取,截取长度)

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)

你可能感兴趣的:(MySQL)