官网参考手册
内存 | 临时保存数据 |
---|---|
文件 | 不便于管理 |
第三方机构 | 腾讯云,百度云,阿里云独立的数据库服务器 |
Database(数据库,以特定的结构批量存储数据的软件)
数据库的发展史:
网状数据库->层次型数据库->关系型数据库->非关系型数据库
关系型数据库中数据的逻辑结构:
Server->Database->Table->Row->Column
服务器-> 数据库 -> 表-> 行-> 列
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服务器 |
负责存储数据
C://xampp/.../MySQLD.exe
负责向服务器发起增删改查的命令
C://xampp/.../MySQL.exe
mysql.exe -h127.0.0.1 -P3306 -uroot -p
简写:mysql -uroot
-h服务器的IP地址/域名可以使用localhost
-P端口,MySQL服务使用3306端口
-u用户
-p密码
quit; 退出服务器连接
show databases;显示数据库服务器上当前所有数据库
use 数据库名称; 进入到指定的数据库
show tables; 显示当前数据库中的数据表
in set:记录
desc 表名称;描述表中有哪些列(表头)
SQL:structured query Language 结构化查询语言(用于操作关系型数据库服务器中的数据)
交互模式:客户端连接Mysql,输入一行,回车,服务器执行一行。
—适用于临时性查看数据
mysql -uroot 回车
脚本模式:客户端把要执行的多行命令写在一个脚本文件中,一次性的提交给服务器执行。
—适用于批量操作数据。
mysql -uroot
若第N条SQL语句有语法错误,则后续所有语句不会再执行。
在SQL语句中不区分大小写。习惯上数据库关键字用大写,非关键字用小写。
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(表名称);
(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 |
列类型:在创建表的时候,指定列可以存储的数据类型。
CREATE TABLE book (bid 列类型);
数值类型: | |
---|---|
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) |
TRUE和FALSE不能加引号。 |
字符串类型: | |
---|---|
VARCHAR(M): | 变长字符串,不会产生空间浪费,操作速度相对较慢,M不能超过65535。 |
CHAR(M): | 定长字符串,可能产生空间浪费,操作速度相对较快,M不能超过255。 |
TEXT(M): | 大型变长字符串,M不超过2G。 |
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’ |
MySQL中的NULL含义:空的,空缺的;
指应该有某个数据,但暂时还不能确定具体的值;
例如:还没到发年终奖,未决定员工的部门,未确定部门经理是谁?
MySQL可以对插入的数据进行特定的检验,只有满足条件的数据才能插入成功,否则会提示"非法插入","禁止插入"
例如:插入人的年龄范围是0~100之间。商品的价格大于0...
声明了主键约束的列不能插入重复的值,如果主键上的数据是数值会自动按照由小到大的顺序排列—加快查找速度。注意:一个表中只能有一个主键。
声明了唯一约束的列不能插入重复的值,但可以插入NULL,而且可以插入多个NULL。
NULL:关键字不能加引号
声明非空约束的列上不能插入NULL值,如果插入的是NULL也不会报错,只是会显示空内容。
可使用default关键字为列声明默认值;有以下两种用法:
INSERT INTO xz_laptop VALUES(1,'小米AIR',DEFAULT);直接写default,或者不写
INSERT INTO xz_laptop(lid,title)VALUES(2,'苹果pro');
检查约束可以对插入的数据范围进行验证
CREATE TABLE student(
age TINYINT CHECK(age>18 AND age<60)
);
注意:MySQL不支持,会降低插入和更新等操作速度效率。
声明了外键约束的列,取值必须在另一个表的主键上出现过
取值可以是NULL
注意:外键的列类型要和另外一个表主键的列类型一致。
FOREIGN KEY(familyid) REFERENCES xz_laptop_family(fid)
所有的列约束中,主键约束推荐使用—可以提高查询效率;但是其他的列约束是否使用根据项目而定,可以不用—会影响数据的插入和更新效率。
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 NULL和is 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_';
% 任意多个字符 大于等于0 用LIKE关键字
_ 任意一个字符 等于1
上述两个符号不能和等号=连用,必须使用LIKE
(9)分页查询
分页显示:假如查询的结果集中有太多的记录,一次显示不完,可以分多页显示。
第一页 开始 结束
第一页 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;
示例:查询出所有员工的数量
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;
把一个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同一年出生的员工信息
步骤1:SELECT YEAR(birthday) FROM emp WHERE ename='tom';
步骤2:SELECT * FROM emp WHERE YEAR(birthday)=1990;
综合:SELECT * FROM emp WHERE YEAR(birthday)=(
SELECT YEAR(birthday) FROM emp WHERE ename='tom'
);
示例:查询出所有员工的姓名及其部门名称。
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);