mysql数据库

mysql数据库

长期存放在计算机内,有组织、可共享的大量数据的集合,是一个数据“仓库”(Database,简称DB)

分类

  • 关系型数据库(SQL)

MySQL、Oracle、SQL Server、SQLite、DB2

  • 非关系型数据库(NOSQL)

Redis、MongoDB

DBMS:

数据库管理系统(Database Management System)数据管理软件,科学组织和存储数据、高效地获取和维护数据

MySQL中创建表时,编码为utf8mb4

连接数据库

打开MySQL命令窗口: 在DOS命令行窗口(cmd.exe)在窗口中进入 安装目录\mysql\bin

连接数据库语句: mysql -h localhost –u 用户名 -p用户密码

结构化查询语句SQL

名称解释命令
DDL(数据定义语言)定义和管理数据对象,如数据库,数据表等CREATE、DROP、ALTER
DML(数据操作语言)用于操作数据库对象中所包含的数据INSERT、UPDATE、DELETE
DQL(数据查询语言)用于查询数据库数据SELECT
DCL(数据控制语言)用来管理数据库的语言,包括管理权限及数据更改GRANT、COMMIT、ROLLBACK

命令行操作数据库

/*创建数据库 判断是否存在*/
CREATE DATABASE if not EXISTS myschool;
​
/*删除数据库*/
DROP DATABASE if EXISTS myschool;
​
/*查看库*/
show DATABASES;
​
/*切换数据库*/
use myschool;
​
/*创建表*/
CREATE table if not EXISTS `student` (
    id int  PRIMARY KEY auto_increment,
    name VARCHAR(50) not null DEFAULT "张三",
  money DECIMAL(3,2)
)
​
# 创建表
create table if not EXISTS subject(
    subjectNo int(11) auto_increment,
    subjectName VARCHAR(50) not null COMMENT "课程名称",
    classHour int(4) COMMENT "课时" DEFAULT 10,
    gradeId int(4) COMMENT "年级",
    PRIMARY key(subjectNo)
)
​
/*删除表*/
DROP TABLE student;
​
# auto_increment 自动递增
# not null 非空
# COMMENT 注释
# DEFAULT 10 默认值
# PRIMARY key(subjectNo)  主键设置

常见的数据类型

数值类型

类型说明取值范围存储需求
tinyint非常小的数据有符值: -2^7~ 2^7-1无符号值:0 ~ 2^8-11字节
smallint较小的数据有符值: -2^15~ 2^15-19无符号值: 0 ~ 2^16-12字节
mediumint中等大小的数据有符值: -2^23 ~ 2^23-1 无符号值: 0 ~ 2^24-13字节
int标准整数有符值: -2^31~ 2^31-1 无符号值:0 ~ 2^32-14字节
bigint较大的整数有符值: -2^63 ~2^63-1无符号值:0 ~2^64-18字节
float单精度浮点数±1.1754351e -384字节
double双精度浮点数±2.2250738585072014e -3088字节
decimal字符串形式的浮点数decimal(m,d)m个字节

字符串类型

类型说明最大长度
char[(M)]固定长字符串,检索快但费空间, 0 <= M <= 255M字符
varchar[(M)]可变字符串0 <= M <= 65535变长度
tinytext微型文本串2^8–1字节
text文本串2^16–1字节

日期和时间型数值类型

类型说明取值范围
DATEYYYY-MM-DD,日期格式1000-01-01~ 9999-12-31
TIMEHh:mm:ss ,时间格式-838:59:59~838:59:59
DATETIMEYY-MM-DD hh:mm:ss1000-01-01 00:00:00 至9999-12-31 23:59:59
TIMESTAMPYYYYMMDDhhmmss格式表示的时间戳197010101000000 ~2037年的某个时刻
YEARYYYY格式的年份值1901~2155

日期类型默认当前时间:now( ) 或CURRENT_TIMESTAMP

存储引擎

常见的MyISAM与InnoDB类型

名称MyISAMInnoDB
事务处理不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间大小较小较大,约2倍

MySQL数据管理

DML语句

DML(数据操作语言)用于操作数据库对象中所包含的数据包括

  • INSERT ( 添加数据语句 )

  • UPDATE ( 更新数据语句 )

  • DELETE ( 删除数据语句 )

修改数据表

修改表名
ALTER TABLE 旧表名  RENAME AS  新表名
添加字段
ALTER TABLE 表名   ADD 字段名   列类型 [ 属性 ]   
修改字段
ALTER TABLE 表名   MODIFY 字段名   列类型 [ 属性 ]   
ALTER TABLE 表名   CHANGE 旧字段名  新字段名   列类型 [ 属性 ]
删除字段
ALTER TABLE 表名   DROP  字段名
​
在已创建的表中添加字段
ALTER TABLE GOODS
ADD good_type BIGINT(20);

使用MySQL语句添加数据

添加:

INSERT INTO 表名 [ ( 字段1, 字段2, 字段3, … ) ] VALUES ( '值1', '值2', '值3', …)

  • 字段或值之间用英文逗号隔开

  • “字段1, 字段2…”该部分可省略,但添加的值务必与表结构数据列顺序相对应,且数量一致

  • 可同时插入多条数据,values 后用英文逗号隔开

修改:

update 表名 set 列1 = 值1,列2 = 值2... [where 条件]

#修改
# update 表名 set  列1 = 值1,列2 = 值2... [where 条件]
update student set loginPwd = "123456",Sex = 2
where StudentName = "王城如";
​
#修改学号为1006的C语言-3考试成绩
#要求成绩+20分
​
update result set StudentResult = StudentResult+20
where StudentNo = 1006 and SubjectNo = 7;
​
#将数据表subject中ClassHour大于110
#且GradeID为1的课时都减少10
update subject set ClassHour = ClassHour-10
where ClassHour>110 and GradeID = 1;
删除

delete from 表名 [where 条件]

delete from student where StudentNo = 10066;

使用DQL命令查询数据

DQL(Data Query Language,数据查询语言)

查询:

select [列1,列2...|*] from 表名 [where 条件]

说明:

*代表所有列

as 别名:表别名 和 列别名 注意:as可以省略

select语法
SELECT   [ALL | DISTINCT] 
{  * |  table.* | [ table.field1 [ as  alias1] [, table.field2 [as  alias2]][, …]] }
FROM  table_name  [ as  table_ alias  ]
    [ left|out|inner  join  table_name2 ]    #联合查询
    [ WHERE  … ]    #指定结果需满足的条件
    [ GROUP BY …]   #指定结果按照哪几个字段来分组
    [ HAVING …] #过滤分组的记录必须满足的次要条件
    [ ORDER BY… ]   #指定查询记录按一个或者多个条件排序
    [ LIMIT  {   [ offset,] row_count    |   row_count OFFSET offset   }] ;  #指定查询的记录从哪条至哪条
​
查询表中所有的数据列结果,采用“*”符号
select   *   from student;
​
可指定查询的结果数据列
如只查询student表中的学号、姓名、电话
SELECT     StudentNo, StudentName, Phone  FROM  student;
​
如区分连接查询时两个表有同名的字段
SELECT  student.StudentNo , StudentName, StudentResult   
FROM   student  , result ;
​
​
​
#查询1年级并性别为1的学生信息,显示学号,姓名
select * from student
where GradeId = 1 and Sex = 1;
AS子句
AS子句作用

可给数据列取一个新别名

可给表取一个新别名

可把经计算或总结的结果用另外一个新名称来代替

AS子句用法
SELECT   StudentNo   AS “学号”   FROM   student;
SELECT   a.StudentNo   FROM   student AS  a;
SELECT   Phone+1  AS  Tel    FROM   student;
DISTINCT 结果去重
作用:

去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条

注意:ALL 关键字是默认的,返回所有的记录,与之相反

SELECT     DISTINCT   字段名1, 字段名2...     FROM   表名
​
select DISTINCT a.StudentName,a.LoginPwd from student a;
​
#查询成绩表中的所包含的课程ID
 SELECT   DISTINCT  SubjectNo  FROM  result;
where条件语句

用于检索数据表中符合条件的记录

搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假

搜索条件的组成

操作符

逻辑操作符

名称语法
AND或&&a AND b 或 a && b
OR或||a OR b 或 a||b
NOT或!NOT a 或 !a

比较操作符

名称语法
IS NULLa IS NULL
IS NOT NULLa IS NOT NULL
BETWEENa BETWEEN b AND c
LIKEa LIKE b
INa IN (a1,a2,a3,….)

like:

%匹配多位

_匹配一位

注意 : 1、数值数据类型的记录之间才能进行算术运算 2、相同数据类型的数据之间才能进行比较

在SQL语句中使用表达式
返回的列中使用,如
SELECT  version() ,   100*3        #返回MySQL版本和计算结果
SELECT  SubjectName “课程名称”, ClassHour+10  AS “新学时”  FROM subject;
#给返回结果中的课时都加10个课时
​
避免SQL返回结果中包含“ .”,“*”和括号等干扰开发语言程序,如
SELECT   version() as  MySQL_V , 123.44*100  AS  EXPRESSION;
#返回结果不会与后台开发程序发生混淆
BETWEEN AND范围查询

1.根据一个范围值来检索

SELECT  字段列1,字段2 ,…FROM 表名 WHERE   字段x  BETWEEN  值1 AND  值2  

2.等同于 >= 和 <= 联合使用

#查询课程表中课时在110和120之间的所有记录
 SELECT  *  FROM  subject  WHERE ClassHour   BETWEEN  110   AND  120;
等同于:
 SELECT  *  FROM  subject  WHERE ClassHour >= 110  AND  ClassHour <=120;
LIKE模糊查询

在WHERE子句中,使用LIKE关键字进行模糊查询

与“%”一起使用,表示匹配0或任意多个字符

与“_”一起使用,表示匹配单个字符

 #查询包含“数学”的所有课程
SELECT   *  FROM subject WHERE SubjectName  LIKE  "%数学%";
#查询所有姓名为“李**”三个字的学生信息
SELECT  StudentNo,StudentName FROM student  
  WHERE StudentName LIKE "李__";
​
使用IN进行范围查询

在WHERE子句中使用IN进行范围查询

SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…)

查询的字段x的值,至少与括号中的一个值相同

多个值之间用英文逗号隔开

 SELECT  *  FROM  subject  where    ClassHour = 100  OR ClassHour =110 OR ClassHour  = 120;  #普通处理方式
SELECT  *  FROM  subject  where ClassHour  IN ( 100, 110,120 );
#使用IN进行查询方式,更为简洁,效率更高
NULL空值条件查询

NULL

NULL代表“无值”

区别于零值0和空符串“”

只能出现在定义允许为NULL的字段

须使用 IS NULL 或 IS NOT NULL 比较操作符去比较

#查询1900年到 2000年出生的学生信息
select * from student a where
a.BornDate BETWEEN '1900-01-01 00:00:00' and '2000-12-31 23:59:59';
​
#IN 匹配多个值
select * from student a
where a.GradeId in(1,2);
​
#like 模糊查询
# % 匹配多为
# _ 匹配一位
#查询姓李的学生
select * from student
where StudentName LIKE "%文%";
​
#获得成绩大于等于60分并小于等于80分
select * from result a where
a.studentResult>=60 and a.studentResult<=80;
select * from result a where
a.studentResult BETWEEN 60 and 80;
​
#获得姓名为空的学生信息
select * from student a
where a.studentName is null;
#获得姓名不为空的学生信息
select * from student a
where a.studentName is not null;
​
#获得1年级以外的所有学生
select * from student a where a.GradeId!=1;
​
#查询高等数学-1考试成绩并+10分
select (a.studentResult+10) as rs
from result a where a.SubiectNo = 1;
​
#DISTINCT 结果去重
select DISTINCT
a.studentName,a.LoginPwd from student a;
​
#as(可以省略)别名
#列别名
select a.* from student a:
#表别名
select a.studentNo,a.studentName
from student AS a where a.sex = 1:

连接查询(多表查询)

连接查询

1、如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询

2、分类包括

内连接 ( inner join)

等值和非等值的连接查询

自身连接查询

外连接 ( out join )

左连接(LEFT JOIN)

右连接 ( RIGHT JOIN)

内连接查询2-1

INNER JOIN内连接

1、在表中至少一个匹配时,则返回记录

SELECT   字段1,字段2,…  FROM  table_1 
INNER  JOIN   table_2    ON  table_1.字段x   =  table_2.字段y;
#  INNER JOIN  与 JOIN 是相同的;
#  如table_1中的行在table_2中没有匹配,则不返回;
​
#要求:从subject和grade数据表查询课程名称和所属年级名称
SELECT SubjectName,GradeName FROM   subject   INNER   JOIN  grade   ON   subject.GradeID= grade.GradeID;  

2、等值和非等值的连接查询

与单表查询类似,都是SELECT语句

把多个表放到FROM后,并用逗号隔开

可使用AS关键字取别名,便于引用

如无重名查询字段则可省略数据表的指定

#要求:从subject和grade数据表查询课程名称和所属年级名称
#非等值连接查询
SELECT  SubjectName, GradeName  FROM  subject,  grade;  
#等值查询
SELECT  SubjectName, GradeName  FROM  subject,  grade 
WHERE  subject.GradeID = grade.GradeID;  

外连接

左外连接(LEFT JOIN)

从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行

SELECT 字段1,字段2,… FROM table_1

LEFT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;

右外连接(RIGHT JOIN)

从右表(table_2)中返回所有的记录,即便在左(table_1)中没有匹配的行

SELECT 字段1,字段2,… FROM table_1

RIGHT [ OUTER ] JOIN table_2 ON table_1.字段x = table_2.字段y;

不同的SQL JOIN对比

JOIN对比
操作符名称描述
INNER JOIN ( JOIN )如果表中有至少一个匹配,则返回行
LEFT JOIN不论右表是否有匹配,都会返回左表的所有行
RIGHT JOIN不论左表是否有匹配,都会返回右表的所有行

自连接查询

1、数据表与自身进行连接

从一个包含栏目ID,栏目名称和父栏目ID的表中,查询父栏目名称和其子栏目名称,表结构如下:

#表结构语句
CREATE TABLE IF NOT EXISTS category(
     categoryId int(10)  auto_increment  primary key,
     categoryName   varchar(32) not null ,
     pid  int(10)
);
  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值