MySQL 数据库操作

有点乱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;

原文地址:https://www.cnblogs.com/dyd520/p/11411686.html