——mysql数据库基础

MySQL—基础知识

官网参考手册

一、保存数据的几种形式

内存 临时保存数据
文件 不便于管理
第三方机构 腾讯云,百度云,阿里云独立的数据库服务器

二、数据库的概述

​ Database(数据库,以特定的结构批量存储数据的软件)
​ 数据库的发展史:

网状数据库->层次型数据库->关系型数据库->非关系型数据库

关系型数据库中数据的逻辑结构:

Server->Database->Table->Row->Column
服务器->  数据库 ->   表->  行->  列

三、MySQL

MySQL DB分支: http://www.mysql.com/
Maria DB分支: http://mariadb.org/
xampp官网: http://www.aspchefriends.org/
xampp是一个服务器套装,包含多款服务器软件。
bin: bin文件夹下mysqld.exe:等同于启动
二进制
d->Deamon精灵,守护者
mysqld.exe启动MySQL服务器

四、MySQL数据库系统

1、服务器端

负责存储数据

C://xampp/.../MySQLD.exe

2、客户端

负责向服务器发起增删改查的命令

C://xampp/.../MySQL.exe

3、连接MySQL据库服务器

mysql.exe -h127.0.0.1 -P3306 -uroot -p
简写:mysql -uroot
-h服务器的IP地址/域名可以使用localhost
-P端口,MySQL服务使用3306端口
-u用户
-p密码   

4、MySQL管理命令(每一个加分号;)

quit; 退出服务器连接
show databases;显示数据库服务器上当前所有数据库
use 数据库名称; 进入到指定的数据库
show tables; 显示当前数据库中的数据表
in set:记录
desc 表名称;描述表中有哪些列(表头)

五、常用的sql命令

SQL:structured query Language 结构化查询语言(用于操作关系型数据库服务器中的数据)

1、增删改查

  1. SQL语言最早是由IBM提出,后提交给ISO,成为行业内标准语言。
  2. 分为多个版本:SQL-87SQL-92SQL-99
  3. 当前标准SQL语言被绝大多数的关系型数据库所支持。

2、SQL命令的两种执行方式

  1. 交互模式:客户端连接Mysql,输入一行,回车,服务器执行一行。
    ​ —适用于临时性查看数据
    ​ mysql -uroot 回车

  2. 脚本模式:客户端把要执行的多行命令写在一个脚本文件中,一次性的提交给服务器执行。
    ​ —适用于批量操作数据。
    ​ mysql -uroot ​ SQL syntax:语法的意思

3、SQL语法规范

  1. 每条SQL语句以英文分号为结尾,一条语句可以跨越多行,见到(;)分号结束。

若第N条SQL语句有语法错误,则后续所有语句不会再执行。

在SQL语句中不区分大小写。习惯上数据库关键字用大写,非关键字用小写。

SQL语句中还可以使用单行注释:#…或多行注释://

注释的内容不会被服务器所执行。

4、日常开发中常用的SQL命令

1)丢弃数据库,如果存在的话;
DROP DATABASE IF EXISTS jd;
(2)创建新的数据库;
CREATE DATABASE jd;
(3)进入刚刚创建的数据库;
USE jd;4)创建数据表;
CREATE TABLE student(
 	sid INT,
 	name VARCHAR(6),
 	sex VARCHAR(1),
 	score INT;5)向数据表中插入纪录;
INSERT INTO student(表名称) VALUES('10','TOM','M','89'),
								  ('9','gren','M','92'),
							      ('8','Kate','M','89');6)查询数据表中所有的记录;
SELECT * FORM student(表名称);

5、增删改查—更改和删除

(1)更改记录
UPDATE user SET
upwd='123',email='[email protected]' WHERE uid='1',
(2)删除记录
DELETE FROM user WHERE uid='3';

六、数据库中的中文乱码问题

计算机中如何存储英文字符:
ASCII: 总共有128个,对所有的英文字符及符号进行了编码。
Latin-1: 总共有256个,兼容ASCII,同时对欧洲符号进行编码
计算机存储中文字符:
GB2312: 对6000多常用的汉字进行编码,兼容ASCII码。
GBK: 对20000多汉字进行编码,同时兼容GB2312。
BIG5: 台湾繁体字编码,不兼容GB2312和GBK,兼容ASCII码。
Unicode: 对世界上主要的语言的字符进行编码,兼容ASCII码,不兼容GBK,GB2312,BIG5等。
具体分为Utf-8,UTF-16,UTF-32三种存储方案。
中文乱码产生的根源:
MySQL默认使用latin-1编码,而这个编码不能存储中文的。
解决MySQL存储中文乱码:
(1)sql脚本文件另存为的编码
(2)客户端连接服务器使用的编码
(3)服务器端数据库存储数据使用的编码
(4)都统一使用UTF8编码。
(5)设置编辑器的默认编码:
Tools->preference->file->default encoding

七、MySQL列类型

列类型:在创建表的时候,指定列可以存储的数据类型。
CREATE TABLE book (bid 列类型);

(1)数值类型—可以不加引号

数值类型:
TINYINT: 微整型,占用一个字节,-128~127。
SMALLINT: 小整型 占用2个字节,-32768~32767。
INT: 整型 占用4个字节,-2147483648~2147483647。
BIGINT: 大整型,占用8个字节,1byte=8bit
FLOAT: 单精度浮点型,占4个字节,3.4*10的8次方或3.4E38,范围比INT大的多,但是精度不如INT,可能产生误差。
DOUBLE: 双精度浮点型,占8个字节,占1.79E308,范围比BIGINT大的多,但是精度不如BGINT,可能产生误差。
DECIMAL(M,D): 定点小数,不会产生计算误差舍入,M代表总的有效位数,D代表小数点后有效位数。
BOOL: 布尔型,取值只能是TRUE/1、FALSE/0,数据库在存储的时候使用TINYINT(1或0)
TRUEFALSE不能加引号。

(2)字符串类型—必须加引号

字符串类型:
VARCHAR(M): 变长字符串,不会产生空间浪费,操作速度相对较慢,M不能超过65535。
CHAR(M): 定长字符串,可能产生空间浪费,操作速度相对较快,M不能超过255。
TEXT(M): 大型变长字符串,M不超过2G。

(3)日期时间类型—必须加引号

​ DATETIME:日期时间类型 ;2018-11-2 15:18:30’
​ DATE:日期类型 ‘2018-11-2’
​ time:时间类型 ‘15:18:30’

日期时间类型
DATETIME: 日期时间类型 ;2018-11-2 15:18:30’
DATE: 日期类型 ‘2018-11-2’
time: 时间类型 ‘15:18:30’

(4)null

MySQL中的NULL含义:空的,空缺的;
指应该有某个数据,但暂时还不能确定具体的值;
例如:还没到发年终奖,未决定员工的部门,未确定部门经理是谁?

八、列约束

MySQL可以对插入的数据进行特定的检验,只有满足条件的数据才能插入成功,否则会提示"非法插入","禁止插入"

例如:插入人的年龄范围是0~100之间。商品的价格大于0...

MySQL提供了六种列约束

(1)主键约束—PRIMARY KEY

​ 声明了主键约束的列不能插入重复的值,如果主键上的数据是数值会自动按照由小到大的顺序排列—加快查找速度。注意:一个表中只能有一个主键。

(2)唯一约束—UNIQUE

声明了唯一约束的列不能插入重复的值,但可以插入NULL,而且可以插入多个NULL。

NULL:关键字不能加引号

(3)非空约束—NOT NULL

声明非空约束的列上不能插入NULL值,如果插入的是NULL也不会报错,只是会显示空内容。

(4)默认值约束—DEFAULT

可使用default关键字为列声明默认值;有以下两种用法:

INSERT INTO xz_laptop VALUES(1,'小米AIR',DEFAULT);直接写default,或者不写
INSERT INTO xz_laptop(lid,title)VALUES(2,'苹果pro');
(5)检查约束

检查约束可以对插入的数据范围进行验证

CREATE TABLE student(
	age TINYINT CHECK(age>18 AND age<60)
);
注意:MySQL不支持,会降低插入和更新等操作速度效率。
(6)外键约束—FOREIGN KEY
  1. 声明了外键约束的列,取值必须在另一个表的主键上出现过

  2. 取值可以是NULL

    注意:外键的列类型要和另外一个表主键的列类型一致。
    ​ FOREIGN KEY(familyid) REFERENCES xz_laptop_family(fid)

  3. 所有的列约束中,主键约束推荐使用—可以提高查询效率;但是其他的列约束是否使用根据项目而定,可以不用—会影响数据的插入和更新效率。

九、MySQL中的自增列

​ AUTO_INCREMENT:自动增加,假如一个列声明了自增列,无需手动赋值,直接指定为NULL,会自动获取当前的最大值,新纪录会执行+1然后插入。
注意:
​ 1.允许手动赋值
​ 2.只用于整数型的主键列上

十、项目中存储日期时间数据

​ 储存的是距离计算机元年的毫秒数,使用BIGINT类型。

计算机元年 		1970-1-1	0:0:0
1秒=1000毫秒
数据库存储1000	1970-1-1  0:0:1
1000*60			1970-1-1	0:1:0
1000*60*60		1970-1-1	1:0:0
2018年距离计算机元年的毫秒:48*365*24*60*60*1000

十一、简单查询

1)查询所有的列
	SELECT * FROM emp;
    *代表所有的列
(2)查询特定的列
	示例:查询所有员工的姓名,生日,工资
    	SELECT ename,birthday,salary FROM emp;
		练习:查询所有员工的编号,姓名,性别,工资
        SELECT eid,ename,sex,salary FROM emp;3)给列取别名
		示例:查询所有员工的姓名和工资,列名使用汉字。
			SELECT ename AS 姓名,salary AS 工资 FROM emp;
		练习:查询所有员工编号,姓名,性别,生日,全部使用中文别名。
			SELECT eid AS 编号,ename AS 姓名,sex AS 性别,birthday AS 生日 FROM emp;
		练习:查询所有员工的编号,姓名,性别,生日,使用一个英文字母作为别名。
			SELECT eid e,ename n,sex s,birthday b FROM emp;
				AS关键字可以省略
(4)只显示不同的值/合并相同的项
		练习:查询公司都有哪些性别的员工
			SELECT DISTINCT sex FROM emp;
				   (合并)
		练习:公司员工都分布在哪些部门
			SELECT DISTINCT deptid FROM emp;5)查询时执行运算
		示例:计算5+3-7/2*9
			SELECT 5+3-7/2*9 结果;
		练习:查询所有员工的工资及其年薪。
			SELECT ename 姓名,salary*12 年薪 FROM emp;
		练习:假设所有员工工资加500,年终奖5000元,查询出姓名和年薪起别名
			SELECT ename 姓名,(salary+500)*12+5000 工资 FROM emp;6)对查询的结果排序
		示例:查询所有员工的信息,结果按照由低到高排序
			SELECT * FROM emp ORDER BY salary ASC; 
									  (升序 ascend)
									   DESC
		示例:查询所有员工的信息,结果按照由高到低排序
			SELECT * FROM emp ORDER BY salary DESC; 
									   (降序 descend)
		练习:查询所有员工的信息,结果按照年龄由大到小排序
			SELECT * FROM emp ORDER BY birthday ASC;
		练习:查询所有员工的信息,结果按照姓名的排序。
			SELECT * FROM emp ORDER BY ename ASC;
		练习:查询所有员工的信息,按生日由大到小,若生日相同,再按照姓名升序排。
			SELECT * FROM emp ORDER BY birthday ASC,ename ASC;
			多个之间用逗号隔开
		练习:查询所有员工信息,按照工资由大到小排列,要求女员工必须排在男员工的前边。
			SELECT * FROM emp ORDER BY sex ASC,salary DESC;
			如果不加排序规则默认是按照升序排列。
			ORDER BY 可以按照数值、日期、字符串(字符串的编码)来排序。
(7)条件查询
		示例:查询编号为5的员工工资。
			SELECT * FROM emp where eid=5;
			SQL语句中支持的比较运算符:
			=>      <     =     >=         <=       != 
			大于 小于 等于 大于等于 小于等于 不等于
		练习:查询出工资大于等于6000的员工所有信息
			SELECT * FROM emp WHERE salary>=6000;
		练习:查询出所有女员工的信息;
			SELECT * FROM emp WHERE sex=0;
		练习:查询出员工姓名为king的所有信息
			SELECT * FROM emp WHERE ename='king';
		练习:查询出不在10部门的员工信息
			SELECT * FROM emp WHERE deptid!=10;
		练习:查询出1990年之前出生的信息
			SELECT * FROM emp WHERE birthday<'1990-1-1';
		练习:查询1993年之后的员工信息
			SELECT * FROM emp WHERE birthday>'1993-12-31';
		练习:查询出没有明确部门的员工信息
			#SELECT * FROM emp WHERE deptid=NULL 错误;
			SELECT * FROM emp WHERE deptid is NULL;
			注意:NULL不能和任何值进行等于/不等于判定,包括NULL自己。可以使用is NULLis not NULL
		练习:查询所有有明确部门的员工信息。
			SELECT * FROM emp WHERE deptid IS NOT NULL;
		练习:查询出10号部门所有女员工的信息。
			SELECT * FROM emp WHERE deptid=10 AND sex=0;
			AND(并且) OR(或者)
		练习:查询出10号部门和30号部门所有的员工信息
			SELECT * FROM emp WHERE deptid=10 OR deptid=30;
		练习:查询出工资在6000~8000之间所有员工信息
			SELECT * FROM emp WHERE salary>=6000 AND salary<=8000;
			SELECT * FROM emp WHERE salary BETWEEN 6000 AND 8000;
			between...and... 大于等于第一个值,小于等于第二个值
			not....between...and
		练习:查询出工资不在6000~8000之间的所有员工信息
			SELECT * FROM emp WHERE salary<6000 OR salary>8000;
			SELECT * FROM emp WHERE salary not between 6000 and 8000;
		练习:查询出1990年出生的员工信息
			SELECT * FROM emp WHERE birthday between '1990-1-1' and '1990-12-31';
			SELECT * FROM emp WHERE birthday>='1990-1-1' AND birthday<='1990-12-31';
		练习:查询10号和20号部门的员工信息
			SELECT * FROM emp WHERE deptid=10 OR deptid=20 OR deptid=30;
			SELECT * FROM emp WHERE deptid IN(10,20,30);
		练习:查询出不在10号和20号部门的员工信息
			SELECT * FROM emp WHERE deptid NOT IN(10,20);8)模糊条件查询
		示例:查出姓名中含有字母e的员工信息
			SELECT * FROM emp WHERE ename LIKE '%e%';
		练习:查询出姓名以e结尾的员工信息
			SELECT * FROM emp WHERE ename LIKE '%e';
		练习:查询出姓名中倒数第二个字符为e的员工信息
			SELECT * FROM emp WHERE ename LIKE '%e_';
			% 任意多个字符 大于等于0LIKE关键字
			_ 任意一个字符  等于1
			上述两个符号不能和等号=连用,必须使用LIKE9)分页查询
		分页显示:假如查询的结果集中有太多的记录,一次显示不完,可以分多页显示。
			第一页		  开始		 结束
			第一页		   0		   4
			第二页		   5		   9
			第三页		   10		   14
			第四页		   15		   19
			开始=(页面-1)*每页数量
			SELECT * FROM emp LIMIT start,count;
			start:开始的值
			count:查询的数量
			示例:每页大小是5,查询第1页的数据
			SELECT * FROM emp LIMIT 0,5;
		练习:每页大小是5,查询第2页的数据
			SELECT * FROM emp LIMIT 5,5;
		练习:每页大小是5,查询第三页的数据
			SELECT * FROM emp LIMIT 10,5;
		练习:每页大小是5,查询第四页的数据
			SELECT * FROM emp LIMIT 15,5;
			注意:LIMIT后边的两个数值不能加引号。
		SYNTAX语法错误提示
综合:
		SELECT * FROM emp
			WHERE...
			ORDER BY...
			LIMIT...
		练习:查询出所有的男员工工资最高的前三人。
			SELECT * FROM emp WHERE sex=1 ORDER BY salary DESC LIMIT 0,3;  

十二、复杂查询

1、聚合查询/分组查询

	示例:查询出所有员工的数量
		SELECT COUNT(eid) FROM emp;
	练习:使用员工的姓名这一列来查询员工数量
		SELECT COUNT(ename) FROM emp;
	练习:使用员工的部门编号这一列来查询员工数量
		SELECT COUNT(*) FROM emp;
	练习:查询所有男员工的数量
		SELECT COUNT(*) FROM emp WHERE sex=1;
	聚合函数:
	函数,就是一个功能体,提供数据,产出结果。
		COUNT(....)/SUM(...)/AVG(...)/MAX(...)/MIN(...)
	练习:查询所有员工工资综合多少
		SELECT SUM(salary) FROM emp;
	练习:查询出所有员工平均工资
		SELECT AVG(salary) FROM emp;
		SELECT SUM(salary)/COUNT(*) FROM emp;
	练习:查询出工资最高的员工
		SELECT MAX(salary) FROM emp;
	练习:查询出工资最低的员工
		SELECT MIN(salary) FROM emp;
	练习:查询出年龄最大的员工
		SELECT MIN(birthday) FROM emp;
	分组查询:只能查询分组条件和聚合函数
	示例:查询出每个部门的员工数量是多少
		SELECT deptid,COUNT(*) FROM emp GROUP BY sex;
	练习:查询出男女员工的平均工资,还有最高工资,最低工资
		SELECT sex,AVG(salary),MAX(salary),MIN(salary) FROM emp GROUP BY sex;
	函数补充:YEAR(...) 获取日期中的年份
		 MONTH(...)获取日期中的月份
		 DAY(....)获取日期中的日
	示例:查询出1991年出生的员工所有信息
		SELECT * FROM emp WHERE YEAR(birthday)=1991;
	练习:查询出三月份出生的员工所有信息
		SELECT * FROM emp WHERE MONTH(birthday)=3;
	练习:查询出5号出生的员工所有信息
		SELECT * FROM emp WHERE DAY(birthday)=5;
		SELECT * FROM emp WHERE YEAR-MONTH-DAY(birthday)=1990-05-5;

2、子查询

把一个SQL语句的查询结果作为另一个SQL语句的查询条件
	示例:查询出研发部所有的员工信息
	步骤1:查询出研发部的部门编号—10
			SELECT did FROM dept WHERE dname='研发部';
	步骤2:根据研发部的部门编号查询员工信息
			SELECT *FROM emp WHERE deptid=10;
	综合:
			SELECT * FROM emp WHERE deptid=(
			SELECT did FROM dept WHERE dname='研发部'
		);
	练习:查询出比tom工资高的员工的所有信息
	步骤1:查询出TOM的工资
			SELECT salary FROM emp WHERE ename='tom';
	步骤2:查询出工资比6000高的员工所有信息
			SELECT * FROM emp WHERE salary>6000;

	综合:	SELECT * FROM emp WHERE salary>(
				SELECT salary FROM emp WHERE ename='tom'	
		);
	练习:查询出和tom同一年出生的员工信息
	步骤1SELECT YEAR(birthday) FROM emp WHERE ename='tom';
	步骤2SELECT * FROM emp WHERE YEAR(birthday)=1990;
	综合:SELECT * FROM emp WHERE YEAR(birthday)=(
		 SELECT YEAR(birthday) FROM emp WHERE ename='tom'
			);

3、多表查询

	示例:查询出所有员工的姓名及其部门名称。
			SELECT ename,dname FROM emp,dept;
	错误:产生笛卡尔积两个表里数据自由组合。
			多表查询如何避免产生笛卡尔积,添加查询条件
			SELECT ename,dname FROM emp,dept WHERE deptid=did;
	上述多表查询语法是SQL-92中,无法查询出没有部门的员工,也无法查询出没有员工的部门。
		SQL-99中提出了新的多表查询方法。
		(1)内连接	INNER....JOIN....ON和SQL92结果一致
			SELECT ename,dname FROM emp INNER JOIN dept ON deptid=did;2)左外连接 LEFT OUTER JOIN.....ON....
			SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptid=did;
			查询结果是左侧所有的记录都显示;outer可以省略
		(3)右外连接RIGHT OUTER JOIN....ON....
			SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptid=did;
			查询结果是右侧所有记录都显示;outer可以省略
		(4)全连接 FULL JOIN
			显示左侧和右侧所有记录—MySQL不支持
			UNION 合并相同的项;
			UNION ALL 不合并相同的项;
			(SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptid=did)
			UNION
			(SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptid=did);

你可能感兴趣的:(mysql数据库基础知识,前端,mysql,数据库基础)