网络开发设计实战 --数据存储篇(关系型数据库MySQL增删改查)

在Linux下的数据库路径是在 var/lib/mysql 一定要切换到超级管理员下才可以进入

关系型数据库:

服务端的安装:

sudo apt-get install mysql-server

启动服务

sudo service mysql start

查看进程中是否存在MySQL服务

ps ajx|grep mysql

停止服务

sudo service mysql stop

重启服务

sudo service mysql restart

卸载MySQL

sudo apt-get remove mysql-*

清理残留的数据

dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

命令行操作数据库:

链接数据库:

连接远程数据库:

mysql -h 127.0.0.1 -uroot -p

windows下

mysql -uroot -p

Linux下

mysql -uroot -pmysql

退出系统: exit/quit/CTRL+D

查看数据库 show databases;

mysql里不区分大小写

显示时间 select now()

查看数据库版本 select version();

创建数据库 create database study;

创建新的数据库编码以utf-8 create database new_study charset=utf8;

查看数据库 show create database new_study;

删除数据库:drop database study

数据库表的操作及使用数据库:

使用数据库 use 数据库名;

查看当前使用的数据库 : select database();

数据库的操作:

查看当前数据库所有的表 show tables;

创建数据表 create table xxxx(id int,name varchar(30));

查看数据库表的结构 desc xxxx

创建students表(id,name.age,high,gender,cls_id):

create table  students(
    id int unsigned not null auto_increment primary key, 
    name char(30),
    age tinyint unsigned,
    high decimal(5,2),
    gender enum("男","女","中性","保密") default “保密”,
    cls_id int unsigned
);

SQL语句中各个定义的意义:

类型 字节大小 有符号范围 无符号范围
tinyint 1 -128~127 0~256
smallint 2 -32768~32767 0~65535
mediumint 3 -8388608~8388607 0~16777215
int/integer 4 -2147483648~2147483647 0~。。。。。
bigint 8 特别大。。。 更大了

常用数据类型:

整数: int

小数:decimal

字符串:varchar char

日期时间: date time datetime

枚举类型: enum

char表示固定的字符串 如char(3) 如果填充为 “ab” 则会在后面补充一个空格,而varchar则不会

default 默认值

unsigned 没有符号的整型

primary 设置主键

日期事件类型

类型 字节大小 示例
date 4 2020-01-01
time 3 12:59:59
datetime 8 2021-01-01 12:59:59
year 1 2017
timestamp 4 1970-01-01 00:00:01

插入数据: insert into students values(0,"老王",18,188,"男",0);

查看表的数据: select * from students;

例子(创建一个班级表 id name):

create table classmates(
    id int unsigned not null auto_increment primary key,
    name varchar(3));

插入数据:

insert into classmates values(0,"计算机一班")

查看数据:

select * from classmates;

修改表 添加字段 alter table 表名 add 列名 类型;

例子: alter table students add birthday datetime

修改表 修改字段 重命名版

alter table 表名 change 原名 新名 类型及约束;

例子:alter table students change birthday birth datetime not null;

示例:这个也可以写默认值

例子: alter table students change birthday birth date default "2000-01-01";

修改表 修改字段 不重命名版

alter table 表名 modify 列名 类型及约束;

例子:alter table students modify birth date not null;

修改表 删除字段

alter table 表名 drop 列名;

例子:alter table students drop birthday;

删除表

drop table 表名;

例子: drop table students;

查看表中创建的语句

show create table 表名;

例子:show create table classes;

表里数据的增删改查

查询所有列:select * from 表名

增加

  1. 全列插入 insert [into] 表名 value(…)

主键字段可以用0 null default 来占位

例如在classes 表中插入一个班级为路桥01班,示例SQL语句如下

insert into classes values(0,"路桥01");

向students表种插入一个学生的信息

insert into students value(0,"张三”,20,"女",1,"1990-01-01")

注意我们这里value后面的值可以是0 可以 null 也可以是default来占位,在第四个value值中,因为我们用了枚举来进行定义表

因此如果我们不想写男/女/中性/保密 是也可以用1234来进行代替

  1. 部分插入

    对于如果我们要是不想插入全部的值,那么我们只需指定填写的字段,如果我们要是不填写的话那么数据库就指定为空,或者指定为默认值。

    示例,如果我们要是想在students数据表中插入小乔我们只指定姓名和性别,那么示例代码如下:

insert into students (name,gender) value("小乔",2);

3. 多行插入

​ 如果在实际生产过程中,我们不方便多次进行插入,那么我们可以指定一次性进行全部插入

insert into students (name,gender) value("大桥",2) ,("貂蝉",2);

update 表名 set 列1=值1,列2=值2 where 条件;

这里我们注意,where相当于if条件语句,后面写条件

场景:修改students表里性别那列,全部修改成为男

update students set gender=1;

但是这只能修改全部的,貌似效果很差,但是如果我们要是只想修改某行的字段该怎么做呢,这里我们引用where函数

只要name是小李飞刀的全部修改

update students set gender=2 where name="小李飞刀";

但是我们在生产过程中我们不会用name来定位数据库里的数据

update students set gender =2 where id=3;

在业务场景中,如果我们不只想改这一个字段,我们需要设定一下某个字段并且指定条件

update students set age=22,gender=2 where id=3;

删除

  1. 物理删除

delete from 表名 where 条件;

清空数据表 delete from students; 这样会导致整个数据表单中所有的信息全部被删除

我们也可以尝试一下加一个条件或许可以让数据变的更加的安全些

delete from students where name =“小李飞刀” 这个语句会使我们删掉students数据表中所有的name="小李飞刀"字段

  1. 逻辑删除(在逻辑中删除,而并不是真正意义上的删除)

用一个字段来表示,这条信息是否已经不能再使用了

业务场景: 给students表添加一个is_delete 字段,bit类型

alter table students add is_delete bit default 0;

update students set is_delete=1 where id=6;

查询

查询所有列 select *from 表名;

查看student表 select *from student;

但是在大量的数据库数据中我们要面临大量的数据,因此我们需要指定条件来进行查询

示例: 查询student数据表中name =“小李飞刀”字段的全部信息

select *from student where name ="小李飞刀"

查询条件我们也是可以指定的,比如我们指定 id>3 那么同样也是适用于此查询条件的

如果我们只想看某一列或者某一个,我们只需要指定条件

指定条件查询 select 列1 ,列2,........from 表名;

字段的顺序

可以使用as为列或表指定别名

查看某一段

select 字段[as 别名] , 字段[as 别名] from 数据表 where........;

我们如果要是不想看字段的名字的话我i们可以指定一下字段的意思,这里我们把name 指定为 姓名,gender指定为性别 源自于students数据库表单里

select name as 姓名 ,gender as 性别 from students;

字段的顺序

select id as 序号,gender as 性别 ,name as 姓名 from students;

SQL 语句的深造 --查询篇:

数据准备: create database python_test charset= utf8;

使用一个数据库: use python_test;

显示使用的数据库: select database():

创建数据表:

–创建students表单数据库表

 create table students(
     --设置主键指定索引不能为空
    id int unsigned primary key auto_increment not null,
    name varchar(20) default" ",
     --unsigned的意思是不加负数
    age tinyint unsigned default 0,
     --unsigned 五位小数
    height decimal(5,2),
    gender enum ("男","女","中性","保密") default "保密",
    cls_id varchar(30) default "计算机科学与技术01班",
    is_delect bit default 0
    );

–创建classes表单数据库表

create table classes(
    id int unsigned auto_increment primary key not  null,
    name varchar(30) not null
);

插入数据

–向students表中插入数据

insert into student values()

–向classes表中插入数据

基本查询

查询 所有字段: select *from 表名;

查询指定字段: select 列1,列2.......from 表名;

select name,age from students;

使用as给字段起别名: select 字段 as 名字.......... from 表名;

select name as "姓名"  age as "年龄" from students;

select 表名.字段.........from 表名;

select students.name ,students.age from students;

可以通过as给表起别名

select 别名,字段......... from 表名 as 别名;

select s.name , s.age from students as s;
--select students.name , students.age from students as s;这种写法就是错的,因为指定了字段的小名后就不允许再用之前的名字了 

查询students表单中gender全列的数据

select gender from students;

消除重复行:

distinct 字段 可以实现去重的效果

生产场景,查看students表单中gender列里的不一样的数据

select distinct gender from students;

划重点,以上的查询方式只适用于数据库很小的数据库,但是在大数据面前我们更多的时候需要采用条件查询

条件查询

  1. 比较运算符

select ........from 表名 where.......

查询大于18岁的信息

select *from student where age>18;
--如果不是*也行,同样可以用,前面不重要,真正后面的才是最重要的
select id,name,gender from students where age>18;

查询小于18岁的信息

select * from students where age<18;

查询小于或等于18岁的信息

select * from students where age<=18;

查询年龄为18岁的所有学生的信息

select *from students where age=18;
  1. 逻辑运算符

and or not (与,或,非)

and

业务场景1 :查询18到28之前所有的学生信息:

--and左右两侧的语句条件必须写全
select *from students where age>18 and age<28;

业务场景2:查询18岁以上的女性身高或超过180的女性

select * from students where age>18 or heigh>180 and gender="女";

业务场景3: 查询年龄不是小于或等于18并且是女性

--注意这里的优先级,如果要是不加(),那么where 智慧执行后面紧跟着那个条件,最重要的我们就直接加一个括号
select *from students where not (age<=18 and gender=2);
  1. 模糊查询

    1. like

      % 替换1个或者多个

      _ 替换1个

      业务场景:查询姓名中 以 “小” 开始的名字

      select name from students where  name like "小%";
      

      业务场景:查询名字中有"小"所有的名字

      select name from students where name like "%小%";
      

      业务场景:查询有两个字的名字

      select name from students where name like "__";
      

      业务场景:查询至少有两个字的名字

      select name from students where name like "__%"
      
    2. rlike 正则

    业务场景:查询以周开始的名字

    select name from students where name rlike "^周.*"
    

    业务场景:查询以周开始以伦结尾的名字

    select name from students where name rlike "^周.*伦$"
    
  2. 范围查询

in(1,3,8) 表示在一个非连续的范围内

比如:查询 年两位18,34的姓名

select name,age from students where age in(1834)

not in 查询不在某个范围之内的信息

select name,age from students where age not in (18,34);

如果要是查找连续信息那么需要用 between …and…

查询年龄不在18到34的信息

select *from students where age not between 18 and 34;
select *from students where not age between 18 and 34;
-- select *from students where age not (between 18 and 34); 千万不能这么写,因为 not between 是一种用法,而不是一个赋值语句

空判断

判空 is null

查询身高为空的信息

select *from students where height is null;

查询身高不为空的信息

select * from students where heigh is not null;

排序: order by

排序只有两种方式,从小到大,从大到小

asc 从小到大排列 即为升序

desc从大到小排序,即为降序

生产场景: 查询年龄在18-34岁之间的男性,按照从小到大进行排序

select * from students where (age between 18and 34) and gender=1 order by age;
-- 默认为asc 升序
select * from students where (age between 18and 34) and gender=1 order by age asc;
-- desc为降序
select * from students where (age between 18and 34) and gender=1 order by age desc;

生产场景:查询年龄在18到34岁之前的女性,身高为从高到矮排序

select *from students where age between 10 and 34 and gender="女" order by age desc;

但是order by 是可以指定多个字段来进行排序的,这条语句的意思就是前面的相同的话就按照后面的方式进行拍

select *from students where age between 10 and 34 and gender="女" order by age desc,id desc;

工程案例:

按照年龄从小到大,身高从高到矮的顺序

select * from students order by age asc,height desc;

聚合函数

总数 计算搜索的数据库的总数多少行

在终端计算一下搜索的数据一共多少个

统计终端总和函数为 count()

select * from students where gender="女";
select count(*) from students where gender ="女"

最大值 max

工程实例: 查询最大年龄

select age from students;
select max(age) from students;
-- 主要实现思路是先查看所有人的年龄,再来查看最大年龄的那个人

工程实例: 查询最大的女性身高

-- 思路是先查看所有女人的身高 再查看最大身高的女性
select gender=1 from students;
select max(height) from students where gender=2;

最小min同理

总和sum也同理

平均值avg也同理

计算平均年龄 sum(age)/count(*)

计算平均年龄

select avg(age) from students;
-- 二者最终达到的效果是一样的 都是计算平均年龄
select sum(age)/count(*) from students;

四舍五入 round(123,23,1) 保留一位小数

计算所有人的平均年龄 保留两位小数 保留三位小数就改成 3

select round (sum(age)/count(*) ,2) from students;

计算男性的平均身高,保留两位小数

select round(avg(height),2) from students where gender ="1";

分组 group by

什么是分组,分组的定义就是按照一个性别分组,查询所有的性别

select ...... from students group by gender;

记住,这里面千万不要写* 省略号里面放唯一的条件

计算分组查询性别分组里各个年龄的总数

select gender,count(*) from students group by gender;

计算性别分组中年龄最大的那个

select gender ,max(age) from students group by gender;

计算性别分组中平均数

select gender , sum(age)/ count(*) from students group by gender;
-- 或者也可以用avg来进行计算
select gender ,avg(age) from students group by gender;

如果我们要是想看到某个组内所有数据

select gender ,group_concat(name) from students group by gender;

计算男性总数

select gender ,count(*) from students where gender=1 group by gender;

显示所有男性分组

select gender , group_concat(name) from students where gender=1 group by gender;

可以在group_concat() 里面指定字段,就全都显示出来了

select gender ,group_concat(name,age,id) from students where gender=1 group by gender

group_concat() 功能特别强大,有什么就链接显示什么

select gender ,group_concat(name,"_",age," ",id) from students where gender=1 group by gender

查询平均年龄超过30岁的性别,以及姓名, having avg(age) >30

having是对结果进行判断

按照性别分组,查询平均年龄大于30的人,并且显示平均年龄

select gender ,group_concat(name) ,avg(age) from students group by gender having avg(age) >30;

查询每种性别中的人数大于2个的信息

select gender ,group_concat(name) from students group by gender having count(*)>2;

如果要是查全部分组的话,那么就是去掉having

select gender ,group_concat(name) from students group by gender 

分组和聚合一起配合使用才有意义!

数据库的设计

三范式 原子性 必须要一一对应 必须有主键,后面的表头必须要和前面的主键一一对应 不符合范式就单独拆成一张表

关系型数据库每张表必须有关系

你可能感兴趣的:(mysql,数据库,web设计,数据库开发,数据仓库)