(一)
- 注意事项:
1:大小写:不严格区分大小写,默认大写为程序代码,小写为程序员写的代码
2:语句结束符:每个语句都以;或者\g结束
3:类型:强制数据类型,任何数据都有自己的数据类型
-
库操作
1.显示所有的库:show databases;
2.创建库:create database [if not exists] db_name,重复创建会报错, 可以加上if not exists;
3.删除库:drop database [if exists] db_name, 如果不知道数据库是否存在,记得加if exists;
4.进入数据库:use db_name; -
表操作
1.显示所有的表:show tables;
2.创建表:create table [if not exists] tb_name (create definition…/字段值1,类型1,字段值2,类型2.。。), 重复创建会报错, 可以加上if not exists;
3.显示创建表的信息:show create table tb_name;
4.删除表:drop table tb_name; -
插入数据
1.指定字段插入: INSERT INTO tb_name(field_name) VALUES (field_values);
2.全字段插入: INSERT INTO tb_name VALUES (all_values);
3.多行插入: INSERT INTO tb_name(field_name) VALUES (value_1), (value_2), …; -
查询数据
1.指定字段查询:SELECT field_names FROM tb_name;
2.全字段查询: SELECT * FROM tb_name;
3.带条件的查询: SELECT field_names FROM tb_name WHERE conditions; -
修改数据
1.修改所有数据:UPDATE tb_name SET field_1=value_1
2.修改多个: UPDATE tb_name SET field_1=value_1, field_2=value_2 …;
3.修改满足条件的数据: UPDATE tb_name SET field_1=value_1 WHERE conditions;
*注意:一定要写where条件,不然会修改表中全部数据
- 删除数据
1.删除表中所有数据:DELETE FROM tb_name;
2.删除表中满足条件的数据: DELETE FROM tb_name WHERE conditions;
注意:一定要写where条件,不然会删除表中全部数据
(二)
- order by`
SELECT columns FROM tb_name ORDER BY col [asc/desc] ;
正序:asc(默认)
倒序:desc
- limit
SELECT columns FROM tb_name LIMIT start, count ;
LIMIT count;
LIMIT start, count; 从start+1行开始算起,count条记录
- distinct(去重)
SELECT DISTINCT FROM tb_name;
- 模糊查询 like %
- 任意多个字符: %
- 任意一个字符: _
- 范围查询
- 连续范围: BETWEEN a AND b
a <= value <= b - 间隔返回: IN
a in (10, 20, 30 […])
- 常用聚合函数
1:统计个数:COUNT(column)
2:求和:SUM(column)
3.最大值:MAX(column)
4.平均值:AVG(column)
5.最小值:MIN(column)
6.列出字段全部值:GROUP_CONCAT(column)
group_concat(column) :就是根据column组合成一个单元格,
select group_concat(name order by age) as name; 根据age排序将名字组合成一个单元格,
可用substring_index来拿取第几个数据,以逗号分隔的第一个:
select SUBSTRING_INDEX(GROUP_CONCAT(stuName ORDER BY score ASC),’,’,1),
- 分组查询(group by)
1.Select 字段 from 表 group by 字段;
2.Select 字段,count() from 表 group by 字段
eg.SELECT species, COUNT() FROM pet GROUP BY species; - 聚合筛选(having)
1.Select 字段1 from 表名 group by 字段1,字段2 having 字段2>=80;
对于内容的限制
2.SELECT columns FROM tb_name LIMIT start, count ;
对于行数的限制
假如说
一个查询语句中同时包含了别名(as),聚合函数, where, having,
那么他们的执行顺序: where->聚合函数和别名->having
-
子查询
-
将一个查询的结果留下来用于下一次查询 ( select 中嵌套 select )
*嵌套的子查询必须始终出现在圆括号内
例子:
#求出学生的平均年龄
select avg(age) from students;
#查找出大于平均年龄的数据
select * from student where age > 19.7273;
#将求出的平均年龄的SQL语句用于查找大于平均年龄的语句中
select * from students where age > (select avg(age) from students);
- 连接查询
1.内连接(inner join)->无条件内连接:
- 无条件内连接,又名交叉连接/笛卡尔连接
- 第一张表种的每一项会和另一张表的每一项依次组合
Mysql> select * from student [inner] join scoren,
左右两个表全部数据依条匹配。
a->,a->B,a->C…
- 有条件内连接:
- 在无条件内链接的基础上,加上一个on子句
- 当连接的时候,筛选出那些有实际意义的记录来进行组合
Mysql> select * from student inner join scoren
-> on dept_id = id;
2.外连接( {left | right} join )
- 左外连接: (以左表为基准)
两张表做连接的时候,在连接条件不匹配的时候
留下左表中的数据,而右表中的数据以NULL填充
mysql> select * from student left join department
-> on dept_id= d_id;
- 右外连接: (以右表为基准)
对两张表做连接的时候,在连接条件不匹配的时候
留下右表中的数据,而左表中的数据以NULL填充
mysql> select * from student right join department
-> on dept_id= d_id;
(三)
- 表结构修改(alter)
1.修改表名:alter table 表名 rename to 新表名;
2.修改字段名:alter table tb_name change name new_name data_type;
3.修改字段类型:ALTER TABLE tb_name MODIFY field_name data_type;
4.添加字段:ALTER TABLE tb_name ADD [COLUMN] field_name data_type;
5.删除字段:ALTER TABLE tb_name DROP [COLUMN] field_name;
- 约束条件
约束是一种限制,通过对表中的数据做出限制,来确保表中数据的完整性,唯一性
- 默认约束(default)
CREATE TABLE tb(
id int default ‘a’ ,
name varchar(20)
);
插入数据的时候,如果没有明确为字段赋值,则自动赋予默认值,
在没有设置默认值的情况下,默认值为NULL
- 非空约束(not null)
CREATE TABLE tb(
id int not null,
name varchar(20)
);
限制一个字段的值不能为空,Insert的时候必须为该字段赋值,空字符不等于NULL
- 唯一约束(unique key)
CREATE TABLE tb(
id int unique key,
name varchar(20)
);
限制一个字段的值不重复,该字段的数据不能出现重复的,确保字段中值的唯一
- 主键约束(primary key)
CREATE TABLE tb(
id int primary key,
name varchar(20)
);
通常每张表都需要一个主键来体现唯一性,每张表里面只能有一个主键
主键 = 非空 + 唯一
主键可以约束多列,比如:
比如一个学生表,里面有班级,学号,姓名等字段,而每个班的学号又是独自编排的,回那就可以把班级和学号联合起来作为一个主键。例如:3班的11号,这样就可以唯一地标识一个学生。
这些列的每一行没有重复的组合
- 自增长约束(auto_increment)
CREATE TABLE tb(
id int auto_increment,
name varchar(20)
);
自动编号,和主键组合使用,一个表里面只能有一个自增长,auto_increment 要求用在主键上,乱序插入的数字会自动排序
- 外键约束(foreign key)
保持数据的一致性,我有的你一定有, 你没有的, 我绝对没有
- B表中的id_b字段,只能添加 id_a中已有的数据。
- A表中id_a 被参照的数据, 不能被修改和删除
CREATE TABLE a(
id_a int primary key,
name varchar(20)
);
CREATE TABLE b(
id_b int primary key,
name varchar(20),
foreign key (id_b) references a(id_a)
);
- 表关系
一对一表
一对多表
多对多表
以下为选课系统例子:
- 一对一关系(学生详情)
举例,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表来存放。
这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用主键加主键的方式来实现这种关系。
#建立详细学生表:
create table student_details(
id int primary key,
sex varchar(20) not null,
age int,
address varchar(20) comment '家庭住址',
parents varchar(20),
home_num varchar(20),
foreign key (id) references student(s_id)
);
一对一 :
用外键的方式,
把两个表的主键关联
- 一对多关系(学生所在学院)
举例,通常情况下,学校中一个学院可以有很多的学生,而一个学生只属于某一个学院。
学院与学生之间的关系就是一对多的关系,通过外键关联来实现这种关系。
##创建学院表
create table department(
d_id int primary key auto_increment, # 学院id
d_name varchar(20) not null # 学院名
);
##创建学生表
create table student(
s_id int primary key auto_increment, # 学生id
s_name varchar(20) not null, # 学生名字
dept_id int not null, # 所属学院 id
foreign key(dept_id) references department(d_id) #外键
);
insert into department values(1,'外语学院'),(2,'计算机学院');
insert into student values(1,'佳能',2),(2,'lucky',1);
- 多对多关系(学生选课)
举例,学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。
对于多对多关系,需要创建中间表实现。
#建立课程表:
create table cours(
cours_id int primary key auto_increment,
cours_name varchar(20) not null
);
Create table student(s_id int primary key auto_increment,s_name varchar(20) not null);
insert into student values(1,'qiye'),(2,'gg');
# 选课表 (中间表)
create table middle(
s_id int, #用来记录学生id
cours_id int, #用来记录 课程id
primary key(s_id,cours_id), # 联合主键
foreign key(s_id) references student(s_id), # 关联学生id
foreign key(cours_id) references cours(cours_id) # 关联 课程id
);
insert into cours values (1, ’python编程’), (2, ’大学英语’), (3, ‘音乐鉴赏’);
insert into `select` values(1,3); 表示学号为一的同学选择了音乐鉴赏这门课程
- insert into select values(1,3);
(s_id,cours_id);
s_id->student(s_id)
cours_id->cours(cours_id)
关于主键和外键的一点说明:
给表格设置了外键后,以为select打开后可以直接显示2个表的关联,但是并没有,显示时还是需要添加where/having筛选条件,外键只是2个表的内部约束关系,数据一致性,不会直接显示出来,体现在以下几个方面:
1:从表增加修改涉及到外键值,增加的外键值不是主表的主键值便阻止增加,修改的新值不是主表的主键值便阻止修改
2:主表删除行/修改主键值,其主键值/旧值在从表里存在便阻止删除(要想删除/修改,必须先删除/修改从表的相关行);
从表设置了外键关联到主表的主键,从表隶属于主表,主表若想删除主键或者修改成别的主键值,若此主键值在从表存在,删除了就没有了一致性,所以需要先从从表上删除此外键值,才能删除主表的此主键值;同理修改的新的主键值是否从表已经存在,若无,得先修改从表的外键值,再来操作主表,才能体现一致性。
同理从表的操作。
- 此练习有助于理解区分设置外键后多个表之间的关系:
把本章节表关系的几张表建立出来,
1.然后插入数据,
2.然后都查询出来,
3.然后删除表,
建立3个表,学院表,课程表,学生表,
请看下图的操作顺序,顺序颠倒的话就会报错(外键原理)。