继续体验sql之数据操作和约束
主键:
主键就是在一个数据表中可以唯一标识该表中的每一条信息。
比如我们上个数据表
很显然id可以成为主键,因为这里面只有id不会重复
那么如何指定某一个字段为主键?
两种方法:1、在创建数据表的时候声明 2、创建后指定
<字段名> <数据类型> PRIMARY KEY [默认值]
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
mysql> CREATE TABLE tb2 -> ( -> id INT(10) PRIMARY KEY, -> name VARCHAR(20) -> );
创建后修改主键
mysql> ALTER TABLE tb1 ADD PRIMARY KEY(id);
设置联合主键(将id class设为主键)
mysql> CREATE TABLE tb4 -> ( -> id INT(10), -> name VARCHAR(20), -> class VARCHAR(20), -> PRIMARY KEY(id,class) -> );
删除主键约束
ALTER TABLE <数据表名> DROP PRIMARY KEY;
主键自增长
比如序列号,每多一个数据进来,序列号自动+1
mysql> CREATE TABLE tb5 -> ( -> id INT(10) PRIMARY KEY AUTO_INCREMENT,#主键自增长 -> name VARCHAR(20) NOT NULL -> )AUTO_INCREMENT=100; #设置主键自增长初始值(可以不加这句)
唯一约束
指所约束的字段值不能重复出现,比如学号,不可以重复
设置唯一约束
<字段名> <数据类型> UNIQUE
添加唯一约束
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
删除唯一约束
ALTER TABLE <表名> DROP INDEX <唯一约束名>;
默认值
在创建数据表示,设置默认值,比如工科学院性别默认值可以设置为男
创建表时设置默认值
<字段名> <数据类型> DEFAULT <默认值>;
修改时添加默认值
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <数据类型> DEFAULT <默认值>;
删除默认值
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> DEFAULT NULL;
mysql> CREATE TABLE tb7 -> ( -> id INT(10), -> name VARCHAR(20), -> sex VARCHAR(5) DEFAULT 'man' -> );
mysql> ALTER TABLE tb7 -> CHANGE COLUMN sex sex VARCHAR(5) DEFAULT NULL;
非空约束
可以设置某字段比如有值,否则这条数据就无效。比如上例的名字
创建表时设置非空约束
<字段名> <数据类型> NOT NULL;
修改表时添加非空约束
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NOT NULL;
删除非空约束
ALTER TABLE <数据表名> CHANGE COLUMN <字段名> <字段名> <数据类型> NULL;
插入数据
拿我们刚才的tb7举例
我要插入一条数据 id :1 name :xiaowang sex :man
mysql> INSERT INTO tb7 -> VALUES(1,'xiaowang','man');
那如果我不想按照这个顺序呢,可以指定自己的顺序,比如 name id sex
mysql> INSERT INTO tb7 -> (name,id,sex) -> VALUES('xiaoliu',2,'man');
修改数据
UPDATE <表名> SET 字段 1=值 1 [,字段 2=值 2… ] [WHERE 子句 ] [ORDER BY 子句] [LIMIT 子句]
比如我们现在把刚才小王和小刘性别改成女
mysql> UPDATE tb7 SET sex = 'woman';
刚才那个命令改了全部的数据
现在我们只改一个
mysql> UPDATE tb7 -> SET sex='man' -> WHERE name='xiaowang';
删除数据
把小刘的那条数据删掉
mysql> DELETE FROM tb7 -> WHERE name='xiaoliu';
删除全部数据
就不需要加 WHERE 的限制条件了
查看表中所有字段
SELECT * FROM 表名;
查看指定字段
SELECT < 列名 > FROM < 表名 >;
去重
过滤数据
SELECT DISTINCT <字段名> FROM <表名>;
排序
ORDER BY <字段名> [ASC|DESC]
现在我们对刚才的数据以名字排序
mysql> SELECT * FROM tb7 ORDER BY name;
条件查询
比如刚才的表,我只想查xiaofeng是男的女的,那么可以用这个语句
mysql> SELECT name,sex FROM tb7 WHERE name='xiaofeng';
再比如我要查所有男性的名字
mysql> SELECT name,sex FROM tb7 WHERE sex='man';
那如果我要想查序号低于4的男性呢
mysql> SELECT id,name,sex FROM tb7 WHERE sex='man' AND id < 4;
除了 AND 还有 OR XOR 分别是 与或非
现在我要查所有名字以xiao开头的人的性别
mysql> SELECT name,sex FROM tb7 WHERE name LIKE 'xiao%';
或者查找不以xiao开头的人
可以看出%表示不指定字符个数,相应的 _ 就是指定了1个字符
比如我要查所有x开头 同时 x后面只有6位的人
mysql> SELECT name,sex FROM tb7 WHERE name LIKE 'x______';
范围查询
[NOT] BETWEEN 取值1 AND 取值2
如果我想查所有id在2-5之间的人
mysql> SELECT id,name,sex FROM tb7 WHERE id BETWEEN 2 AND 5;