MySQL 基础(二)

一、DML

  • 数据操纵语言DML(Data Manipulation Language)
  • 常用语句: insert、delete、update

插入数据
MySQL 基础(二)_第1张图片

修改数据

删除数据

代码示例如下:

-- sql-DDl 结构定义
-- 创建数据库
CREATE DATABASE IF NOT EXISTS schooldb CHARSET utf8
-- 删除数据库
DROP DATABASE IF EXISTS schooldb

-- mysql中数据库一旦创建,名字不能修改

-- 修改数据库字符集
ALTER DATABASE schooldb CHARSET utf8

-- 创建表
-- 确定表名  学生信息表
-- 确定表中字段(列) 学号,姓名,性别,生日,电话,身高,注册时间
-- 确定字段(列)的数据类型   以及长度
-- 确定列的约束
-- 创建表语法

-- char(n) 定长的字符串  固定存储n个字符,长度如果不够n,默认补空格
-- VARCHAR(n) 可变长度的字符串  n是最大长度  如果只存储2个字符,实际占有2个空间位置
 CREATE TABLE student(
     number INT,
     NAME VARCHAR(6),
     gender CHAR(1),
     birthday DATE,
     phone VARCHAR(11),
     height DECIMAL(3,2),
     reg_time DATETIME
 )



-- 创建表  并添加约束规则
-- PRIMARY KEY 设置主键约束, 添加主键约束后,值就不能重复,一个表中只能有一个列是主键
   -- 主键列可以唯一的表示某一行数据 ,
   -- mysql中主键可以设置为自动增长 AUTO_INCREMENT
-- NOT NULL 不能为空约束
-- UNIQUE 唯一性约束
-- 检查约束 设置条件
CREATE TABLE student(
     number INT PRIMARY KEY AUTO_INCREMENT COMMENT '学号主键',
     NAME VARCHAR(6) NOT NULL COMMENT '姓名',
     gender CHAR(1) NOT NULL COMMENT '性别',
     birthday DATE NOT NULL,
     phone VARCHAR(11) NOT NULL UNIQUE,
     height DECIMAL(3,2) CHECK(height<3),
     reg_time DATETIME
)

-- 删除表结构 删除后表中的数据就不存在了
DROP TABLE student

-- 修改表名
RENAME TABLE student TO stu

-- 复制表结构
CREATE TABLE student LIKE stu


-- DML 数据操作 增 修 删
INSERT INTO student(NAME,gender,birthday,phone,height,reg_time)VALUES('詹姆斯','男','1985-2-3','1522222333',1.98,NOW())

INSERT INTO student SET NAME='科比',gender='男',birthday='1986-2-3',phone='156333333'

INSERT INTO student(NAME,gender,birthday,phone,height,reg_time)
                    VALUES('库里','男','1998-2-3','1522253242',1.88,NOW()),
                          ('欧文','男','1995-2-3','1522226343',2.12,NOW())
                              
INSERT INTO stu(number,NAME,gender,birthday,phone,height,reg_time)SELECT * FROM student 

-- 修改记录  注意条件
UPDATE stu SET NAME='c罗',height=1.70 WHERE number = 1

-- 删除
DELETE FROM stu 
 
DELETE FROM student WHERE number = 2 

INSERT INTO student(NAME,gender,birthday,phone,height,reg_time)VALUES('杜兰特','男','1985-5-3','152222223',1.98,NOW())

二、DQL基础查询 

  • DQL(Data Query Language)数据查询语言查询是使用频率最高的一个操作, 可以从一个表中查询数据,也可以从多个表中查询数据。
  • 基础查询
  • 语法: select   查询列表   from   表名;
  • 特点:
    查询列表可以是:表中的字段、常量、表达式、函数
    查询的结果是一个虚拟的表格

查询结果处理

  •  MySQL 基础(二)_第2张图片
  • 函数:类似于java中的方法,将一组逻辑语句事先在数据库中定义好,可以直接调用。
  • 分类:
    单行函数:如concat、length、ifnull等
    分组函数:做统计使用,又称为统计函数、聚合函数、组函数

单行函数

  • 字符函数
    MySQL 基础(二)_第3张图片
  • 逻辑处理
    case when 条件 then 结果1 else 结果2 end; 可以有多个when
    ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回 原本的值
    if函数:if else的 效果 if(条件,结果1,结果2)
  • 数学函数
    MySQL 基础(二)_第4张图片
  • 日期函数
    MySQL 基础(二)_第5张图片
    注:日期格式
    MySQL 基础(二)_第6张图片

分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:sum 求和、avg 平均值、max 最大值、min 最小值、count 计数 (非空)
注:

  1. sum,avg一般用于处理数值型max,min,count可以处理任何类型。
  2. 以上分组函数都忽略null值。
  3. count函数的一般使用count(*)用作统计行数。
  4. 和分组函数一同查询的字段要求是group by后的字段

条件查询 

  • 使用WHERE 子句,将不满足条件的行过滤掉,WHERE 子句紧随 FROM 子句。
    语法:select   from   where
    比较:
    MySQL 基础(二)_第7张图片
  • 模糊查询
    MySQL 基础(二)_第8张图片

UNION语法

  • [SQL 语句 1]
       UNION
    [SQL 语句 2]
  • [SQL 语句 1]
       UNION  ALL
    [SQL 语句 2
  • 注:当使用union 时,mysql 会把结果集中重复的记录删掉,而使用union all , mysql 会把所有的记录返回,且效率高于union。

排序
MySQL 基础(二)_第9张图片

数量限制
MySQL 基础(二)_第10张图片

分组查询

语法:
MySQL 基础(二)_第11张图片

注:查询列表比较特殊,要求是分组函数和group by后出现的字段。

分组查询中的筛选条件分为两类:

代码示例如下:

-- 为什么要学习数据库
-- 要持久的保存数据     方便数据存储和管理

-- 数据库
-- 数据库就是一个方便数据存储和管理的仓库,将数据按照特定的规则存

-- 数据库管理系统

-- 关系型数据库   基本单位是表   表与表表之间存在关联关系


-- mysql数据库      最早是由瑞典MYsqlAB公司开发,现在属于oracle公司
-- mysql 由社区版本 和 商业版本
-- 安装mysql服务   安装一个客户端sqlyog

-- 创建数据库
-- 创建表    表名   列名   数据类型  长度   约束

-- sql - DQL  数据查询
-- select 结果  from 表名

-- 查询指定的列
SELECT NAME,gender,birthday,phone FROM student

-- 查询所有的列  *-所有的列   查询的结果是虚拟的表格, 不能操作,是只读的.
SELECT * FROM student

-- 查询结果进行算术运算  + - * /
SELECT NAME,height+1 FROM student

-- 去除重复数据   查询结果中所有的列都相同,视为重复数据
-- DISTINCT关键字去除重复数据
SELECT DISTINCT NAME,gender FROM student

-- 函数  
-- 单行函数: 会对查询中的每一行数据进行处理 
-- 字符函数
-- length(列名)   以字节为单位
SELECT NAME,LENGTH(NAME),gender FROM  student

-- CHAR_LENGTH(列名) 以字符为单位
SELECT NAME,CHAR_LENGTH(NAME),gender FROM  student

-- concat(str1,str2,str3) 连接多个字符串   as  别名
SELECT CONCAT(NAME,":",CHAR_LENGTH(NAME)) AS NAME,gender FROM  student

-- upper()  lower()
SELECT UPPER(NAME),LOWER(NAME) FROM student

-- substring(字符串,开始位置,截取的长度)   开始位置从1开始
SELECT SUBSTRING(NAME,1,3) FROM student

-- instr(字符串,指定的字符)  返回指定字符首次出现的位置   找不到返回0,
SELECT INSTR(NAME,'o') FROM student

-- trim(字符串)  默认是去掉字符串前后的空格
SELECT TRIM(NAME),NAME FROM student

-- trim(指定的子串 from 字符串)  可以去掉前后指定的子串
SELECT TRIM('a' FROM NAME),NAME FROM student

-- 左填充  右填充  到指定长度
SELECT LPAD(NAME,5,'a'),RPAD(NAME,5,'b') FROM student

-- replace(列,'old','new')
SELECT REPLACE(NAME,'o','O') FROM student

-- case when 条件  then 条件成立结果  else  不成立结果 end;
SELECT
  NAME,
  gender,
  (CASE WHEN height>=2 THEN '高个子' ELSE '正常身高' END)AS height
FROM
  student
  
SELECT
  NAME,
  gender,
  (CASE WHEN height>=2 THEN 'A'
        WHEN height>=1.8 THEN 'B'
        ELSE 'C' END)AS height
FROM
  student

-- ifnull(列名,'为空时默认信息')  
SELECT
  NAME,
  gender,
  IFNULL(height,'暂未录入身高信息') AS height
FROM
  student
  
 
 -- if(条件,'结果1','结果2')
 SELECT
  NAME,
  gender,
  IF(height>=2,'高个子','正常')AS height
FROM
  student 

-- 数学函数
SELECT NAME,gender,ROUND(height),CEIL(1.1),FLOOR(1.9) FROM student

SELECT NAME,gender,TRUNCATE(height,1),height,RAND() FROM student

-- 日期函数
-- now()  年月日 时分秒 系统当前时间
-- CURDATE() 年月日
-- CURTIME() 时分秒 

SELECT NOW(),CURDATE(),CURTIME() FROM student
-- year(日期) 将日期格式化为年
SELECT YEAR(birthday),MONTH(birthday) FROM student 

-- STR_TO_DATE('2003-3-3','%Y-%m-%d') 将字符串日期 格式化为 日期类型
SELECT STR_TO_DATE('2003-3-3','%Y-%m-%d') FROM student

-- DATE_FORMAT(birthday,'%Y-%m') 将日期格式化为指定的字符串
SELECT DATE_FORMAT(birthday,'%Y-%m') FROM student

-- DATEDIFF(CURDATE(),birthday) 计算两个日期之间的相差的天数
SELECT DATEDIFF(CURDATE(),birthday) FROM student

-- 分组函数  聚合函数(查询多行,返回一行) 统计函数

SELECT SUM(height) FROM student  -- 求和
SELECT AVG(height) FROM student  -- 平均值
SELECT MAX(height) FROM student  -- 最大值
SELECT MIN(height) FROM student  -- 最小值
SELECT COUNT(*) FROM student     -- 统计个数

-- 条件查询
-- select * from 表名  where  条件

-- and 并且
SELECT * FROM  student  WHERE gender = '男' AND height > 1.80

-- or 多个条件只需要满足一个即可
SELECT * FROM  student  WHERE gender = '男' OR height > 1.60

SELECT * FROM  student  WHERE gender != '男'
SELECT * FROM  student  WHERE gender <> '女'

-- like '库%' 模糊匹配
SELECT * FROM student WHERE NAME LIKE '库%'

SELECT * FROM student WHERE height>=1.65 AND height <=1.98

-- BETWEEN 1.65 AND 1.98 两者之间
SELECT * FROM student WHERE height BETWEEN 1.65 AND 1.98

-- in(值1,值2,值n) 在给定的值中
SELECT * FROM  student WHERE height IN(1.78,1.88,1.98)

SELECT * FROM  student WHERE height  NOT IN(1.78,1.88,1.98)

-- 查询身高为null值的数据
SELECT* FROM student WHERE height  IS NULL

SELECT* FROM student WHERE height  IS NOT NULL

-- union 将多个查询结果合并, 合并时,列数必须一致,  去除重复数据
SELECT NAME,gender FROM student WHERE gender   = '男'
  UNION
SELECT NAME,gender FROM student WHERE  number>1

-- union all 只是将查询的多个结果合并, 不会去除重复数据
SELECT NAME,gender FROM student WHERE gender   = '男'
  UNION ALL
SELECT NAME,gender FROM student WHERE  number>1


-- 排序   order by 列   asc(升序) desc(降序)
 SELECT * FROM student WHERE number>0 ORDER BY number ASC
  
 SELECT * FROM student WHERE number>0 ORDER BY number DESC 

 SELECT * FROM student WHERE number>0 ORDER BY height ASC
 
 SELECT * FROM student WHERE number>0 ORDER BY reg_time DESC
 
 SELECT * FROM student WHERE number>0 ORDER BY height ASC,reg_time ASC
 
 -- 数量限制   实现分页查询   limit 开始位置,每次查询的数量
 SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 0,3
 
 SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 3,3

 SELECT * FROM student WHERE number>0 ORDER BY number ASC LIMIT 6,3

7 条
3 每页显示3条
3页
LIMIT 0,48
LIMIT 48,48


-- 分组查询  
-- 分组--在一些统计场景中,按照某一个条件进行区分(分组)
-- 统计时, 按照性别,  班级, 年级 , 部门 ,年份  月份
-- 把满足某个条件的数据,分到同一个组中, 每个组内单独进行处理

-- 查询 男生,女生各有多少人    每个年级各有多少  每个部门各有多少人
   -- 分组统计 男生组统计一次,  女生组统计一次
  SELECT COUNT(*),gender FROM student  GROUP BY gender
  SELECT MAX(height),gender FROM student  GROUP BY gender
  
  
  SELECT COUNT(*),DATE_FORMAT(reg_time,'%Y-%m') FROM student  GROUP BY DATE_FORMAT(reg_time,'%Y-%m')


  -- 统计男生女生各多少人
   SELECT COUNT(*),gender FROM student  GROUP BY gender
   
   -- 男生和女生谁的人数大于2
   -- HAVING COUNT(*)>2             having    条件 是对分组后的结果进行条件筛选
   SELECT COUNT(*),gender FROM student    GROUP BY gender  HAVING COUNT(*)>2

 

你可能感兴趣的:(mysql,数据库)