您好,欢迎访问一九零五行业门户网

MYSQL知识点总结分享

本文主要和大家分享mysql知识点总结,希望能帮助大家更好的掌握和使用mysql数据库。数据库概述
database:数据库,用于永久的存储数据的软件,海量存储、高效存取。
 数据库软件的种类:
(1)网状数据库
(2)树形/层次型数据库
(3)关系型数据库(relational db)
 (4)非关系型数据库(nosql)

rdbms(rdb management system)部署结构:
 (1)服务器端:负责存储/管理数据,其中的数据都是二进制格式存储,人无法直接查看——如工商银行总行中的数据库服务器
 (2)客户端:负责连接到服务器,向服务器发送增删改查指令——如atm机
rdbms服务器端数据的逻辑结构:
 server=>database=>table=>row=>column
mysqld、httpd、ftpd、sshd、smbd....
demon:精灵、守护者、守护程序、精灵程序、服务器程序
mysql系统的使用(1)服务器端:下载并安装mysql服务器软件
mysql.com
mariadb.org
xampp.org = apache+mysql+php

(2)服务器端:启动mysql服务器软件
c:/xampp/mysql/bin/mysqld.exe
保证3306端口被打开

===========================
 (3)客户端:下载并安装一款mysql客户端软件
c:/xampp/mysql/bin/mysql.exe
作用相当于银行的atm终端客户机

(4)客户端:提供用户名和密码,登录到数据库服务器上
mysql.exe   -uroot   -p       不能加分号!
mysql   -uroot              不能加分号!

mysql服务器常用的管理命令提示:所有的管理命令都必须以;分号结尾!仅use和quit除外!
 (1)quit;        退出到服务器的连接
 (2)show databases;    显示当前服务器上所有的数据库
 (3)use 库名;        进入/开始使用指定的数据库
 (4)show tables;   显示当前数据库中有哪些表
 (5)desc 表名;      描述一下指定表的列(描述表头)
常用的sql命令sql:structured query language,结构化查询语言,是一门编程语言。最早由ibm公司提出的,后来由iso采纳为关系型数据库行业国际标准,先后推出了多个版本,如sql87、sql92、sql99;目前各大数据库厂家所支持。
sql语句的执行方式:
 (1)交互模式:输入一行执行一行,....,适合于临时的查看数据。   mysql  -uroot  回车
 (2)脚本模式:把要执行的多条命令编写在一个文本文件中,一次性的提交给服务器执行,适合于批量反复执行的多条语句。   mysql  -uroot  < d:/xx.sql 回车
sql语言的语法:
(1)所有的sql语句必须以;分号结尾。
(2)sql语句不区分大小写。习惯上,系统预定义的关键字都大写,非关键字都小写。
(3)sql语句中可以使用 单行注释(#...) 和 多行注释(/.../)
drop database if exists 库名;
create database 库名 charset=utf8;
use 库名;
create table 表名(列名 类型, 列名 类型, ....);
insert into 表名 values(值, 值, ....);
select * from 表名;
数据库中的乱码问题产生的原因:计算机把每个字符都分配唯一个数字。若存字符时与取字符时所用的编码方案不同,就会产生乱码。
a <=> 97
   b <=> 98
....
字符编码方案/字符集:把每个需要呈现的字符都分配一个唯一的数字编码。世界上有几套常用的字符集:
 (1)ascii字符集:只对所有的英文字符进行了编码(128个)
 (2)gb2312/gbk:对常用的英文字符、中文简体字符都进行了编码(40000多个)
 (3)big5:对常用的英文字符、中文繁体字符都进行了编码
 (4)unicode字符集:对常用的英文字符、简体汉字、繁体汉字、日文、韩文...主流语言的常用符号都进行了编码,具体存储时又分为utf-8/utf-16/utf-32三种存储方案
解决乱码问题的方法——保证“三处统一”:
(1).sql文件的存储编码
(2)mysql.exe连接mysqld.exe所用的编码
(3)mysqld.exe中存储数据所用的编码
mysql服务器端数据的逻辑结构:server=>database=>table=>row=>column
如何连接到数据库服务器:
 交互模式:mysql.exe  -uroot  -p
 脚本模式:mysql.exe  -uroot  -p  < d:/2.sql
常用的sql语句:(1)增:insert into 表 values(值, 值, ...);
(2)删:delete from 表;
(3)改:update 表 set 列=值, ...,列=值 ;
(4)查:select * from 表;
delete from laptop; #删除所有的记录行
delete from laptop where lid=10; #删除满足条件的记录行
update laptop
set price='3000',pic='img/50.jpg',isonsale='否'; #更新所有的记录行
update laptop
set price='3000',pic='img/50.jpg',isonsale='否'
where lid=31; #更新满足条件的行
mysql中的列类型(1)数值类型 —— 可用引号括起来也可以不用
整数数值类型: student( age tinyint )
tinyint:微整数,占1字节,-128~127
smallint:小整数,占2字节,-32768~32767
int:整数,占4个字节, -2147483648~2147483647
bigint:大整数,占8个字节,.....
小数数值类型: product( price decimal(7, 4) )
float(m,d):单精度浮点型,占4字节,3.4e38,计算时可能产生四舍五入
double(m,d):双精度浮点型,占8字节 1.8e30,计算时可能产生四舍五入
decimal(m,d):定点小数,不会产生精度舍入
布尔数值类型: product( isonsale bool)
bool,布尔/真假类型只能取值为true/false。注意:
mysql数据库中没有真正意义上的布尔类型,true等同于1,false等同于0

(2)日期时间类型 —— 必须用引号括起来
date:日期类型,形如'2017-5-10'
time:时间类型,形如'22:08:5'
datetime:日期/时间类型,形如'2017-10-25 22:8:5'

(3)字符串类型 —— 必须用引号括起来 emp(resume ...)
char(m):定长字符串,比varchar操作速度更快,m不能超过255
varchar(m):变长字符串,比char更能节约空间,m不能超过65535
text(m):大型变长字符串,m不能超过2g
ename char(11) ename varchar(11)

a a000 a0
ab ab00 ab0
abc abc0 abc0
abcd abcd abcd
abcde abcd abcd
一二三四 一二三四 一二三四
一二三四五 一二三四 一二三四
true 真 ture x
false 假 flase x
mysql中的列约束constraint:约束,数据库中某列上的数据往往必须符合某种规范,如编号不能重复、年龄必须在一定范围、密码有长度限制、员工所在部门必须真的存在......类似的限制/规范就称为“列约束”
(1)主键约束 —— primary key
声明为主键的列上,不能出现重复值,也不能出现null值,所有的记录会自动按照主键列上值由小到大排序 —— 因此一个表中至多只能有一个主键列。

(2)非空约束 —— not null
声明为非空的列,不能出现null,但可以出现重复值。

(3)唯一约束 —— unique
声明为唯一约束的列,不能出现重复的值,但可以出现null,且允许多个null出现(两个null值是不等的)

(4)检查约束 —— check
检查约束可以检查新插入的数据是否满足指定的条件,如:
student( age int check(age>=18  and  age<=60)  )
mysql不支持此约束!
(5)默认值约束 —— default
student(sid int, sex char(1) default '男' );  
使用默认值的方式
1)insert into student values(10, default);
 2)insert into student(sid) values(20);

(6)外键约束 —— foreign key...references
   外键列上可以出现null,也可以有重复值,但是必须保证“
所有出现的值在另一个表的主键列上存在”——外键列上的值“参考了”另一个表上的主键值。

面试题:数据库中主键约束 和 唯一且非空组合 约束有何区别?
primary key:是表中记录的排序依据,故一个表至多有一个
unique not null:不会排序,故一个表可以有多个
程序中的null/空值的含义:表示应该有一个这样的数据,但是暂时还没有确定值是什么,如新员工的部门编号(尚未确定)、尚未确定的部门经理、尚未发到手的年终奖
项目中如何存储日期时间数据大体有三种方式
 (1)varchar存储:不足:不便于比较大小,格式不灵活
 (2)date/time/datetime存储:不足:不便于实现国际化,不同的编程语言支持程度不同
 (3)bigint存储:表示距离计算机元年的毫秒值,任何编程语言都可以把大数字转换为日期时间
中国:2017-10-25
美国:10-25-2017
欧洲:25/10/2017
i18n:internationalization,国际化,实现了国际化的项目应该对中国人显示中国人的习惯格式,对美国人显示美国人的习惯格式.......
计算机中如何存储日期时间:一个很大的数字,表示目标日期距离“计算机元年(1970-1-1 0:0:0 gmt)”经过了多少毫秒:
数字    代表的时间
0    1970-1-1 0:0:0
1000    1970-1-1 0:0:1
-1000    1969-12-31 23:59:59
1000*60    1970-1-1 0:1:0
10006060    1970-1-1 1:0:0
10006060*24    1970-1-2 0:0:0
1000606024365    1971-1-1 0:0:0
mysql中使用自增列id int primary key auto_increment
 自增列:只能用于整数列,且必须是主键列。自增列无需手工赋值,会自动采用1/2/3....数列,在当前最大值基础上+1。
 注意:sql标准中没有此关键字,它是mysql所专有的!
1.简单查询 —— 只查询特定的列
 示例:查询出所有员工的姓名、工资、和编号
select ename, salary, eid  from emp;

练习:查询出所有的员工姓名、性别、生日、姓名
select ename, sex, birthday, ename from emp;

2.简单查询 —— 查询所有的列
 示例:查询员工的所有信息
 select  *  from  emp;
3.简单查询 —— 给列取别名
 示例:查询出员工姓名,所在部门编号,要求列名用中文呈现
 select  ename as 姓名, deptid `部门 编号`  from emp;

注意:给列取别名用as关键字,且可以省略;别名中若有空格,需要用括起来。
4.简单查询 —— 只显示不同的记录
 示例:显示出哪些部门编号下有员工
select  distinct deptid 
from emp;

说明: distinct:不同的
 练习:查询出公司中有哪些性别的员工
select  distinct  sex    from emp;

5.简单查询 —— 在查询时执行计算
 示例:计算2/3的商
select  2/3;

示例:查询出每个员工的姓名及其年薪
select  ename, salary,  salary*12
from emp;

6.简单查询 —— 查询结果集的排序
 示例:查询出所有员工信息,按工资由小到大排列
select  * 
from emp
order  by  salary ;    #asc,ascendant 升序

示例:查询出所有员工信息,按工资由大到小排列
select  * 
from emp
order  by  salary  desc;     #descendant 降序

7.简单查询 —— 条件查询
 示例:查询出编号为5的员工所有信息
select  *  from emp
where  eid=5 ;

8.简单查询 —— 模糊条件查询
 示例:查询出姓名中包含字母e的员工所有信息
select  *  from  emp
where  ename  like  '%e%';
#where  ename='%e%'; #错误写法!

sql通配符:  下面两个通配符必须与like组合应用
%   匹配任意多个任意字符    
_    匹配一个任意字符
9.简单查询 —— 分页查询
 分页查询:若数据库中的满足条件的记录行数太多,一般会采取“一页一页”的方式逐步展示给用户。
 不同的数据库实现分页查询语法各不相同,mysql中的分页查询时最简单的!形如:
select  ...
from ...
where  ...
order by ...
limit  start, count ;

start:从哪一行开始读取数据,数据库中的第一行记录称为第0行
 count:一次最多可以读取的行数
 假设:每一页最多呈现6条记录(称为“页面大小”pagesize)
 第1页: select ....  limit  0, 6 ;
 第2页: select ....  limit  6, 6 ;
 第3页: select ....  limit  12, 6 ;
 第4页: select ....  limit  18, 6 ;
 ....
 第n页: select ....  limit  (n-1)*pagesize,  pagesize ;
复杂查询 —— 聚合/分组查询函数:一个可以接收若干数据,加以处理,输出特定数据的功能体 —— 饺子机
mysql提供的函数: count()、sum()、avg()、max()、min() ——  聚合函数
示例:查询出所有员工的总数量
select  count(eid) as 编号数量  from emp;  #15
select  count(deptid)  from emp;            #14
select  count(*)  from emp;                #15

示例:查询出每个部门的编号以及该部门的员工数量(先分组再聚合计算)
select  deptid, count(*) from  emp
group  by  deptid;

注意:分组查询的结果集中只能包含两种列:
(1)分组条件列
(2)其他列的聚合函数
select  deptid, count(ename), ename from  emp
group  by  deptid;   #错误写法
复杂查询 —— 子查询子查询:在一条语句(增删改查)中又嵌入了一条select语句
 示例:查询出“研发部”所有员工的信息
 步骤1:到部门表查询出研发部对应的部门编号,如10
select  did  from  dept 
where  dname='研发部';

步骤2:到员工表查询部门编号为10的员工信息
select  *   from  emp
where  deptid=10;

综合两条语句:
select  *   from  emp
where  deptid=( 
    select  did  from  dept 
    where  dname='研发部'
);   #父查询中需要的条件数据由子查询提供

复杂查询 —— 跨表/多表查询示例:查询出每个员工的姓名及其所在部门的名称
select  ename, dname
from  emp, dept;      #错误!得到了“笛卡尔积”
select  ename, dname
from  emp, dept
where  deptid=did;  #跨表查询必须防止“笛卡尔积”
注意:上述语法是sql-92标准中的跨表查询语法。缺陷:

若某个中的记录在对方表中无对应项,则总结果无法显示这样的记录。
如deptid为null的员工、没有员工的部门都无法显示。
sql-99中的跨表查询语法分为四种:
(1)内连接查询  inner join  查询结果与sql-92标准一样!
    select  ename,  dname
    from  emp   inner join  dept
    on  deptid=did;  #两个表的拼接条件用on声明
  (2)左外连接查询  left [outer] join
    select  ename,  dname
    from  emp   left  outer  join  dept
    on  deptid=did;  #显示“左侧”表中的所有记录!
  (3)右外连接查询  right outer join
    select  ename,  dname
    from  emp   right  outer  join  dept
    on  deptid=did;  #显示“右侧”表中的所有记录!
  (4)全连接查询 full join
    注意:mysql不支持全连接!

mysql中解决“不支持全连接”的方法 —— 结果集的合并:(select  ename  from  emp_cn)
union
(select  ename  from  emp_us);  #合并相同的记录
 ------------------------------------------------
(select  ename  from  emp_cn)
union  all
(select  ename  from  emp_us);  #不合并相同的记录

sql语句的分类:ddl: data define language,数据定义语言——定义列
 create / drop / alter / truncate

dml: data manipulate language,数据操作语言——操作行
 insert / delete / update

dql: data query language,数据查询语言——不影响数据
 select

dcl: data control language,数据控制语言——控制权限
 grant / revoke

小知识:mysqli_query($conn, $sql)的返回值类型:
(1)dml: 增删改,执行失败返回false,成功返回true
(2)dql: 查,执行失败返回false,成功返回查询结果集对象,可能有0/1/n行数据;
从其中获取一行数据可以使用:
 $row=mysqli_fetch_row($result);抓取一个索引数组或null
 $row=mysqli_fetch_assoc($result);抓取一个关联数组或null
从其中获取所有记录行可以使用:
 $rowlist=mysqli_fetch_all($result, mysqli_assoc);抓取一个二维数组,每一行呈现为一个关联数组
相关推荐:
mysql知识点总结_mysql
mysql建议连接及查询数据表php代码
mysql连接数据库并测试实例分享
以上就是mysql知识点总结分享的详细内容。
其它类似信息

推荐信息