数据库概述:
数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。(文件系统)
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。
数据库:存储、维护和管理数据的集合。
MySql和SQLite区别
SQLite是单机数据库。功能简约,小型化,追求最大磁盘效率
MySql是完善的服务器数据库。功能全面,综合化,追求最大并发效率
MySql、Sybase、Oracle等这些都是试用于服务器数据量大功能多需要安装,例如网站访问量比较大的。而SQLite是一款小型数据库,简单移植性好无需安装只需要几个文件。一般手机,终端等用的比较多~
如一句话,如果只是单机上用的,数据量不是很大,程序上对数据的处理也不太复杂的话,就用SQLite比较合适,它轻量级,单文件,可加密,方便小型程序的使用,其他情况建议使用MySql
使用MySql
登录Mysql:
mysql -u 用户名 -p
回车 , 在提示输入密码时再输入密码卸载
1.停止mysql服务 net stop mysql 启动mysql服务 net start mysql
2.卸载mysql
3.找到mysql 安装目录下的 my.ini datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"修改密码
运行cmd
安装成功了打开cmd -->mysql -u 用户名-p 你的密码
修改mysql 用户密码:停止mysql服务 运行输入
services.msc
停止mysql服务,或者 cmd -->net stop mysql
在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)
新打开cmd 输入mysql -u 用户名-p 不需要密码
use mysql;
update user set password=password('abc') WHERE User='root';
关闭两个cmd窗口 在任务管理器结束mysqld 进程
在服务管理页面 重启mysql 服务 ,密码修改完成
也可以使用 SQLyog操作数据库,SQLyog 是一个易于使用的、快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库
往MySQL里导入数据的时候遇到一个报错:Error : Incorrect string value: '\xE5\x8C\x97\xE4\xBA\xAC' for column 'Name' at row 1
原因:默认字符集问题
以下为错误的创建语句:
CREATE TABLE `City` (
`CityID` int(11) NOT NULL,
`ProvinceID` int(11) DEFAULT NULL,
`Name` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`CityID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
而以前都用的gbk_chinese_ci,
解决方法:把默认字符集修改过来,修改为字段的字符集为gbk即可ALTER TABLE City CONVERT TO CHARACTER SET gbk;
也可以在创建表的时候设置默认字符集:
CREATE TABLE `City ` (
`CityID` int(11) NOT NULL,
`ProvinceID` int(11) DEFAULT NULL,
`Name` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`CityID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk ROW_FORMAT=COMPACT
Sql语句的分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等; CREATE、 ALTER、DROP
- DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据); INSERT、 UPDATE、 DELETE
- DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
- DQL(Data Query Language):数据查询语言,用来查询记录(数据):SELECT
- 注意:sql语句以;结尾
MySql命令alter add:增加表的字段
alter add命令用来增加表的字段。
alter add命令格式:alter table 表名 add字段 类型 其他;
例如,在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0:
alter table MyClass add passtest int(4) default '0';
- 加索引
alter table 表名 add index 索引名 (字段名1[,字段名2 …]);
例子: alter table employee add index emp_name (name);
- 加主关键字的索引
alter table 表名 add primary key (字段名);
例子: alter table employee add primary key(id);
- 加唯一限制条件的索引
alter table 表名 add unique 索引名 (字段名);
例子: alter table employee add unique emp_name2(cardnumber);
- 删除某个索引
alter table 表名 drop index 索引名;
例子: alter table employee drop index emp_name;
增加字段
ALTER TABLE table_name ADD field_name field_type;
修改原字段名称及类型
ALTER TABLE table_name CHANGE old_field_name new_field_name field_type;
例子,原字段birthday写错了,修改下字段名称:
ALTER TABLE users CHANGE birthady birthday VARCHAR(50);
删除字段
ALTER TABLE table_name DROP field_name
DDL:操作数据库、表、列等 -----------------------------------------
使用的关键字:CREATE、 ALTER、 DROP
-- 操作数据库 ---------------------------------------------------------------------
-- 创建
-- 创建一个名称为mydb2的数据库
CREATE DATABASE IF NOT EXISTS mydb2;
-- 创建一个名称为mydb2的数据库,并设置其字符集为gbk
CREATE DATABASE IF NOT EXISTS mydb2 CHARACTER SET gbk;
-- 查询
-- 查看当前数据库服务器中所有的数据库
SHOW DATABASES;
-- 查看前面创建的mydb2数据库定义的信息
SHOW CREATE DATABASE mydb2;
-- 修改
-- 查看服务器中的数据库,并把mydb2的字符集修改为utf8
ALTER DATABASE mydb2 CHARACTER SET utf8;
-- 删除
-- 删除前面创建的mydb2数据库
DROP DATABASE mydb2;
-- 其他
-- 查看当前使用的数据库
SELECT DATABASE();
-- 切换使用名称为mydb2的数据库
USE mydb2;
-- 操作数据表 ---------------------------------------------------------------------
-- 创建表
-- 语法:
字段1 字段类型,
字段2 字段类型,
....
);```
-- 注意:创建表之前,要切换到对应的数据中
-- 查看当前数据库中所有的表
```SHOW TABLES;```
-- 查看某个表中所有字段的信息
```DESC 表名称;```
-- 在表名为emp的员工表的基础上增加一个image列(即image字段)
```ALTER TABLE emp ADD image BLOB; ```
-- 修改job列, 使其长度为60
```ALTER TABLE emp MODIFY job VARCHAR(60);```
-- 删除image列,一次只删一列
```ALTER TABLE emp DROP image;```
-- 修改emp表名称为user1
```RENAME TABLE emp TO user1;```
-- 修改表的字符集gbk
```ALTER TABLE user1 CHARACTER SET utf8;```
-- 修改列名ename为username
```ALTER TABLE user1 CHANGE ename username VARCHAR(100);```
-- 删除表
```DROP TABLE user1;```
###### DML数据操作语言,用来定义数据库记录 -----------------------------------------
> DML 是对表中的数据进行增、删、改的操作
使用的关键字:INSERT、UPDATE、DELETE
注意:在MySql中,字符串类型和日期类型的数据都要使用单引号括起来,空值为NULL
-- 插入操作 INSERT: ------------------
-- 语法:``` INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);```
-- 注意:
-- 1.列名与列值的类型、个数、顺序要一一对应。
-- 2.可以把列名当做java中的形参,把列值当做实参。值不要超出列定义的长度。
-- 3.如果插入空值,请使用null
-- 4.插入的日期和字符一样,都使用引号括起来。
-- 给emp中插入一行数据
```INSERT INTO emp(id,NAME,gender,birthday,salary,entry_date,RESUME)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');```
-- 批量插入
```INSERT INTO emp VALUES
(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);```
-- 修改操作 UPDATE ----------
-- 语法:```UPDATE 表名 SET 列名 1=列值 2... WHERE 列名=值```
-- 将所有的员工薪水修改为5000元
```UPDATE emp SET sal=5000;```
-- 将姓名为'ALLEN'的员工修改为3000元
``` UPDATE emp SET sal=3000 WHERE username='ALLEN';```
-- 将姓名为'ALLEN'的员工薪水修改为10000, job修改为CTO
```UPDATE emp SET sal=10000,job='CTO' WHERE username='ALLEN';```
-- 将姓名为’ALLEN‘的员工咋原有薪水基础上增加1000
```UPDATE emp SET sal=sal+1000 WHERE username='ALLEN';```
-- 删除操作 DELETE ------------------------
-- 语法``` DELETE FROM 表名 [where 列名=值]```
-- 删除emp表中 名称 为 ’ALLEN‘的记录
```DELETE FROM emp WHERE username='ALLEN';```
-- 删除 emp 表中 所有记录
```DELETE FROM emp;```
-- 使用truncate删除emp表中记录
```TRUNCATE TABLE emp;```
-- 注意:
-- 1.DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
-- 2.TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。
###### DQL(数据查询语法)-----------------------------------------
>DQL就是数据查询语言,数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端:
-- 语法:
-- select selection_list -- 要查询的列名称
-- From table_list -- 要查询的表名称
-- group by grounping_columns -- 对结果进行分组
-- having condition -- 分组后的行条件
-- order by sorting_columns -- 对结果进行排序
-- limit offset_satrt,row_count -- 结果限定
-- 向emp表中添加数据
INSERT INTO emp(id,NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(1,'ossey','g','2011-01-09', 20000, '2012-11-10','verygood boy');
INSERT INTO emp(id, NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(2,'sey','g','2010-02-08',20000,'2013-10-11','good boy');
INSERT INTO emp(id, NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(3, '郑爽','mm', '2013-01-01',3000, '2015-03-09','good girl');
INSERT INTO emp(id, NAME, gender, birthday, salary, entry_date, RESUME)
VALUES(4, '周杰伦','g','2015-02-03',3000, '2016-03-08', 'good boy');
-- 将所有员工薪水修改为5000元
```UPDATE emp SET salary=5000;```
-- 将姓名为‘sey’的员工薪水修改为3000
```UPDATE emp SET salary=30000 WHERE NAME='sey';```
-- 将姓名为‘ossey’的员工薪水修改为40000,性别修改为女
```UPDATE emp SET salary=40000,gender='g' WHERE NAME='ossey';```
-- 将员工‘sey’的薪水在原有基础上增加10000
```UPDATE emp SET salary=salary+10000 WHERE NAME='sey';```
-- Delete语句
-- 删除表中名称为'sey'的语句
```DELETE FROM emp WHERE NAME='sey';``
-- 删除表中所有记录
```DELETE FROM emp;```
-- 使用truncate删除表中记录, 删除过程:会将表直接drop删除掉,再创建一个相同结构的空表
```TRUNCATE TABLE emp;```
```SELECT * FROM emp;```
-- 查询语句
```SELECT * FROM USER;```
-- 查询以s开头的姓名
```SELECT * FROM emp WHERE NAME LIKE 's%';```
-- 查询第二个字母以o开头的姓名
```SELECT * FROM emp WHERE NAME LIKE '%o%';```
-- 查询有姓名的个数
-- 创建学生表 ------------------------------
```CREATE TABLE stu(
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);```
-- 查看表
```SELECT * FROM stu;```
-- 插入数据
INSERT INTO stu VALUES('S_1001', 'LiuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'ChenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'ZhangSan', 95, 'male');
INSERT INTO stuo VALUES('S_1004', 'LiSi', 65, 'male');
INSERT INTO stuo VALUES('S_1005', 'WangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxxx', NULL, NULL);
-- 创建雇员表 emp -----------------------------------------------------------
```CREATE TABLE emp(
empno INT, -- 员工编号
ename VARCHAR(50), -- 员工姓名
job VARCHAR(50), -- 员工工作
mgr INT, -- 领导编号
hiredate DATE, -- 入职日期
sal DECIMAL(7,2), -- 月薪
comm DECIMAL(7,2), -- 奖金
deptno INT -- 部门编号
);```
-- 插看emp表
```SELECT * FROM emp;```
-- 给emp表中插入以下数据
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
-- 创建emp的部门表 -------------
```CREATE TABLE dept(
deptno INT, -- 部门编号
dname VARCHAR(14), -- 部门名称
loc VARCHAR(13) -- 部门位置
);```
-- 查看dept表
```SELECT * FROM dept;```
-- 给部门表插入以下数据
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON');
-- 1.基础查询 -------------
-- 1.1 查询所有列
```SELECT * FROM emp;```
-- 1.2 查询指定列,比如查询emp表中ename和deptno字段的数据
```SELECT ename, deptno FROM emp;```
-- 2.条件查询 -------------
-- 2.1 查询部门为30,并且奖金少于1000的员工
```SELECT *FROM emp WHERE deptno=30 AND comm<1000;```
-- 2.2 查询 ename为ALLEN 或者 ename为WARD的员工信息
```SELECT * FROM emp WHERE ename='ALLEN' OR ENAME='WARD';```
-- 2.3 查询deptno部门编号为20,30,50的记录
```SELECT * FROM emp WHERE deptno IN(20,30,50);```
-- 2.4 查询部门编号不是20,30, 50的记录
```SELECT * FROM emp WHERE deptno NOT IN(20, 30, 50);```
-- 2.5 查询奖金为null的记录
```SELECT * FROM emp WHERE comm IS NULL;```
-- 2.6 查询奖金在1000到1500之间的记录
-- 第一种写法
```SELECT * FROM emp WHERE comm>=1000 AND comm<=1500;```
-- 第二种写法
```SELECT * FROM emp WHERE comm BETWEEN 1000 AND 1500;```
-- 2.7 查询奖金为非空的员工记录
```SELECT * FROM emp WHERE comm IS NOT NULL;```
-- 3 模糊查询 -----------------------------------
-- 当想查询姓名中包含a字母的员工时,就需要使用到模糊查询了,模糊查询需要使用关键字 LIKE
-- 3.1 查询ename由5个字母构成的员工记录
```SELECT * FROM emp WHERE ename LIKE '_____'; ```-- 5条下划线就是5个记录
-- 模糊查询必须使用LIKE关键字。其中'_'匹配任意一个字母,5个'_'表示5个任意字母
-- 3.2 查询姓名由5个字母构成,并且第5个字母为’s‘的员工记录
```SELECT * FROM emp WHERE ename LIKE '____s';```
-- 3.3 查询员工姓名以'J'开头的员工记录
```SELECT * FROM emp WHERE ename LIKE 'J%';```
-- 其中'%'匹配0~n个任意字母
-- 3.4 查询姓名中第二个字母为's'的员工记录
```SELECT * FROM emp WHERE ename LIKE '%s%';```
-- 4 字段控制查询 -----------------------------------
-- 4.1 去除重复记录
-- 去除重复记录(两行或两行以上记录的数据都相同的), 例如emp表中sal字段就存在相同的记录。当之查询emp表中sal字段时,那么回出现重复记录,需要使用关键字DISTINCT
``` SELECT DISTINCT sal FROM emp;```
-- 4.1 查看关于的月薪和佣金之和
-- 因为sal(基本工资)和comm(奖金)两列的类型都是数值类型,所以可以做加法运算。但是如果sal或comm字段中有一个字段不是数值类型,那么就会出错;
-- 当然如果sal或者comm中其中一个字段的值为NULL时,相加时也为NULL,所以需要在相加时做判断:如果为NULL,就为0,否则为原始值,需要使用关键字IFNULL();
``` SELECT *, sal+IFNULL(comm,0) FROM emp;```
-- 4.3 给列名添加别名
-- 在上面查询结果中出现列名为sal+ifnull(comm,0),这样很不美观,现在我们给这一列添加别名为total:
-- 给列起别名时,是可以省略AS关键字的
```SELECT *,sal+IFNULL(comm,0) AS total FROM emp;```
-- 5 排序 -----------------------------------
-- 5.1 查询所有员工记录,按照部门升序排序
```SELECT * FROM emp ORDER BY deptno ASC;```
-- 或者使用以下语句 省略ASC,ORDER BY 默认就是升序的
``` SELECT * FROM emp ORDER BY deptno;```
-- 5.2 查询所有员工记录,按照部门降序排序
``` SELECT * FROM emp ORDER BY deptno DESC;```
-- 5.2 查询所有员工,按照月薪降序排序,如果月薪相同时,按照部门升序排序
``` SELECT * FROM emp ORDER BY sal DESC , deptno ASC;```
-- 6 聚合函数 -----------------------------------
-- 聚合函数是用来做纵向运算的函数:
-- COUNT(): 统计指定列不为NULL的记录行数;
-- MAX(): 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
-- MIN(): 计算指定列的最小值,如果制定列是字符串类型,那么使用字符串排序运算;
-- SUM(): 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
-- AVG(): 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
-- 6.1 COUNT
-- 当需要纵向统计时使用COUNT();
-- 查询emp表中记录数:
``` SELECT COUNT(*) AS 数量 FROM emp;```
-- 查询emp表中有佣金的人数
``` SELECT COUNT(comm) 数量 FROM emp; ```
-- 注意:由于COUNT() 函数给出的是comm字段这一列,所以只统计commlie非NULL的行数
-- 查询emp表中月薪大于2500的人数
``` SELECT COUNT(*) AS 数量 FROM emp WHERE sal>2500;```
-- 统计月薪与佣金之和大于2500的员工数量
``` SELECT COUNT(*) AS 数量 FROM emp WHERE sal+IFNULL(comm,0)>2500;```
-- 查询有佣金的人数,以及有领导的人数
``` SELECT COUNT(comm) AS 有佣金的人数, COUNT(mgr) AS 有领导的人数 FROM emp;```
-- 6.2 SUM()和AVG()
-- 当需要纵向求和时使用SUM()函数
-- 查询所有员工的月薪和
```SELECT SUM(sal) AS 月薪和 FROM emp;```
-- 查询所有员工的月薪和,以及所有员工的佣金和
``` SELECT SUM(sal) AS 月薪和, SUM(comm) AS 佣金和 FROM emp;```
-- 统计所有员工的平均工资
``` SELECT SUM(sal), COUNT(sal) FROM emp;```
-- 或者使用下面语句
``` SELECT AVG(sal) FROM emp;```
-- 6.3 MAX()和MIN()
-- 查询最高工资和最低工资
``` SELECT MAX(sal), MIN(sal) FROM emp;```
-- 7 分组查询 -----------------------------------
-- 7.1 查询各部门员工的数量
```SELECT COUNT(*) FROM emp WHERE deptno IS NOT NULL GROUP BY deptno;```
-- 此语句会将deptno进行分组,将此字段每种不同的值作为一组数据进行统计个数
-- 查询各部门的员工数量,并显示部门编号
``` SELECT deptno, COUNT(*) FROM emp WHERE deptno IS NOT NULL GROUP BY deptno;```
-- 查询每个部门的部门编号以及部门工资大于1500的人数
``` SELECT deptno, COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;```
-- 7.2 HAVING子句
-- 查询工资总和大于9000的部门编号以及工资总和:
```SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal)>9000;```
-- 注意:HAVING和WHERE的区别:
-- 1.having是在分组后对数据进行过滤。
-- where实在分组钱对数据进行过滤。
-- 2.having后面可以使用聚合函数(统计函数)。
-- where后面不可以使用聚合函数。
-- where是在对分组钱记录的条件,如果是某行记录没有满足where子句的条件,那么这行记录不会参加分组;而having是对分组后的数据的约束
-- 8 LIMIT -----------------------------------
-- LIMIT用来限定查询结果的起始行,以及总行数
-- 8.1 查询5行记录,起始行从0开始
```SELECT * FROM emp LIMIT 0,5;```
-- 注意:起始行的索引是从0开始的,即为实际中第一行的数据
-- 8.2 查询10行记录,起始行从3开始
``` SELECT * FROM emp LIMIT 3,10;```
-- 8.3 分页查询
-- 如果一页记录为10条,希望查看第3页记录应该怎么查呢?
-- 1.第一页记录起始行为0,一共查询10行;
-- 2.第二页记录起始行为10,一共查询10行;
-- 3.第三页记录起始行为20, 一共查询10行;
-- 8.3 分页查询
-- 查询语句书写顺序
-- select - from - where - group by - having - order by - limit
-- 查询语句执行顺序
-- from - where - group by - having - select - order by - limit