MySQL数据库(九)__2018.11.15

我们会建库了,会建表了,接下来就是对数据的一个操作。

首先我们的数据是写在数据表中的。增删该查也是对数据表的操作。

添加记录:insert [into] tb_name(col_name,...)(values|value)(values,...)

1.不指定字段名称:需要按照建表时的字段顺序给每一个字段赋值。

#测试添加记录
CREATE DATABASE IF NOT EXISTS king DEFAULT CHARACTER SET 'utf8';
USE king;
CREATE TABLE IF NOT EXISTS USER(
	id INT UNSIGNED AUTO_INCREMENT KEY COMMENT '编号',
	username VARCHAR(20)NOT NULL UNIQUE COMMENT '用户名',
	age TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',
	email VARCHAR(50)NOT NULL DEFAULT '[email protected]' COMMENT '邮箱'
)ENGINE=INNODB CHARSET=utf8;

#不指定字段名称,需要按照建表时的顺序给每一个字段赋值
INSERT USER VALUE(1,'king',24,'[email protected]');

#不指定字段名称,需要按照建表时的顺序给每一个字段赋值
INSERT USER VALUES(NULL,'queen',25,'[email protected]');
INSERT USER VALUES(DEFAULT,'lily',26,'[email protected]');

2.给指定值赋值:列出指定字段

insert  tb_name (字段名称,...)values (值,...);

#列出指定字段的来插入数据
INSERT USER(username,email)VALUES('rose','[email protected]');
#id是自动增长的,你不用赋默认值,age有默认值

#可以随便指定字段顺序的
INSERT USER (age,email,id,username)VALUES(34,'[email protected]',5,'imooc');
#只要保证字段和值一一对应就可以了

3.一次添加多条记录:

insert tb_name(字段名称,...)values(值,...),

(值,...),

(值,...);

#一次插入三条记录
INSERT USER VALUES(NULL,'a',DEFAULT,DEFAULT),
(NULL,'b',56,'[email protected]'),
(NULL,'c',14,'[email protected]');

insert ... set 的形式:insert tb_name set 字段名称=值,...;

#insert...set 的形式
INSERT USER SET username='d',age=45,email='[email protected]';

将别的表中的查询结果插入到这个表中中。

现在我们需要将这个表中的三个值拿过来当作用户名插入到user表中。

#insert select
INSERT USER (username)SELECT a FROM test;

查询出来之后,再插入这个表里

修改记录

updata tb_name set  字段名称=值,字段名称=值,...[where,添加条件];

如果不添加条件整个数据表中的数据都会被更新。

#更新单表id字段的值
#首先必须得先定位到这一条记录(id主键,相当于该用户的标识符)
#测试更新语句
#要求修改第一个用户的信息 id=1
UPDATE USER SET age=29 WHERE id=1;
#这样写完之后,你会发现满足这个条件的记录只有一条,接下来我们会把它的age字段改为29

#修改id=3的用户,username age email
UPDATE USER SET age=47,email='[email protected]',username='lilys' WHERE id=3;
#它会更新符合你条件的记录

#让所有用户的年龄加10
UPDATE USER SET age=age+10;

没有条件会更新表中的所有记录。

#将id<=5的用户年龄改为-20,将邮箱改为默认值
UPDATE USER SET age=age-20,email=DEFAULT WHERE id<=5;

删除记录

de'lete from tb_name (where条件);

如果不添加条件,表中所有数据都会被删除。

#测试删除语句
DELETE FROM USER WHERE username='king';

#删除年龄为24的用户
DELETE FROM USER WHERE age=24;

删除表中所有记录

#不指定字段名称,需要按照建表时的顺序给每一个字段赋值
INSERT USER VALUES(NULL,'queen',25,'[email protected]');
INSERT USER VALUES(DEFAULT,'lily',26,'[email protected]');

delete清空一张表时,不会修改auto_incerment的值。

当需要重置auto_increment的值时:alter table user auto_increment=1;

让编号从一开始,重置(修改)auto_increment的值。

delete清空数据表时,不会清空auto_increment的值。

彻底清空数据表的方式:truncate  [table] tb_name;会把表中的所有记录都删掉,并且会把auto_increment的值重置掉。但注意它不能带有条件。

查询记录

查询记录正在MySQL中是最重要的也是最复杂的。

基本语法形式:select expr... from tb_name [where 条件] [group by {col_name|position}(分组)(筛选)having 二次删选][order by {col_name|position|exptr}{asc|desc}][limit限制结果集的显示条数]

1.select *from tb_name;查询表中的所有记录,*代表所有字段。在实际的开发工作中尽量不要使用*因为它的效率是不高的。

2.查询指定字段的信息(可以把自己要查的字段放到里面):select 字段名称,...from tb_name;

#测试查询操作
#那么我们以后的测试就用这个表来测试了
CREATE TABLE user1(
	id INT UNSIGNED AUTO_INCREMENT KEY,
	username VARCHAR(20) NOT NULL UNIQUE COMMENT '姓名',
	age TINYINT UNSIGNED NOT NULL DEFAULT 18 COMMENT '年龄',
	sex ENUM('男','女','保密')NOT NULL DEFAULT '保密' COMMENT '性别',
	addr VARCHAR(20) NOT NULL DEFAULT '北京',
	married TINYINT(1)NOT NULL DEFAULT 0 COMMENT '0代表未婚,1代表已婚',
	salary FLOAT(8,2)NOT NULL DEFAULT 0 COMMENT '薪水'
)ENGINE=INNODB CHARSET=utf8;
INSERT user1 VALUES(1,'king',23,'男','北京',1,50000);
INSERT user1(username,age,sex,addr,married,salary)VALUES('queen',27,'女','上海',0,25000);
INSERT user1 SET username='imooc',age=31,sex='女',addr='北京',salary=40000;
INSERT user1 VALUES(NULL,'张三',38,'男','上海',0,15000),
(NULL,'张三风',38,'男','上海',0,15000),
(NULL,'张子怡',39,'女','北京',1,85000),
(NULL,'汪峰',42,'男','深圳',1,95000),
(NULL,'刘德华',58,'男','广州',0,115000),
(NULL,'吴亦凡',28,'男','北京',0,75000),
(NULL,'奶茶妹',18,'女','北京',1,65000),
(NULL,'刘嘉玲',36,'女','广州',0,15000);

#查询表中所有记录
SELECT *FROM user1;
#使用*的效率是比较低的
#查什么就写那个字段
SELECT username,addr,age FROM user1;
#查询king数据库下user1表中的所有记录
#它的好处就是不用打开数据库就可以直接查询该数据库下的数据表了
SELECT *FROM king.`user1`;
#不用打开数据库就可以查询指定数据库中的数据表
#给字段起别名
#查询user1表中的id 编号 username 用户名 sex 性别
SELECT id AS '编号',username AS '用户名',sex AS '性别'FROM user1;
#如果起别名了,显示的时候就按别名显示出来了

as可以省略,但不建议这么写。

select id age,age id,username from user1;可读性非常差。

给字段起别名

给数据表起别名

select 字段名称,...from tb_name [as] 别名;

在多表联合查询中给表起别名就非常有用了。

表名.字段名的形式:select tb_name.col_name,...from tb_name;

#给表其别名
SELECT id,username FROM user1 AS u;

#测试表名.字段名
SELECT user1.id,user1.username,user1.`age` FROM user1;
#但是这样每次写字段的时候都得带上表名,非常麻烦,这是就可以给数据表起别名了
SELECT u.id,u.username,u.addr,u.sex FROM user1 AS u;
#也就是把user1用u等量替换了

通过加上where条件会筛选出符合条件的记录

比较运算符:> >= < <= != <> <=>,<=>和=的区别

#测试where 条件的比较运算符
#查询id,username,age, id=5的用户
SELECT id,username,age FROM user1
WHERE id=5;

where只会筛选出符合条件的,若找不到符合条件的,会返回空。

#查询年龄小于等于20的用户
SELECT id,username,age FROM user1
WHERE age<=20;

#查询性别不为男的
SELECT id ,username AS 姓名,age,sex FROM user1
WHERE sex!='男';

#查询性别不为男的
SELECT id ,username AS 姓名,age,sex FROM user1
WHERE sex<>'男';

#查询性别为男的
SELECT id ,username AS 姓名,age,sex FROM user1
WHERE sex<=>'男';
#动态修改表结构
#添加desc字段 varchar(100)
ALTER TABLE user1
ADD userDesc VARCHAR(100);

#更新id<=9的用户 userDesc='this is a test'
UPDATE user1 SET userDesc='this is a test'
WHERE id<=9;

#查询用户userDesc 为NULL的用户
SELECT id,username,age,userDesc FROM user1
WHERE userDesc=NULL;

可以看到使用=是不能检测出NULL值的。

检测NULL值得方式有两种:

1.将“=”换为“<=>”,“<=>”可以检测NULL值

2.使用is NULL检测NULL值

#查询用户userDesc 为NULL的用户
SELECT id,username,age,userDesc FROM user1
WHERE userDesc IS NULL;

猜你喜欢

转载自blog.csdn.net/weixin_40316053/article/details/84099398