有点乱ctrt+F 查找
数据库的操作(必须进入mysql)
(执行:mysql -u root -p)
1.查看当前MySQL下的数据库
例如:show databases;
2.创建数据库
格式:create database 数据库名称 ;
例如:create database test;
(注:MySQL下默认使用的编码格式为gbk,如果想要数据库下的表单中的数据支持汉字,需要设置数据库的编码格式 charset=utf8)
格式:create database 数据库名称 charset=utf8;
例如:create database test charset=utf8;
(注:数据库及表单的名称遵循之前学过的命名规则:英文字母及数字的组合,不能以数字开头,不区分大小写)
注:数据库的名称不能重复,在同一数据库下的表单的名称也不能重复
3.删除数据库
(注:当数据库被删除时,数据库中的表单也会被一起删除)
格式:drop database 数据库名称;
例如:drop database test;
4.使用数据库
格式:use
例如:use test1;
注:对数据表单的操作一定要进入到某一个数据库中
6.查看当前数据库下的表单
例如:show tables;
数据表单的操作
1、查看数据库下的表单
格式:show tables;
例子:show tables;
2、创建表单
2.1、创建一个全新的表单
格式:create table 表单名(列名 列的类型 列的约束);
例子: create table students(id int auto_increment primary key, name varchar(50) not null,
age int unique not null, address varchar(60));
2.2根据已经存在的表单创建一个表单(创建一个框子)
create table new stu like students;
2.3根据已经存在的表单创建一个表单(将查找到的内容复制到新的表单中但旧的表单格式不会被复制(格式没有完全复制)。)
create table 新的表单名 as 已经存在的表单的
create table newstu1 as select * from students;
SQL中的类型:
int: 整型
bigint:长整型
float:浮点型
char:字符串类型
varchar:可变的字符串类型
char(16):系统会自动分配16个字符的长度,不管后期存储几个字符,都会分配16个字符。
varchar(16):会根据后期使用的字符长度计算分配几个字符。
从性能上来说,char更好;从实际存储数据上来说,varchar更好。
blob:二进制类型(png、音频、视频等转为二进制存入数据库)
text:大文本类型
SQL中的约束:
作用:对插入的数据进行不同类型的限制。
注:约束最好在创建表单时直接声明(但后期也是可以再次添加或修改或删除的)
auto_increment :自增长约束 特点:不能为空,值不会重复,int类型,从1开始
primary key :主键约束 特点:不能为空,不能重复
not null :非空约束 特点:值不能为空
unique : 唯一约束 特点:除null值外,其他值不能重复
foreign key : 外键约束
3、删除表单
格式:drop table 表单名称;
例子:drop table students;
4、查看表单结构
格式:desc 表单名称;
例子:desc students;
5、查看创建表单时的语句
格式:show create table 表单名称;
例子:show create table students;
6、修改表单
6.1重命名表单
格式 :rename table 原表单名称 to 新的表单名称;
rename table newstu1 to stu1;
6.2 修改表单的字段
格式:alter table 表单名称 add/drop/change/modify 列名 类型 约束
6.3 新增一个字段
格式:alter table 表单名称 add 列名 类型 约束
alter table students add phone int(11) unique;
6.4删除一个字段
alter table students drop phone ;
6.5 更改一个字段 改字段名
格式 :alter table 表单名称 change 旧列名 新列名 类型 约束
格式:alter table students change phone sex int(11) default 1;
6.6 更新字段类型
格式 :alter table 表单名称 modify 旧列名 新类型 新约束
alter table students modify sex varchar(4);
七、数据的操作
1、增
1.1、全列插入数据
格式:insert into 表单名称 values(列对用的值);
例子:insert into students values(0, 'A', 10, '北京');
注:id为自增长的键,有auto_increment约束,在全列插入数据时,需要给该位置的数据做一个占位,
我们一般使用0做占位,防止其他列的数据放在该位置,但存入到数据表单中的数据会自动增长,
不用我们刻意管理(默认从1开始自增)。
注:当为全列插入数据时,值的顺序要与键(列)的顺序一致(如果不一致,可能数据会生错乱)。
注:当键为唯一约束(unique)时,值不能重复,如果重复,插入失败。
注:当为自增长约束时,如果增加数据,值会自动加1,如果插入失败,值也会增加,后期再
增加的数据不会使用已经被使用过的值。
1.2、缺省插入
格式:insert into 表单名称(列名1, 列名2 ...) values(值1, 值2 ....);
例子1:insert into students(name, age, address) values('D', 13, '河南');
结论:可以插入成功,原因:id为自增长的键,我们可以不用船只,系统会自动填充该位置的值。
例子2:insert into students(name, age) values('E', 14);
结论:可以插入成功,原因:address的值可以为空,如果我们不传值,系统使用默认值null。
例子3:insert into students(age, name) values(15, 'F');
结论:可以插入成功,原因:表单在创建时我们默认规定了间的名称,但不会规定顺序。
只要键的名称正确,值根据约束传入,就可以。
例子4:insert into students(name) values('G');
结论:插入失败,因为age的约束为 not null 非空,在插入数据时,必须传入值。
例子5:insert into students(age, name) values(15, 'H');
结论:插入失败,因为age的约束为 unique 唯一约束,在插入数据时,必须传入不同的值。
1.3、一次性插入多条数据
1.3.1、全列插入
格式:insert into 表单名称 values(值1, 值2 ....),(值1, 值2 ....),(值1, 值2 ....)...;
例子:insert into students values(0, 'I', 16, '河北'),(0, 'J', 17, '山西'),
(0, 'K', 18, '山东');
1.3.2、缺省插入
格式:insert into 表单名称(列名1,列名2) values(值1, 值2 ....),(值1, 值2 ....),(值1, 值2 ....)...;
例子:insert into students(name, age, address) values('L', 19, '陕西'),('M', 20, '陕北'),
('N', 21, '河南');
create table students(id int auto_increment primary key, name varchar(50) not null
default 'lily',age int unique not null, address varchar(60) default '北京');
注:default 设置默认值
2、删
格式:delete from 表单名称 where 条件;
例子:delete from students where id=13;
结论:会根据where后面的条件删除一条或多条数据。
注:如果不写where,会将整个表单中的数据全部删除。 慎用!!!!!!
例子:delete from students;
3、改
格式:update 表单名称 set 字段名1=新值1,字段名2=新值2... where 条件;
例子:update students set name='MMM' where id=15;
一次更改一列数据
update students set name='Lily', address='天津' where id=17;
一次更改多列数据
注:如果更新数据时,没有where条件,会将表单中的对应的列全部更新。慎用!!!!!!!
例子:update students set name='lucy';
4、查
4.1、全列查找
格式:select * from 表单名称;
例子: select * from students;
说明:如为 * 查找所有 如为 列名 查找当前这一列如果查找多个列,不同列名之间用逗号隔开。
from 为关键字,后面为表单名称,代表数据来自该表单。
列名可取别名 , 用 as或空格 连接。
如果别名中有空格或特殊字符,使用''引号引起来。
4.2 根据条件查询
格式:select * from 表单名 where 条件;
说明:where为关键字,后面的为筛选条件
如:select * from students where id>10;
where 条件
1.比价运算符
= 等于
> 大于
>= 大于等于
<= 小于等于
<> 不等于
!= 不等于
2.逻辑运算符
and 逻辑与 满足and左右两侧的两个条件
select * from students where name='ff' and id=10;
or 逻辑或 满足or左右两侧任意条件
select * from students where name='ff' or id=10;
not 逻辑非 不满足not 的条件
select * from students where not name='ff' ;
3.优先级
3.1小括号的优先级是最高的,
3.2 逻辑运算符的优先级 not>and>or
建议:如果不确定符号的优先级,可以使用小括号将该符号的优先级提升,再去进行判断。
4.非空判断
4.1 is null 空值
格式:where 字段 is null
select * from students where address is null;
4.2 is not null 非空值
格式: where 字段 is not null;
select * from students where address is not null;
注:null 为空值 ,空字符串不是空值 ,is null 与is not null 只能判断字段是否为null,不能判断是否为空字符串。
5、范围查找
5.1 in 集合 :查询在字段在集合中存在的数据
格式 : where 字段名 in (集合)
例子:select * from students where id in (1,3,4,6);
5.2 between... and.... 在一个连续的区间中查找
格式:where 字段名 between 起始数 and 结束数;
注:在mysql中,为闭合区间
select * from students where id between 2 and 6;
6 模糊查询 like
6.1 % 匹配零个或多个字符
select * from students where address like '%河%';
6.2 - 匹配一个字符
select * from students where address like '_南_';
建议:下滑线的方式不适合匹配多个字符
消除重复行 distinct
select dictinct name from students;
聚合函数
create table stu(id int auto_increment primary key,name varchar(30) not null,age int(11) not null,sex int default 1);
insert into stu values(0,'a',12,0),(0,'b',13,1),(0,'c',14,1),(0,'d',15,0),(0,'e',16,1);
1.count (字段) 统计个数
2.max 字段)返回当前字段的最大值
2.min字段)返回当前字段的最小值
2.sum字段)返回当前字段的求和
2.avg字段)返回当前字段的平均值
分组查询 group by
以字段分组,将该字段相同的值放入一组
格式:select 字段 from 表单 where 条件 group by 字段;
提示:where 条件 可以省略
注:根据分组查看数据时,返回的数据个数可能与原数据的个数不一致,原因为分组时将相同的数据放到一组中,我们只看到一个数据。
2. gruop by 与having 联合使用
having 后面接一个条件
对分组后的数据进行条件查询
排序 order by
格式:select * from 表单 order by 字段 asc/desc,字段 asc/desc;
说明:将数据根据字段1进行排序,如果字段1有多个相同的数据,会根据字段2进行排序。
默认:升序的排序 asc
desc: 降序排序
按照年龄升序排序
select * from stu order by age asc;
where与having 的区别
where:对整个表单进行筛选,先执行条件,再进行查询
having: 对分组后的数据进行再次筛选。
分页 limit
格式:select */字段 from 表单 where 条件 limit 起始下标,数据调数;
注:where 条件 可以省略
注:limit 的起始下标,为0
select * from students limit 0,2;
select * from students limit 1,2;
关联查询(多表查询)
准备工作:创建表单并插入数据
create table b1(id int(11),name varchar(255));
create table b2(num int(11),user varchar(255));
insert into b1 values(1,'a'),(2,'b'),(3,'c');
insert into b2 values(1,'A'),(1,'B'),(1,'C'),(1,'D');
1.左链接 left join
格式:select 字段 from 表单1 left join 表单2 on 表单1.字段=表单2.字段;
select * from b2 left join b1 on b1.id=b2.num;
注:左链接以左边的表为主表
2.右链接 right join
select * from b2 right join b1 on b1.id=b2.num;
3.内连接 inner join 以两表最少条数显示
select * from b2 inner join b1 on b1.id=b2.num;
表单的设计
1.一对一 (一个表单)
id---name---age
2.一对多
班级 ------学员
3.多对多
一个学科可以有多个学员,一个学员可以选多个学科
表单的实现(使用外键实现)
语法 : foreign key(字段名(将该字当做外键使用) ) references 要关联的表名(关联的字段)
1、一对一
2、一对多
2.1、创建表单
班级表:
claid 班级编号
claname 班级名称
创建班级表
create table class(claid int(11) primary key,name varchar(16) not null);
添加数据
insert into class values(1,'python1班'),(2,'web1班'),(3,'java1班');
学员表:
stuid 学员id
stuname 姓名
claid 班级id
创建学院表
create table students1(stuid int(11) auto_increment primary key,stuname varchar(16) not null,claid int(11) not null,foreign key(claid) references class(claid));
添加数据
insert into students1 values(0,'小明',1),(0,'小辉',3),(0,'小红',2),(0,'熊熊',1),(0,'饼干',3),(0,'官保',2),(0,'聪聪',1);
注:添加外键关联数据时,添加关联表中字段没有的数据,会直接报错
多对多
创建表单
课程表 cid cname----course
学员表 sid sname-----people
关系表 cid sid ------ cp cid----course(cid) sid----people(sid)
创建课程表
create table course(cid int(11) auto_increment primary key,cname varchar(255) not null);
创建学员表
create table people(sid int(11) auto_increment primary key,sname varchar(255) not null);
创建关系表
create table cp(sid int(11) not null,cid int(11) not null,foreign key(sid) references people(sid),foreign key(cid) references course(cid));
添加数据
insert into course values(0,'语文'),(0,'生物'),(0,'数学'),(0,'英语');
insert into people values(0,'小明'),(0,'小红'),(0,'小吕'),(0,'小小');
insert into cp values(1,2),(2,3),(1,3),(4,3),(3,4),(3,3);
查找学数学的人
select people.sname,course.cname from cp,course,people where cp.cid=course.cid and people.sid=cp.sid and course.cname='数学';
注:如果数据库引擎不是innodb,需要设置引擎类型,在语句后面添加engine=innodb;
如:create table people(sid int(11) auto_increment primary key,sname varchar(255) not null)engine=innodb;
删除数据
delete from 表名 where 条件;
注:当涉及删除数据,如果需要删除主表中的数据的时候,需要先删除从表中的数据;
子查询
1 从表单中查询数据
select * from 表单;
2 从结果集中查询数据
create table newtable as select * from student;
格式:select */字段 from (select */字段 from 表单 where 条件 )
八、SQL中的基本函数
dual:虚拟表单
1、字符函数
1.1、字符转为大写 upper
例子:select upper('abcdef') from dual;
1.2、字符转为小写 lower
例子:select lower('ABCDEFG') from dual;
1.3、获取字符长度 length
例子:select length('ABCDEFG') from dual;
2、数学函数
2.1、返回绝对值 abs(num)
例子:select abs(-10) from dual;
2.2、四舍五入 round(num, n) 保留n位小数
例子:select round(2.5) from dual;
例子:select round(2.123456, 2) from dual;
2.3、返回开方 sqrt(num)
例子:select sqrt(9) from dual;