MySQL入门 | 三
一.MySQL表数据类型
变长字符可以存储任意长度的文本.相比定长字符灵活许多,但是性能上有差距,也就是系统处理定长列远快于变长.此外许多DBMS不允许对变长列进行索引!
注意:如果再数值类型内输入01234,将会显示1234,也就是丢失了0这个数字,所以这个是用应该用字符串数据类型.常常订单号什么的会出现这个情况
二.用SQL语句创建表
1. 语句解释
Create Table Products
( prod_id char(10) not null,
vend_id text not null);
这里解释一下’Create Table’这是个命令代表创建表,后面跟表名.然后表里所有的列都写在后面的括号里,这次我们在这个表里定义了prod_id和vend_id两列,注意括号里开头必须是列名,再是数据类型,然后是是否包括空值,之后用逗号分隔.
注意:在创建新的表时,指定的表名必须不存在,否则会出错。防止意外覆盖已有的表,SQL 要求首先手工删除该表(请参阅后面的内容),然后再重建它,而不是简单地用创建表语句覆盖它。
2.设定列类型,大小,约束
可以看到我们在上面的每行代码最后我们都写了not null,意思也就是指定这个列为not null 列.这就会阻止插入没有值的数据,如果插入没有值的数据,将返回错误.
注意:如果我们在上面的代码行里不输入not null 直接在数据类型后跟上逗号,那么我们就指定这个列为null列,也就是这列里面的数据可以允许空值存在.当然我们也可以输入null指定null列
主键是其值唯一标识表中每一行的列。只有不允许NULL
值的列可作为主键,允许NULL 值的列不能作为唯一标识。
不要把NULL 值与空字符串相混淆。NULL 值是没有值,不是空字符串。如果指定’’(两个单引号,其间没有字符),这在NOT NULL 列中是允许的。空字符串是一个有效的值,它不是无值。NULL 值用关键字NULL而不是空字符串指定。
3.设定主键
Create Table Products
(prod_id int not null Primary Key);
注意上面说到的,设定主键的列必须为not null列,这时候我们在not null 后面跟上’Primary Key’ 命令 就是设定这一列为主键.
三.用SQL语句向表中添加数据
下面我们来介绍’Insert’ 命令,也就是对表中添加数据.
Insert into Customers
Values ('1006',
'Toy Land',
'New York',
Null);
上面是第一种插入方法,表示将下面的数据插入到Customers 这张表里.这里需要注意的是,我们添加的这一行新数据必须对于Customers表里每一列的数值按照其顺序都进行填充,如果某列值不需要填充,则使用Null.这个方法不太安全,也不推荐使用,因为每次都要把所有列名数据填充一边,而且还必须按照顺序.
下面介绍一个更为安全的方法:
Insert into Customers(cust_id,
cust_name,
cust_address
)
Values ('1006',
'Toy Land',
'New York',
);
这个相比于上面那个方法,我们在表名后面增加了一个括号内容,括号里填充的就是我们要添加的数据对应的列名,比如cust_email这列我们在上面用的是Null,就是我们不需要添加,所以我们在这个方法里,根本不需要加入这个列名,只需要添加我们需要的列名就行了,然后values括号后面的内容,根据我们输入的列名顺序,进行添加值.
当然我们也可以根据在另一张表里检索到的内容来添加到我们正在使用的表中,
INSERT INTO Customers(cust_id,
cust_contact,
cust_email,
cust_name,
)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
FROM CustNew;
说明:新例子的说明
这个例子从一个名为CustNew 的表中读出数据并插入到Customers
表。为了试验这个例子,应该首先创建和填充CustNew 表。CustNew
表的结构与附录A 中描述的Customers 表相同。在填充CustNew 时,
不应该使用已经在Customers 中用过的cust_id 值(如果主键值重
复,后续的INSERT 操作将会失败)。
上面说的都是插入数据,我们这里提一下复制表的操作如下:
Insert * into CustCopy
From Customers;
就是把Customers表里所有的数据都添加到CustCopy表里(也就是新建一张Custcopy表,作为他的复制).
四.用SQL语句删除表
1.DELETE
Delete From Customers
DELETE语句执行删除操作的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.Delete只是删除表中的内容,并不是把整个表去除.
2.DROP
删除表(删除整个表而不是其内容)非常简单,使用DROP TABLE 语句即可:
Drop Table Customers;
3.TRUNCATE
Truncate Table Customers
跟Drop 一样 Truncate跟Table 连用.但是他只是清楚表内所有内容,并不是把整张表删除.
4.不同方式的区别
1.Drop是把整个表删除,Truncate和Delete只是清除表的内容
2.速度上来说Drop>Truncate>Delete
提示:truncate table是将表结构重新建一次速度要比使用delete from快很多,而delete from是一行一行的删除,速度很慢.
3.Delete 可以通过Where来精准选择要删除的行,也可以全部删除表内容.其他两个只能全部删除.
4.Delete 可以回滚删除,其他两个不行
五.用SQL语句修改表
1.修改列名
Alter Table Customers Rename NewCus;
用Alter命令配合Rename.上面为把Customers表名字改为NewCus
2.修改表中数据
修改数据我们用Update 命令
Update Customers
Set cus_email = '**@gmail.com',
cust_contact = 'Sam Roberts'
Where cus_id = '1005';
解释一下,首先我们要选择表,也就是在Update 后面跟上你要用的表名,之后输入Set在其后面跟上你需要修改的列,并附上新的值也就是(列=值),最后用Where筛选出你要更新的是哪一个数据,这里用了cus_id进行了指定,也就是选择了cus_id为1005的这行数据对cus_email进行更新.如果没有Where,那么Dbms会对所有数据的cus_email 都进行更新(也就是更新所有行).
我们甚至可以使用Update命令进行删除操作如下:
Update Customer
Set cus_email = Null
Where cus_id = '1005';
其实跟上面的理解一样,我们就是对cus_id 为1005顾客的邮件地址进行了更新,只不过这次更新是使得他的邮件地址变成了空值(Null),也就是删除了他的邮件地址信息.如果不指定Where则是表示让整个email列都变成空值.
3.删除行
下面的语句表示从Customers 表中删除一行,也就是删除了整个cus_id 是1005的顾客信息,就是我们表里去掉了这个顾客
Delete From Customers
Where cust_id = '1005';
同样如果省略where,那么就变成了删除整张表的内容,但是并不会删除整个表的本身.但是如果列里有外键,则会抛出异常,这也是防止误删的一个手段.
4.删除列
注意:小心使用ALTER TABLE
使用ALTER TABLE 要极为小心,应该在进行改动前做完整的备份(表结构和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,也许无法删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。
假设我们要对Customers表删除一列,操作如下:
ALTER TABLE Customers
Drop Column = cus_phone;
用ALter命令, Alter Table 后面更需要操作的表名,之后输入Drop后面跟自己需要删除的列的列名.
5.新建列
假设我们要对Customers表新增一列,也就是添加一个新属性,操作如下:
ALTER TABLE Customers
ADD cus_phone CHAR(20);
用ALter命令, Alter Table 后面更需要操作的表名,之后输入Add 后面跟自己需要增加的列的信息,列名,字段类型,是否not null,默认值等.
6.新建行
新建行就是我们前面说的Insert
Insert into Customers(cust_id,
cust_name,
cust_address
)
Values ('1006',
'Toy Land',
'New York',
);
作业
项目三
项目四
…都写完了忘记保存哭哭惹…暂时不写了 直接交作业
项目五
项目六
原数据:
处理后:
这里解释一下我们首先用select找出class_id为重复的数据(并且重复次数大于3)也就是通过,这里返回的是筛选后的表:
select class_id from students
group by class_id
having count(class_id) >3 ;
再接着我们需要用in来完成where后面的条件语句.
class_id in 筛选条件
意思就是匹配 在筛选条件中的 class_id
然后我们需要通过再添加另一个条件也就是寻找id是最小的数据行:
id in (select min(id) from students);
最后组合这些条件 用delete