MySql全程基础讲解:增删改查、约束
1、 简介
sql: structured query language(结构化查询语言)
2、数据库服务器、数据库和表的关系:
3、数据在数据库中的存储方式
4、创建数据库
4.1 创建数据库的sql语句格式:
练习创建数据库
- 创建一个名称为mydb1的数据库:create database mydb1;
- 创建一个使用utf8字符集的mydb2数据库:create database mydb2 character set utf8;
- 创建一个使用utf8字符集,并带校对规则的mydb3数据库:create database mydb2 character set utf8 collateutf8_general_ci;
4.2、查看和删除数据库
练习查看和删除数据库
查看所有的数据库:show databases;
显示某个库的创建信息:show create database mydb3;
删除之前创建的mydb1数据库:drop database mydb1;
4.3、修改数据库
练习:修改数据库
修改字符集:alter database mydb2 character set gb2312;
4.4 备份(windows命令):
退出MySQL客户端:quit
在win命令行窗口中下才执行:mysqldump -uroot -p mydb1>D:\test.sql(这种文件是脚本文件)
4.5 恢复数据(不能恢复数据库)
- 通过执行备份的脚本文件来恢复:
a.创建数据库:create database mydb1 character set utf8;
b.恢复:source D:\test.sql
- 通过Windows命令来恢复:
a.先在服务器中创建一个叫mydb1的数据库:
b. mysql -uroot -p mydb1<D:\test.sql
5、创建表
练习:创建一个员工表
进入某个库,在其中创建表:use db_name;
create table employee
(
id int,
name varchar(20),
gender varchar(4),
birthday date,
entry_date date,
job varchar(40),
salary double,
resume text
)character set utf8 collate utf8_general_ci;
6、修改表(增加列、修改列、删除列)
MySql常用数据类型
注:VARCHAR、BLOB和TEXT类是变长类型,每个类型的存储需求取决于列值的实际长度。
修改表中列(增加列、修改列长度、删除列)、修改表的名称、字符集
练习:在表中增加一列,修改列的长度,删除列
在表employee上增加一列image,类型为blob:alter table employee add image blob;
修改job列长度为60:alter table employee modify job varchar(60);
删除gender列:alter table employee drop gend
将表名改为user:rename table employee to user;
修改表的字符集为utf8:alter table user character set gb2312;
修改列名name为username:alter table user change column nameusername varchar(20);
7、查看表(创建细节、结构、数据库中所有表的名称列表)
查看所有的表:show tables;
查看表的创建细节:show create table table_name;
查看表的结构:desc employee;
8、插入数据(insert into table_name)插入记录
练习:使用insert语句向表中插入一个员工的信息:
insert into user(id,username,birthday,entry_date,job,salary,resume)values(1,'rsl','1993-03-21','2018-02-18','teacher',10000,'resume');
插入一个名字是中文的员工信息:
insert into user(id,username,birthday,entry_date,job,salary,resume)values(2,'小李','1993-03-21','2018-02-18','teacher',10000,'resume');
发现也可以,因为我们查看编码:show variables like 'chara%';(显示字符集)
结果:
+--------------------------+---------------------------------------------------------+
| Variable_name Value |
+--------------------------+---------------------------------------------------------+
character_set_client gbk
character_set_connection gbk |
character_set_database utf8
character_set_filesystem binary
character_set_results gbk
character_set_server utf8
character_set_system utf8
character_sets_dir C:\Program Files\MySQL\MySQL Server5.7\share\charsets\
+--------------------------+---------------------------------------------------------+
发现character_set_client 是gbk,若是utf8,则插入汉字就会报错。
测试:将character_set_client(客户端) 改为utf8:set character_set_client=utf8;以及将set character_set_results(显示结果)改为:set character_set_results=utf8;再select * from user;结果就乱码,因为utf8不识别中文字符。在insert的时候一定要注意。
9、update 值 where…:用于更改表中的数据值
使用update更新
练习:在上面创建的employee表中修改表中的记录:
(所有行某一列)将salary列的值改为5000:updateuser set salary=5000;
(指定的行的某一列)将姓名为rsl的员工工资改为8000:update user set salary=8000 where username='rsl';
(指定的一行的多列)将姓名为小李的员工工资改为4000,job改为ccc:update user set salary=4000,job='ccc' whereusername='小李';
将rsl的salary在原有的基础上增加1000:
update user set salary=salary+1000 where user name='rsl';
注意(经验):写update语句时,先写好update user salary=... where username='rsl';不然会把所有用户的数据全部改掉,后果严重
10、delete 记录
练习:
删除名字为小明的记录:delete from user where username='小明';
删除表中所有的数据:delete from user或truncate table user;
区别:truncate table user;是先摧毁表,再重建表的结构
delete fromuser;是一行一行的删除;
11、select 数据
Select查询所有数据、某些列数据、过滤重复的信息
练习:查询表中所有的学生的信息
1、select *from user;
2、select id,username,birthday,entry_date,job,salary,resumefrom user;
上面两个效果一样,但是建议写成第二种,因为实际开发的时候别人才能知道你查询的是哪些数据。
查询表中所有人的username以及对应的job、salary
select user name,job,salary from user;
过滤掉表中重复的数据
1、Select distinct job from user;
+---------+
| job |
+---------+
| teacher |
| doctor |
| student |
+---------+
2、Select distinct username,job from user;
+----------+---------+
| username |job |
+----------+---------+
| rsl | teacher |
| wangwu | doctor |
| zhangsan |student |
| lisi | student |
+----------+---------+
12、表达式作用于列进行查询、as语句
select语句二:
练习1:
1、在所有的人的工资上加1000进行查询:
SELECT username,salary+1000FROM USER;//并没有改变原有数据库的值
2、统计每个人的总工资:select username,(salary+salary2)from user;
3、使用别名表示总工资:
select username as 姓名 ,(salary+salary2) as 总薪水 from user;
或者 select username 姓名 ,(salary+salary2)总薪水 from user;
select语句三:Where语句
练习2:
查询姓名为rsl的薪水salary:
Select salary fromuser where username=’rsl’;
全部信息:Select * from user where username=’rsl’;
查询基本工资大于等于7000的人的信息:
Select *from userwhere salary>=7000;
Where语句的运算符:
在where语句中经常使用的运算符:
练习:
查询基础工资在7000-8000之间的人的job
Select job from user where salary>=7000 and salary<=8000;
Select job from user where salary between 7000 and 8000;
查询基础工资在7000-8000之间的人的信息
Select * from user where salary>=7000 and salary<=8000;
Select * from user where salary between 7000 and 8000;
查询符合条件的人的信息
Select * from user where salary2 in(100,300);
Select * from user where salary2=100 or salary2=300;
查询所有姓li的信息:
Select * from user where username like ‘li%’;
+------+----------+------------+------------+---------+--------+--------+---------+
| id | username | birthday | entry_date | job | salary | resume | salary2 |
+------+----------+------------+------------+---------+--------+--------+---------+
| 4 | lisi | 1996-03-21 | 2016-05-17 | student | 6000 | ddddd | 100 |
| 5 | liwu | 1995-03-21 | 2016-05-17 | doctor | 5000 | eeeee | NULL |
+------+----------+------------+------------+---------+--------+--------+---------+
order by 语句
练习:
对薪水进行升序排列后查询:
Select username from user order by(salary+salary2);
Select username as 姓名, (salary+salary2) as 薪水 from user order by (salary+salary2) asc;
+----------+------+
| 姓名 | 薪水 |
+----------+------+
| liwu | 5050 |
| lisi | 6100 |
| zhangsan |7200 |
| wangwu | 8300 |
| rsl | 9400 |
+----------+------+
对薪水进行降序排列后查询:
Select usernameas 姓名, (salary+salary2) as 薪水 from user order by (salary+salary2) desc;
count函数
练习:
统计有多少条记录(行)?
Select count(*) from user;
统计薪水大于5000的有多个?
Select count(*)from user where salary>5000;
sum函数
将某一列求和:
Select sum(salary)from user;
统计一列的平均值:
Select sum(salary)/count(salary)from user;
Selectavg(salary) from user;
多列求和:
Select sum(salary),sum(salary2)from user;
Select max(salary)from user;
select语句六:
group by column 对列column分组:
语句:SELECT COLUMN1,COLUMN2,COLUMN3..FROM TABLE GROUP BY COLUMN;
即将column列进行归类,即去掉重复的元素
使用Having 子句过滤
select column1,column2,column3.. from table group by column having...
注意:
Having 和where 都可以过滤,但是having可以使用合计函数,having通常跟在group by 后,它作用于组。
练习:
建立一个table:
create table orders
(
id int,
products varchar(40),
price int
)character setutf8;
Insert into orders(id,products,price) values (1,'洗衣机',3000);
Insert intoorders (id,products,price) values (2,'冰箱',5000);
Insert intoorders (id,products,price) values (3,'洗衣粉',30);
Insert intoorders (id,products,price) values (4,'苹果',20);
Insert intoorders (id,products,price) values (5,'冰箱',5000);
进行归类:意思就是讲重复的去掉
Select products from orders group by products;
显示每类商品花了多少钱
Select products,sum(price) from orders group by products;
查询购买了几类商品,并查价格在200以上的商品
Select products,price from orders group by products having sum(price)>200;
13、时间、日期函数
14、字符串函数
15、数学函数
16、定义表的约束(重点)
定义主键的约束
一般来说,一个表都至少要有一个主键约束,约束越严格越好,可以避免非法数据的存入。
在创建表的时候就要定义哪些列值是主键约束,不允许重复,不允许为空
创建一个带有主键约束的表:
Create table test1
(
id int primary key,
username varchar(20),
password varchar(20)
)character setutf8;
Insert intotest1 (id,username,password) values (2,'zhangsan','123456');
如表:
定义主键自动增长(开发不常用)
让系统自己维护某一列带有该性质的值,如创建一个表:
Create table test2
(
idint primary key auto_increment,
usernamevarchar(20),
passwordvarchar(20)
)character set utf8;
Insert into test2 (id,username,password) values (1,'zhangsan','123456');
Insert into test2 (username,password) values ('lisi','123456');
只插入姓名,也会自动的在前面id加1:
如果将非数值型的列加上自动增长约束呢?
答:创建不成功,如
Create table test3
(
idint primary key,
usernamevarchar(20) primary key auto_increment,
passwordvarchar(20)
)character set utf8;
报错:Incorrect column specifier for column 'username'
定义唯一的约束
某列的值不允许重复,如账号
创建一个带有唯有约束的表:
Create table test3
(
idint primary key,
usernamevarchar(20) unique,
passwordvarchar(20)
)character set utf8;
执行:
Insert into test3 (id,username,password) values (1,'lisi','123456');
Insert into test3 (id,username,password) values (2,'lisi','123457');
ERROR 1062 (23000): Duplicate entry 'lisi' for key 'username'
定义非空约束
l 数据不能为空,如注册的时候用户名不能为空:
Create table test4
(
idint primary key,
usernamevarchar(20) unique not null,
passwordvarchar(20)
)character set utf8;
定义外键约束
什么是外键约束?
创建外键约束的表:
create table husband
(
id int primary key,
name varchar(20)
);
create table wife
(
id int primary key,
name varchar(20),
husband_id int,
constraint husband_id_FK foreign key(husband_id)references husband(id)
);
注:
constraint表示要添加外键约束了
husband_id_FK 表示外键约束的名称,惯性用法:要约束的列名称_FK
foreign key()表示你要约束哪一列,这里即husband_id
references husband(id)表示参照某个表(husband)的某个列值(id)
husband表结构和wife表结构如下:
在husband表中插入数据:
insert into husband (id,name) values (1,'lisi');
insert into husband (id,name) values (2,'wangwu');
在wife表中插入数据:
insert into wife (id,name,husband_id) values (1,'xiaocui',2);
insert into wife (id,name,husband_id) values (2,'fengjie',1);
insert into wife (id,name,husband_id) values (3,'fengjie',5);
报错:
17、将对象的数据存入数据库中
一对多、多对一
对象:有一个部门对象department、有一个员工对象Emplyee
联系:部门里有很多员工,每个员工有固定的所属部门
关系:从关系上看可以是一个部门对应多个员工,也可以是多个员工对用一个部门
现在要将右侧的数据存入表中:
l 原则1:
将一个对象的数据存入到一张表中,不管对象之间是什么关系,就看对象有什么基本属性就设置这些属性作为列
l 原则2
在有关联的对象的两张表中,在多的表中加外键约束。
如此例子中,在Emplyee表中加外键约束,表明每个员工是属于哪个部门
多对多(老师-学生)
原则同上
在多对多关系中,要建立一张中建表来存储两张表的关系
如中建表teacher_student表,里面有两列,分别都是外键约束,用来表示一个与另一个之间的关系,如:1号老师——学生1、学生2
学生1——老师1、老师2、老师3等等
下面来创建这样一张表:
create table teacher
(
id int primary key,
name varchar(20),
salary double
);
create table student
(
id int primary key,
name varchar(20)
);
create table teacher_student
(
teacher_id int,
student_id int,
primary key(teacher_id,student_id),
constraint teacher_id_FK foreign key(teacher_id) referencesteacher(id),
constraint student_id_FK foreign key(student_id) referencesteacher(id)
);
将表:
中的数据存入数据库中至少要写5条sql语句:
insert into teacher (id,name,salary) values (1,'张三',5000);
insert into teacher (id,name,salary) values (2,'王五',6000);
insert into student (id,name) values (1,'小明');
insert into student (id,name) values (2,'小张');
insert into teacher_student (teacher_id,student_id) values (1,1);
insert into teacher_student (teacher_id,student_id) values (1,2);
insert into teacher_student (teacher_id,student_id) values (2,1);
一对一(主从)
通常来说,将从的某一列设置为主键约束和外键约束
创建一个Person的表:
create table person
(
id int primary key,
name varchar(20)
);
创建Idcard表:
create table idcard
(
id int primary key,
addr varchar(20),
constraint person_id_FK foreign key(id) references person(id)
);
推荐他人博文: Mysql全程讲解(难点:键、索引和约束的关系)
-----------------------------------------------------------我是分割线--------------------------------------------------------------------
这是我的mysql基础学习笔记,欢迎阅读和提出意见和建议。