MariaDB 数据类型

MariaDB数据类型可以分为数字,日期和时间以及字符串值。

使用数据类型的原则:够用就行,尽量使用范围小的,而不用大的

常用的数据类型

  1. 整数:int, (bit比整数还要小的整数,即二进制)
  2. 小数:decimal                                                                          --decimal(5,2) 保留5位数字,小数点后两位
  3. 字符串:varchar(2)最大占位2字符        Char(2)占位2字符      --括号内的2是限制
  4. 日期时间:date, time, datetime
  5. 枚举类型(enum)                                                                           --(例:‘男’‘女’)即只能选择

约束

  1. 主键primary key:物理上存储的顺序,不能重复
  2. 非空not null:此字段不能为空
  3. 唯一unique:此字段不允许重复
  4. 默认default:当不填写此值时会使用默认值,如果填写则已填写为准
  5. 外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常

查看日期,必须用相应格式

 

select now();                                                                    --显示当前时间

select database();                                                            --显示当前数据库

create database test1 charset utf8;                                 --创建一个支持中文的数据库tset1

create table xxxx(id int, name varchar(20));                    --创建xxxx表 (字段的名是id,id的类型是int,数据名name,字符串varchar)

 

create table yyyy(id int primary key not null auto_increment, name varchar(30));     --若命令太长也可以(如下)分行写

create table zzzz(                                     

id int primary key not null auto_increment,                    --自增

name varchar(20)

);

insert into yyyy values (1,'张三');                                      --在yyyy表中添加张三

select * from yyyy;                                                            --查看yyyy表信息

desc xxxx;                                                                        --查看表结构

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

create table students (    

id int unsigned not null auto_increment primary key,

name varchar(20),

age tinyint unsigned default 0,

high decimal(5,2),

gender enum('男', '女', '中性', '保密') default '保密',

cls_id int unsigned

);                                                                                         --创建students表 

insert into students values(0,'金星',18, 188.88, '中性', 0);   --插入一条信息进入到students表

create table classes(

id int unsigned not null auto_increment primary key,

name varchar(20)

);                                                                                         --创建classes表(id, name)

 

show create table students;                                            --查看表的创建

 

--修改表-添加字段

alter table students add birthday datetime;                       --alter table 表名 add 列名 类型;(即:添加个字段)

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

alter table students modify birthday date;                         -- alter table 表名 modify 列名 类型及约束;(即:修改个字段)

-- 修改表-修改字段:重命名版

alter table students change birthday birth date default '2000-01-01';    -- alter table 表名 change 原名 新名 类型及约束;

 -- 修改表-删除字段

alter table students drop xxx;                                              --删除students表中的xxx字段

-- 删除表

-- drop table xxxx;                                                               --删除xxxx表

 

--MyISAM与InnoDB区别(两种引擎)

--两种类型最主要的区别就是InnDB支持事物处理与外键和行级锁

 

--增删改查

 --增加

 --全列插入

        --insert into 表名 values(..)

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

        insert into classes values (0, '大神班');

 

- 向students表里插入 一个学生信息

        insert into students values (0, '鹿鼎记', 20, '女', 1, '1990-01-01')

        insert into students values (null, '鹿鼎记', 20, '女', 1, '1990-01-01')

        insert into students values (default, '鹿鼎记', 20, '女', 1, '1990-01-01')

        insert into students values (default, '鹿鼎记', 20, '1', 1, '1990-01-01')

        insert into students values (default, '鹿鼎记', 20, '2', 1, '1990-01-01')

        insert into students values (default, '鹿鼎记', 20, '3', 1, '1990-01-01')

        insert into students values (default, '鹿鼎记', 20, '4', 1, '1990-01-01')

        --失败insert into students values (default, '鹿鼎记', 20, '第四性别', 1, '1990-01-01')

 --部分插入

         insert into students(name, gender) values ('小乔', 2);

 --部分插入多条记录

        insert into students(name, gender) values ('大乔', 2),('貂蝉', 2);

 

--修改表内信息

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

update stadents set age=15 where id=14;                         --修改大乔年纪

--删除表内信息

--物理删除(从硬盘里删除数据)

-- delete from 表名 where 条件

--删除students表内所有数据

delete from students where id=15                                    --删除students表内id为15的所有数据

 

--逻辑删除

 

-- 用一条字段来表示 这条信息是否已经不能在使用了

-- 给students表添加一个is_delete字段 bit 类型

-- alter table students add is_delete bit default 0;

-- update students set is_delete=1 where id=6;

alter table students add is_delete bit default 0;                --添加一个字段is_dalete设为bit类型,默认是0,但是不显示,并不会影响使用

 

--查询基本使用(条件,排序,聚合函数,分组,分页)

 

查询  练习准备

1、--创建学生表

create table students (

id int unsigned not null auto_increment primary key,

name varchar(20) default '',

age tinyint unsigned default 0,

high decimal(5,2),

gender enum('男', '女', '中性', '保密') default '保密',

cls_id int unsigned default 0,

is_delete bit default 0

);

 

2、--创建班级表

create table classes(

id int unsigned auto_increment primary key not null,

name varchar(20) not null

);

3、--往students表里插入数据

insert into students values

(0,'小明',18,180.00,2,1,0),

(0,'小月月',19,180.00,2,2,0),

(0,'彭于晏',28,185.00,1,1,0),

(0,'刘德华',58,175.00,1,2,0),

(0,'黄蓉',108,160.00,2,1,0),

(0,'凤姐',44,150.00,4,2,1),

(0,'王祖贤',52,170.00,2,1,1),

(0,'周杰伦儿',34,null,1,1,0),

(0,'程坤',44,181.00,1,2,0),

(0,'和珅',55,166.00,2,2,0),

(0,'刘亦菲',29,162.00,3,3,0),

(0,'金星',45,180.00,2,4,0),

(0,'静香',18,170.00,1,4,0),

(0,'郭静',22,167.00,2,5,0),

(0,'周杰',33,178.00,1,1,0);

 

--向classes表里插入数据

insert into classes values (0, 'python_01期'),(0, 'python_02期');

 

-- 查询所有列

--select * from 表名

select * from students;                                                --查询students表中的所有字段

select * from classes;

 

--一定条件查询

select * from students where name='小李飞刀';          --查找name是小李飞刀的

select * from students where id>3;                             --查找id>3的

 

-- 查询制定 列

select name, gender from students;                            --查询 name 和 gender 这两列

 

-- 可以使用as制定列或表制定别名;

select name as 姓名, gender as 性别 from students;    --查询 name 和 gender 两列,并定义别名 为姓名和性别

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

 

-- 通过表名字查询

select student, students.age from students;             --查询 name 和 age 这两列

 

-- 给表起别名查询

select , s.age from students as s;                               --将 name,age,定义别名为 s,查看 s

 

--消除重复行

-- distinct

select distinct gender from students;                                   --查看gender列,并删除重复的

 

--条件查询

--比较运算符

select * from students where age > 18;                                -- 查询年纪大于18岁的信息

select id, name, gender from students where age > 18;      --查询年纪大于18岁的信息,显示id,nsme,gender三列

select * from students where age>18 and age<28;             --18岁到28岁之间(and)

select * from students where age>18 or high>=180;          --在18岁以上或者身高180以上的人(or)

 

-- 模糊查询

-- like

-- % 替代1个或者多个甚至是没有

select * from students where name like '小%';                      --查找name是‘小......’的信息

 

-- 查询姓名中有‘小’的所有名字

select * from students where name like '%小%';                   --查找name是‘ ...小...’的信息

 

 

-- 查询有两个字的名字

select * from students where name like '__';                         --查找name是两个字符的信息(“_”代表一个字符)

 

select * from students where name like '__%';                      -- 查询至少有2个字符的信息

 

-- rlike 正则

--  (.*贪婪匹配,.*?非贪婪匹配)

select * from students where name rlike '^周.*';                  --查找以“周“为开头的信息

select * from students where name rlike '^周.*儿$';             --查找以”周“为开头,”儿“为结尾的信息

 

--范围查询

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

select * from students where age=18 or age=34;                -- 查询 年纪为18,34的人

 

select * from students where age=18 or age=34 or age=12;

select * from students where age in (12,18,34);                   --查询年纪为12,18,34的人

 

select * from students where age between 18 and 34;        --查询 年龄在17岁到34岁之间的信息

 

select * from students where age not between 18 and 34;  --查询 年纪不在18到34岁的信息

 

-- 空判断

-- 判断is null

select * from students where high is null;                              --查找high是null(空)的信息

 

-- 判断非空is not null

select * from students where high is not null;                       --查找high不是null(空)的信息

 

排序    

--order by 字段

--asc从小到大排列,即升序

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

        

--查询年纪在18到34岁之间的男性,按照年纪从小到大

select * from students where age between 18 and 34 and gender=1;

select * from students where age between 18 and 34 and gender=1 order by age;

select * from students where age between 18 and 34 and gender=1 order by age asc;

select * from students where age between 18 and 34 and gender=1 order by age desc;

--查询 students 表中的 age 18 到 34 的 枚举的第一个元素

        --查询 students 表中的 age 18 到 34 的 枚举的第一个元素,并且以age字段 进行默认排序

        --查询 students 表中的 age 18 到 34 的 枚举的第一个元素,并且以age字段 进行 asc 方式排序

        --查询 students 表中的 age 18 到 34 的 枚举的第一个元素,并且以age字段 进行 dasc 方式排序

select * from students where (age between 18 and 34) and gender=2 order by high desc;

--查询年纪在18到34岁之间的女性,身高从高到矮排序

 

--order by 多字段

select * from students where (age between 18 and 34) and gender=2 order by high desc, age desc;

--查询年纪在18到34岁的女性,身高从高到矮排序,如果身高相同的情况下按照年纪从大到小排序

select * from students where (age between 18 and 34) order by high desc, age,id;

--查询年纪在18到34岁的女性,身高从高到矮排序,如果身高相同的情况下按照年纪从大到小排序,如果年龄也相等那么按照id从大到小排序;

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

 --按照年纪从小到大、身高从高到矮的排序

--聚合函数

-- 总数

-- count(*)统计行数据数 

-- 查询男性有多少人

select * from students where gender=1;                                --查询students表 中 gender枚举 的第一个元素

select count(*) from students where gender=1;                    --查询students表 中 gender枚举 是第一个元素的数量

select count(*) as '男性' from students where gender=1;      --查询students表 中 gender枚举 是第一个元素的数量 并定义别名 男性

    

-- 最大值

-- max

select age from students;                                                        -- 查询年纪列

select max(age) from students;                                               -- 查询最大的年纪

select gender,max(high) from students where gender=2;     -- 查询女性的最高 身高

    

-- 最小值

-- min

select min(age) from students;                                              -- 查询最小的年纪

    

-- 求和

-- sum

select sum(age) from students;                                               -- 计算所有人的年龄总和

    

-- 平均值

-- avg

select avg(age) from students;                                               -- 计算平均年纪

    

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

select sum(age)/count(*) from students;

 

-- 保留2位小数

select round(avg(age), 2) from students;

    

-- 分组

-- group by(先分组在查询)

select gender from students group by gender;                    -- 按照性别分组,查询所有的性别

    

select gender, count(*) from students group by gender;     -- 计算每组性别的人数

    

select gender, count(*) from students where gender=1 group by gender;    -- 计算男性人数

    

--把查出来的内容拼接成一个字符串concat

select concat(id,name,age) from students;                        --查询id,name,age并拼成一个字符串

select concat(id,' ',name,' ',age) from students;                 --查询id,name,age 拼成一个字符串 并 用空格分开

   

-- 查询男性组中的姓名 group_concat

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

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

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

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

--按照性别分组,并显示name枚举的第一个元素组内name的信息

        --按照性别分组,并显示name枚举的第一个元素组内name,age的信息

        --按照性别分组,并显示name枚举的第一个元素组内name,age,id的信息

        --按照性别分组,并显示name枚举的第一个元素组内name,age,id的信息,并用空格分开 age 与 id

-- having        (where必须放在group by前边   having 放后边)

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

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

--失败案例:

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

    

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

-- 查询每种性别中的人数多于4个组的信息


-- 分页

-- 显示5页

select * from students limit 2;                                           -- 分页显示,每页显示2条数据 

 

select * from students limit 0, 2;                                       -- 分页显示,从第0条后开始显示2条数据

 

select * from students where gender=2 order by high desc limit 0, 2;

   -- 按照身高从高到矮排序,查找出所有女性,并且分页显示,每页显示2条数据

 

常用的增删改查基本是这些,还是要多练多敲才会加深印象,加油吧!