admin管理员组文章数量:1439808
——mysql数据库基础
MySQL—基础知识
官网参考手册
一、保存数据的几种形式
内存 | 临时保存数据 |
---|---|
文件 | 不便于管理 |
第三方机构 | 腾讯云,百度云,阿里云独立的数据库服务器 |
二、数据库的概述
Database(数据库,以特定的结构批量存储数据的软件)
数据库的发展史:
网状数据库->层次型数据库->关系型数据库->非关系型数据库
关系型数据库中数据的逻辑结构:
Server->Database->Table->Row->Column
服务器-> 数据库 -> 表-> 行-> 列
三、MySQL
MySQL DB分支: | / |
---|---|
Maria DB分支: | / |
xampp官网: | / |
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、增删改查
- SQL语言最早是由IBM提出,后提交给ISO,成为行业内标准语言。
- 分为多个版本:SQL-87、SQL-92、SQL-99。
- 当前标准SQL语言被绝大多数的关系型数据库所支持。
2、SQL命令的两种执行方式
-
交互模式:客户端连接Mysql,输入一行,回车,服务器执行一行。
—适用于临时性查看数据
mysql -uroot 回车 -
脚本模式:客户端把要执行的多行命令写在一个脚本文件中,一次性的提交给服务器执行。
—适用于批量操作数据。
mysql -uroot <C:/xampp/…/02.sql
SQL syntax:语法的意思
3、SQL语法规范
- 每条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='123@qq' 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) |
TRUE和FALSE不能加引号。 |
(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
-
声明了外键约束的列,取值必须在另一个表的主键上出现过
-
取值可以是NULL
注意:外键的列类型要和另外一个表主键的列类型一致。
FOREIGN KEY(familyid) REFERENCES xz_laptop_family(fid) -
所有的列约束中,主键约束推荐使用—可以提高查询效率;但是其他的列约束是否使用根据项目而定,可以不用—会影响数据的插入和更新效率。
九、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*9SELECT 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 empWHERE...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:查询出研发部的部门编号—10SELECT 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');
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数据库基础 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1708395249a743150.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论