mysql数据库(单表)

数据库:

数据库其实就是一个存储数据的仓库,它可以对数据进行存储和管理,并且按照一定的规则存储在磁盘中

数据库根据不同的数据类型可以分为

1.关系型数据库    2.非关系型数据库

目前所学的mysql数据库,,快捷可靠,免费开源,由瑞典MySQL AB 公司开发,目前属于 Oracle旗下产品。MySQL 流行的关系型数据库管理系统

sql语言  是连接mysql的可视化客户端工具

mysql的语法规范:

不区分大小写,关键字一般都会自己大写,还有表名,列名

  注释:
单行注释: # 注释文字
单行注释:--注释文字(要有空格)
多行注释:/* 注释文字 */
DDL(数据定义语言):
概念: 它是数据(结构)定义语言,是用于创建和修改数据库表结构的语言
常用的语句: create ,alter,drop,rename
数据库表:
 
数据库由表构成,将数据放到表中,表再放到库中
1、数据表
表(table)是数据存储的最常见和最简单的形式,是构成关系型数据库的基本元素。
表的最简单形式是由行和列组成,分别都包含着数据。 每个表都有一个表头和表体,表头定
义表名和列名 .表中的行被看作是文件中的记录,表中的列被看作是这些记录的字段。
2、记录
记录也被称为一行数据,是表里的一行。在关系型数据库的表里,一行数据是指一条完整的记录。
3、字段
字段是表里的一列,用于保存每条记录的特定信息。如客户订单表的字段包括“订单ID”、“姓名”、“客户ID”、“职务”、“上级”、“地区”、“运货商”、“国家”等。数据表的一列包含了特定字段的全部信息。
数据库存储数据的特点:
1 将数据放到表中,表再放到库中
一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
3表具有一些特性,这些特性定义了数据在表中如何存储,类似Java中“类”的设计。
4表由列组成,我们也称列为字段。所有表都是由一个或多个列组成的,每一列类似java中的”属性”
5表中的数据是按行存储的,每一行类似于Java中的“对象”
如何创建或者删除数据库
创建数据库并设置编码格式
//如果原来有这个数据库,会出现错误
CREATE DATABASE [if not exists] 数据库名 [ CHARSET utf8]
删除数据库
DROP DATABASE 数据库名 / [IF EXISTS 数据库名 ];
修改字符集
ALTER DATABASE 数据库名 CHARSET gbk;
注意:  数据库一旦被创建,数据库名就不可被修改
如何对表进行设计,表应该有哪些特征:
在创建表时,表需要有一下特征:
1存储什么信息--表名
2表中存储那些信息--列名
3表中的字段的数据类型和数据长度
4还有约束
列的数据类型:
  字符型  
  char   定长的,例如定义的长度为5,如果只存储了2个字符,也是会不全到5个字符
  varchar  变长的,例如5个字符,如果只存储了2 个字符,实际只站村了2个字符
  日期型
  date  年月日(日期)
  datetime  年月日时分秒
  数值型
  float
  double  常用的,精度更高,建议使用
  TINYINT1
  SMALLINT2
  MEDIUMINT3
  int 4
  bigint 8
  text类型文本可以存储
约束有哪些:
1主键约束
  表中必须有一列的值,能够唯一的表示一条记录
  主键列在表中只能有一个,且不能重复,也不能为空
  mycle还支持主键列自动增长(必须为整数类型  通过 AUTO_INCREMENT)
2不能为空  NOT NULL
3唯一约束   UNIQUE
4检查约束  设置条件,check
5外键约束(多表)
注意:主键会自动增长   AUTO_INCREMENT
默认值    DEFAULT default_value
字段注释 :    comment '注释
创建表的语法:
CREATE TABLE 表名 ( 列名 数据类型 [ 约束 ] [ 默认值 ] [ 注释 ],......)
设置表中的数据:
CREATE TABLE t_user( 

id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,

 number INT(5) NOT NULL, 

stuname VARCHAR(10) NOT NULL, 

age INT(3) 

CHECK(age>18), 

birthday DATE, 

weight DOUBLE, 

opertime datetime, 

CONSTRAINT 约束名 约束规则
如何删除,修改表名
删除表,修改表名
删除表
DROP TABLE [if exists ]表名
修改表名
RENAME TABLE 旧表名 TO 新表名
复制表结构
CREATE TABLE 新表名 LIKE 被复制表名;//相当于对表数据进行了备份,但是这个只是备份了表的结构.
数据操作语言DML
对表中的数据进行改动
常用语句:
insert,delete,update
insert:插入语句:
方式 1: INSERT INTO 表名 ( 1, 2……, n) VALUES( 1, 2….., n);
方式 2: INSERT INTO 表名 set 列名 1= 1,.. 列名 n= n;
方式 3: INSERT INTO 表名 ( 1, 2……, n) VALUES( 1, 2….., n),( 1, 2…..,
n);
方式 4:INSERT INTO 表名 ( 1, 2……, n) 查询语句 ( 查询的列数与插入列数匹配 )
INSERT INTO student(sname,gender,birthday,phone,address,height,reg_time)
               VALUE('李丽','女','2002-10-1','156645645','西安',1.78,NOW())//sql语言中获取当前时间的函数NOW
               //插入了一行记录
  INSERT INTO student(sname,gender,birthday,phone,address,height,reg_time)
               VALUES('李丽1','女','2002-10-1','156645888','西安1',1.68,NOW()),
                     ('李丽2','女','2002-10-1','156645777','西安2',1.68,NOW())
              //插入了多行记录   
INSERT INTO student SET sname='王五',gender="男" //插入了一行只有特定信息的记录,其他值为空                 
                     
  INSERT INTO stu(num,sname,gender,birthday)SELECT num,sname,gender,birthday FROM student 

   //从student表中查询了特定的字段,插入到另一个表中
修改数据
UPDATE 表名 SET 列名 = ‘新值’ WHERE 条件
UPDATE student SET   address = '成都'  
//将表中的所有的address改为成都
  
  UPDATE student SET   address = '西安'  WHERE num = 1

//将表中指定的num=1这一行记录的address改为西安      
  
  UPDATE student SET   address = '西安',height=1.88  WHERE num = 3  

//将表中指定的num=3这一行记录的address和height分别改为西安 和 1.88
删除数据
DELETE FROM 表名 WHERE 条件
TRUNCATE TABLE 表名 ; 清空整张表
DELETE FROM 表名  --只对表中的数据逐行删除

DROP TABLE 表名 --删除表的结构

TRUNCATE TABLE 表名 --清空整张表的数据,是针对ddl上的操作

DQL(数据查询语言)

可以从一个表中查询,也可以从多个表中查询
基础查询:   select   查询列表   from   表
特点:   查询列表可以是:表中的字段、常量、表达式、函数
           查询的结果是一个虚拟的表格
查询结果处理:
全部列查询:   select  *  from 表
SELECT * FROM student
特定列查询:   select  结果列 from 表名
SELECT num,sname,gender FROM student
结果查询使用算数运算符:(+-*/)   +只能作为算数运算符
SELECT num,sname,height+1 from stu

算出来的身高比如1.22,结果是2.22


 SELECT num,sname,height+num FROM student


比如num是1,height是1.22,,结果是2.22

-- DISTINCT 去除重复数据,重复数据指的是每列的值都是相同的.
 

  SELECT DISTINCT sname,gender FROM student

select后使用函数:

单行函数: 会对每行数据进行处理
    
    分组函数/聚合函数/统计函数: 将多条结果转为一条 sum  max  count
     
     字符串处理
     逻辑处理
     日期
     算数   

单行函数:

-- length(列名) 返回列的长度 以字节为单位 中文3个字节 
 

SELECT num,LENGTH(sname) FROM student

-- char_length(列名) 以字符为单位的长度
   

SELECT num,CHAR_LENGTH(sname)sname FROM student

-- concat("","",""....) as 别名
 

 SELECT CONCAT(num,":",sname,":",gender)AS studentInfo FROM student


//合在一块

--转为大小写

SELECT UPPER(sname)FROM student
   SELECT LOWER(sname)FROM student
 -- SUBSTRING(列,开始位置,截取长度)
 
 SELECT num,SUBSTRING(sname,2,2) FROM student

//从第二位开始截取2个

   
   -- instr(列名,查找的字符) 返回指定字符在字符串中首次出现的位置
   
SELECT num,INSTR(sname,"i") FROM student


   -- trim(子串 from 列名)  去掉列名前后的指定子串
   

SELECT TRIM("a" FROM sname) FROM student 


   -- 左(右)填充指定内容到指定长度  

   SELECT LPAD(sname,5,"a"),RPAD(sname,5,"a") FROM student 


   -- 替换
 

 SELECT REPLACE(sname,"i","I") FROM student

   
-- 对查询结果进行逻辑处理
SELECT num,sname,
     

  (CASE WHEN height>=1.80 THEN '大高个' ELSE '不是大高个' END)height,
       (CASE 
            WHEN height>=1.80 THEN '大高个'
            WHEN height<1.80 AND height>1.60 THEN '中等'
            ELSE '低个子' END)height                                 
      FROM student


  
 -- ifnull(列,默认值) 

 SELECT num,sname,IFNULL(address,'暂未录入')  FROM student 


 
 -- if(条件,条件成立返回,不成立返回)
 
 

SELECT num,sname,IF(height>1.80,'大高个子',"不是大高个")height    FROM student

--round(四舍五入),ceil(数值):向上取整,返回>=该参数的最小整数 ,

floor(数值):向下取整,返回<=该参数的最大整数

SELECT num,sname,ROUND(height) FROM student 
  SELECT num,sname,FLOOR(height) FROM student 


  -- 截断(小数点后截断几位)  不会进位     RAND() 随机生成 0-1之间的随机数

 SELECT num,sname,TRUNCATE(height,1),RAND() FROM student 

日期函数
--now() :返回当前系统日期 + 时间
--curdate() :返回当前系统日期,不包含时间
--curtime() :返回当前时间,不包含日期

SELECT num,sname,NOW(),CURDATE(),CURTIME() FROM student
--可以获取指定的部分,年、月、日、小时、分钟、秒
--YEAR( 日期列 ),MONTH( 日期 ),DAY( 日期 ) ,
--HOUR( 日期 ) ,MINUTE( 日期 ) SECOND( 日期 )
 SELECT num,sname,YEAR(birthday),MONTH(birthday) FROM student


 -- 字符串转 日期类型

 SELECT STR_TO_DATE('2002-1-1',"%Y-%m-%d") FROM student


 -- 日期转字符串类型 

 SELECT DATE_FORMAT(birthday,"%Y-%m")birthday FROM student  
 
 SELECT DATE_FORMAT(birthday,"%Y")birthday FROM student  


 
 -- 计算两个日期之间的天数,datediff(big,small):返回两个日期相差的天数
 

SELECT DATEDIFF(CURDATE(),birthday) FROM student


 
  分组函数/聚合函数/统计函数  多变一
 -- sum() avg()只能处理数值类型的列
 -- max() min() count() 可以处理任何数据类型
 

SELECT SUM(height),AVG(height),MAX(height),MIN(height) FROM student
 
 SELECT COUNT(*) FROM student  //表中有多少行记录
 SELECT COUNT(num) FROM student
 SELECT MAX(sname),MIN(sname) FROM student

分组函数 

功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类: 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  条件
比较
=, != <>, >, <, >=, <=
逻辑运算
and 与        or 或       not 非
SELECT * FROM student WHERE gender = '男'
SELECT * FROM student WHERE gender != '男'
SELECT * FROM student WHERE gender <> '男'

SELECT * FROM student WHERE gender = '男' AND height>1.7 

SELECT * FROM student WHERE gender = '男' OR height>1.7 

SELECT * FROM student WHERE height = 1.78 OR height=1.88 OR height=1.90
SELECT * FROM student WHERE height IN(1.78,1.88,1.90)
SELECT * FROM student WHERE height NOT IN(1.78,1.88,1.90)

-- is null  查询值为空的
 

SELECT * FROM student WHERE  address IS NULL


SELECT * FROM student WHERE  address IS NOT NULL

//不为空的

-- height BETWEEN 1.70 AND 1.90 之间
 

SELECT * FROM student WHERE   height BETWEEN 1.70 AND 1.90

SELECT * FROM student WHERE   height>=1.70 AND height<=1.90

-- like %关键字%  % 匹配任意个字符  _ 匹配一个字符
 

SELECT * FROM student WHERE sname LIKE "张_"
SELECT * FROM student WHERE sname LIKE "%三%"

-- union 合并多个查询语句结果  可以去除多条结果中重复数据   多条查询结果列相同

SELECT num FROM student WHERE gender = "男"
 UNION 
SELECT num FROM student 


-- union all 只是将多条查询简单合并  不会去除重复数据,有多少条就显示多少条记录

SELECT * FROM student WHERE gender = "男"
 UNION  ALL
SELECT * FROM student 

-- 默认按主键从小到大排序

SELECT * FROM student 

-- order by 列  asc(升序) desc(降序)

SELECT * FROM student  ORDER BY reg_time ASC
SELECT * FROM student  ORDER BY reg_time DESC
SELECT * FROM student  ORDER BY height ASC
SELECT * FROM student  WHERE gender = "男" ORDER BY height ASC

SELECT * FROM student   ORDER BY height ASC, reg_time DESC
//如果height存在相同的,那就按照后者进行排序

-- 分页显示数据  假设每页显示4条
 -- limit 开始的位置(从0开始),每次查询的数量
 

SELECT * FROM student WHERE num>0 ORDER BY num ASC  LIMIT 0,4
SELECT * FROM student WHERE num>0 ORDER BY num ASC  LIMIT 4,4
分组查询中的筛选条件分为两类 :
                         数据源                                               源位置                                                  关键字
分组前筛选         原始表                                          group by 子句的前面                                  where
分组后筛选   分组后的结果集                                     group by 的后面                                     having

-- 分组查询  group by 分组条件  把分组条件相同的数据划分到同一个组中处理

SELECT gender,COUNT(*),MAX(height),AVG(height) FROM student GROUP BY gender

//前者必须与后者相同,,group by 后面的分组内容必须是表中共有的

-- 子查询

SELECT * FROM(SELECT gender,COUNT(*)c FROM student   GROUP BY gender)AS t WHERE t.c>3

//想知道表中男女中谁个数大于3,将一开始查询出来的虚拟表看做一个表对它进行查询操作
这就叫做子查询


-- where 是对分组前(表中的原始数据)筛选,  HAVING对已经分组后的数据再进行筛选

SELECT gender,COUNT(*)c FROM student WHERE num>0   GROUP BY gender HAVING c>3

猜你喜欢

转载自blog.csdn.net/weixin_71243923/article/details/125901324