2018年1月

数据的完整性

作用:保证用户输入的数据保存到数据库中是正确的。
确保数据的完整性 = 在创建表时给表中添加约束
完整性的分类

  • 实体完整性
  • 域完整性
  • 引用完整性
  • 用户自定义完整性

实体完整性

实体:即表中的一行(一条记录)代表一个实体(entity)
作用:标识每一行数据不重复。
约束类型: 主键约束(primary key) 唯一约束(unique) 自动增长列(auto_increment)

  • 主键约束(primary key)

注:每个表中要有一个主键。
特点:数据唯一,且不能为null
例:
第一种添加方式:

CREATE TABLE student(
id int primary key,
name varchar(50)
);

第二种添加方式:此种方式优势在于,可以创建联合主键

CREATE TABLE student(
id int,
name varchar(50),
primary key(id)
);
CREATE TABLE student(
classid int,
stuid int,
name varchar(50),
primary key(classid,stuid)
);

第三种添加方式:

CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student  ADD  PRIMARY  KEY (id);
  • 唯一约束(unique)

特点:数据不能重复。

CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
  • 自动增长列

注意:mysql数据库((auto_increment)sqlserver数据库 (identity) oracle数据库( sequence)

给主键添加自动增长的数值,列只能是整数类型

CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);

INSERT INTO student(name) values(‘tom’);

域完整性

作用:限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
约束:数据类型 非空约束(not null) 默认值约束(default)
check约束(mysql不支持)check(sex='男' or sex='女')

  • 非空约束:not null

    CREATE TABLE student(
    Id int pirmary key,
    Name varchar(50) not null,
    Sex varchar(10)
    );

    INSERT INTO student values(1,’tom’,null);

  • 默认值约束 default

    CREATE TABLE student(
    Id int pirmary key,
    Name varchar(50) not null,
    Sex varchar(10) default ‘男’
    );

    insert into student1 values(1,'tom','女');
    insert into student1 values(2,'jerry',default);

引用完整性(参照完整性)

  • 外键约束:FOREIGN KEY

例:

CREATE TABLE student(
sid int pirmary key,
name varchar(50) not null,
sex varchar(10) default ‘男’
);

create table score(
    id int,
    score int,
    sid int , -- 外键列的数据类型一定要与主键的类型一致
    CONSTRAINT fk_score_sid foreign key (sid) references student(id)
);

第二种添加外键方式

ALTER TABLE score1 ADD CONSTRAINT fk_stu_score FOREIGN KEY(sid) REFERENCES stu(id);

用户自定义完整性

反映某一具体应用所涉及的数据必须满足的语义要求。

表与表之间的关系

  • 一对一
  • 一对多(多对一)
  • 多对多:

排序

升序(默认)

SELECT * FROM [表名] ORDER BY [列名] ASC;

降序

SELECT * FROM [表名] ORDER BY [列名] DESC;

多列排序

先对第一列排序,第一列相同后再对第二例进行排序

 SELECT * FROM [表名] ORDER BY [列名1] [ASC/DESC],[列名2] [ASC/DESC]...;

聚合函数

聚合函数是用来做纵向运算的函数:

COUNT()

统计指定列不为NULL的记录行数;

SELECT COUNT([列名]) FROM 表名;

MAX()

计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

SELECT MAX([列名]) FROM [表名];

MIN()

计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

SELECT MIN([列名]) FROM [表名];

SUM()

计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;

SELECT SUM([列名]) FROM [表名];

AVG()

计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

SELECT AVG([列名]) FROM [表名];

分组查询

当需要分组查询时需要使用GROUP BY子句
注:凡和聚合函数同时出现的列名,一定要写在group by 之后

select [列名]count(*) from [表名] group by[列名];

HAVING子句

select [列名]count(*) from [表名] group by[列名] HAVING [条件];

注:having与where的区别:
1.having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
2.having后面可以使用聚合函数(统计函数)
where后面不可以使用聚合函数。
WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。

LIMIT

LIMIT语法

LIMIT用来限定查询结果的起始行,以及总行数。

SELECT * FROM [表名] LIMIT [参数1], [参数2];

第一个参数是开始的条数(从0开始),第二个参数是查询的条数

查询语句书写顺序:select – from- where- group by- having- order by-limit
查询语句执行顺序:from - where -group by - having - select - order by-limit

附录:示例代码

-- 查询所有学生,按年龄升序排列
SELECT * FROM stu ORDER BY age ASC;
-- 查询所有学生,按年龄升序排列
SELECT * FROM stu ORDER BY age DESC;
-- 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
-- 查询emp表中记录数
SELECT COUNT(*)FROM emp;
-- 查询emp表中月薪大于2500的人数
SELECT COUNT(*)FROM emp WHERE sal>2500;
-- 查询所有雇员月薪和
SELECT SUM(sal) FROM emp;
-- 统计所有员工的平均工资
SELECT AVG(sal) FROM emp;
-- 查询最高工资和最低工资
SELECT MAX(sal),MIN(sal) FROM emp;
-- 查询男生女生分别多少人
select gender,count(*) from stu group by(gender);
-- 查询工资总和大于9000的部门编号以及工资和:
SELECT deptno, SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
 -- 查询5行记录,起始行从0开始
SELECT * FROM emp LIMIT 0, 5;


  • Ctrl+N 新建文件
  • Ctrl+O 打开文件
  • Ctrl+S 保存文件
  • Ctrl+C 复制整行(光标放在的行就会被复制)
  • Ctrl+X 剪切整行(光标放在的行就会被剪切)
  • Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)
  • Ctrl+G 跳转到相应的行
  • Ctrl+J 合并行(已选择需要合并的多行时)
  • Ctrl+L 选择整行(按住-继续选择下行)
  • Ctrl+M 光标移动至括号内开始或结束的位置
  • Ctrl+T 词互换
  • Ctrl+U 软撤销
  • Ctrl+P 查找当前项目中的文件和快速搜索;输入 @ 查找文件主标题/函数;或者输入 : 跳转到文件某行;
  • Ctrl+R 快速列出/跳转到某个函数
  • Ctrl+K Backspace 从光标处删除至行首
  • Ctrl+K+B 开启/关闭侧边栏
  • Ctrl+KK 从光标处删除至行尾
  • Ctrl+K+T 折叠属性
  • Ctrl+K+U 改为大写
  • Ctrl+K+L 改为小写
  • Ctrl+K+0 展开所有
  • Ctrl+Enter 插入行后(快速换行)
  • Ctrl+Tab 当前窗口中的标签页切换
  • Ctrl+Shift+A 选择光标位置父标签对儿
  • Ctrl+Shift+D 复制光标所在整行,插入在该行之前
  • ctrl+shift+F 在文件夹内查找,与普通编辑器不同的地方是sublime允许添加多个文件夹进行查找
  • Ctrl+Shift+K 删除整行
  • Ctrl+Shift+L 鼠标选中多行(按下快捷键),即可同时编辑这些行
  • Ctrl+Shift+M 选择括号内的内容(按住-继续选择父括号)
  • Ctrl+Shift+P 打开命令面板
  • Ctrl+Shift+/ 注释已选择内容(重复则取消注释)
  • Ctrl+Shift+↑可以移动此行代码,与上行互换
  • Ctrl+Shift+↓可以移动此行代码,与下行互换
  • Ctrl+Shift+[ 折叠代码
  • Ctrl+Shift+] 展开代码
  • Ctrl+Shift+Enter 光标前插入行
  • Ctrl+PageDown 、Ctrl+PageUp 文件按开启的前后顺序切换
  • Ctrl+Z 撤销
  • Ctrl+Y 恢复撤销
  • Ctrl+F2 设置/取消书签
  • Ctrl+/ 注释整行(如已选择内容,同“Ctrl+Shift+/”效果)
  • Ctrl+鼠标左键 可以同时选择要编辑的多处文本
  • Shift+鼠标右键(或使用鼠标中键)可以用鼠标进行竖向多行选择
  • Shift+F2 上一个书签
  • Shift+Tab 去除缩进
  • Alt+Shift+1(非小键盘)窗口分屏,恢复默认1屏
  • Alt+Shift+2 左右分屏-2列
  • Alt+Shift+3 左右分屏-3列
  • Alt+Shift+4 左右分屏-4列
  • Alt+Shift+5 等分4屏
  • Alt+Shift+8 垂直分屏-2屏
  • Alt+Shift+9 垂直分屏-3屏
  • Ctrl+Shift+分屏序号 将当前焦点页分配到分屏序号页
  • Alt+. 闭合当前标签
  • Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑
  • Tab 缩进 自动完成
  • F2 下一个书签
  • F6 检测语法错误
  • F9 行排序(按a-z)
  • F11 全屏模式

自己遇到的:

  • lorem+tab输入lorem,然后按tab键自动生成测试文字,默认是100个英文单词,后面添加数字,可以指定测试文字的个数。
  • meta:vp+tab输入meta:vp,然后按tab键,会自动生成viewport的代码。

  • Ctrl+c 复制
  • Ctrl+v 粘贴
  • Ctrl+x 剪切
  • Ctrl+a 全选
  • Ctrl+s 保存
  • Ctrl+z 撤销一步
  • Windows+d 返回桌面
  • Windows+e 我的电脑
  • Windows+r 打开运行
  • Alt+tab 切换软件
  • Alt+F4 关闭当前软件
  • Ctrl+tab 软件文档之间的切换
  • F2 重命名
  • F5 刷新页面
  • F12 在浏览器中打开调试模式
  • F11 全屏

DQL数据查询语言

数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
查询返回的结果集是一张虚拟表。查询关键字:SELECT

语法:

SELECT selection_list /*要查询的列名称*/
FROM table_list /*要查询的表名称*/
WHERE condition /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BY sorting_columns /*对结果分组*/
LIMIT offset_start, row_count /*结果限定*/

基础查询

查询所有的列

SELECT * FROM [表名];

查询指定的列

SELECT [列名1,列名2,...] FROM [表名];

条件查询

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

=、!=、<>、<、<=、>、>=;
BETWEEN…AND; 
IN(set);
IS NULL; IS NOT NULL
AND;
OR;
NOT; 

语法:

SELECT * FROM [表名] WHERE [条件];

模糊查询

模糊查询需要使用关键字LIKE
通配符:

  • _ 任意一个字符
  • %:任意0~n个字符

字段控制查询

去除重复记录

去除重复记录(两行或两行以上记录中系列的上的数据都相同),或者党激烈相同时去除改行记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT:

SELECT DISTINCT [列名]  FROM [表名];
SELECT DISTINCT [列名1],[列名2]  FROM [表名];

滤空函数

在进行计算时,需要对null值进行滤空操作(把空值当做0进行计算)关键字IFNULL

SELECT IFNULL([列名],0) FROM [表名];

给列名添加别名

SELECT [列名] AS [新列名] FROM [表名];

附录:(示例代码)

-- 查询所有列
SELECT * FROM stu;
-- 查询指定的列
SELECT sid,sname FROM stu;
-- 查询性别为女,并且年龄大于50
SELECT * FROM stu WHERE gender = "female" AND age>=50;
-- 查询学号为s_1001,S_1002,S_1003
SELECT *FROM stu WHERE sid IN('s_1001','S_1002','S_1003');
-- 查询学号不是s_1001,S_1002,S_1003
SELECT *FROM stu WHERE sid NOT IN('s_1001','S_1002','S_1003');
-- 查询学号为s_1001或者名字为liSi的
SELECT *FROM stu WHERE sid='s_1001' OR sname='liSi';
-- 查询年龄为null
SELECT * FROM stu WHERE age IS NULL;
-- 查询年龄不为null
SELECT * FROM stu WHERE age IS NOT NULL;
-- 查询年龄在20到40之间的学生记录
SELECT * FROM stu WHERE age BETWEEN 20 AND 40;
-- 查询性别非男的学生记录
SELECT * FROM stu WHERE gender!='male';
-- 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM stu WHERE sname LIKE '____i';
-- 查询姓名以“z”开头的学生记录
SELECT *FROM stu WHERE sname LIKE 'z%';
-- 查询所有的deptno(去掉重复的)
SELECT DISTINCT deptno  FROM emp;
-- 查询sal和comm不同的列
SELECT DISTINCT sal,comm FROM emp;
-- 查看雇员的月薪与佣金之和
SELECT IFNULL(comm,0)+deptno FROM emp;
-- 给列名添加别名
SELECT IFNULL(comm,0)+deptno AS total FROM emp;


  1. 查询表中的所有数据

    SELECT * FROM [表名];

  2. 插入数据

    语法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);

  3. 修改数据

    语法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 ... WHERE 列名=值;

  4. 删除数据

    语法 : DELETE FROM 表名 [WHERE 列名=值];

  5. 使用truncate删除表中记录

    TRUNCATE TABLE 表名;

注意:

  • 在mysql中,字符串类型和日期类型都要用单引号括起来。
  • 插入数据时列名与列值的类型、个数、顺序要一一对应。可以把列名当做java中的形参,把列值当做实参。值不要超出列定义的长度。 如果插入空值,请使用null。插入的日期和字符一样,都使用引号括起来。

DELETE 和 TRUNCATE 的区别:

  • DELETE 删除表中的数据,表结构还在;删除后的数据可以找回。
  • TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。删除的数据不能找回。执行速度比DELETE快。

附录代码

CREATE TABLE emp(
id INT,
NAME VARCHAR(50),
gender VARCHAR(10),
birthday DATE,
entry_date DATE,
job VARCHAR(100),
salary DOUBLE,
RESUME VARCHAR(200)
);
-- 查询表中的数据
select * FROM emp;
-- 向emp表中插入数据
insert into emp(id,name,gender,birthday,entry_date,job,salary,resume)values(1,'tom','m','2017-10-01','20000','20180103','goodboys','fff');
insert into emp(id,name,gender,birthday,entry_date,job,salary,resume)values(2,'孙肖宁','m','2017-10-01','50000','20180103','goodboys','fff');
INSERT INTO emp VALUES(3,'tom','m','2017-10-01','20000','20180103','goodboys','fff');
-- 将所有人的工资修改为50000
update emp set salary = '50000';
-- 将孙肖宁的工资修改为100000
update emp set salary='100000' where name='孙肖宁';
-- 将tom的工资加1000
update emp set salary=salary+1000 where name = 'tom';
-- 删除id是3的数据
delete from emp where id=3;
SELECT * FROM emp;

创建表

create table 表名(
    字段1 字段类型,
    字段2 字段类型,
    ...
    字段n 字段类型
);

查看当前数据库中的所有表

SHOW TABLES;

查看表的字段信息

DESC [表名];

添加一个列

alter table [表名] add [列名] blob;

修改一个列

alter table [表名] modify [列名] [属性];

删除一个列,一次只能删除一列

alter table [表名] drop [列名];

对表进行重命名

rename table [原名] to [新名];

查看表的创建细节

show create table [表名];

修改表的字符集为gbk

ALTER TABLE [表名] CHARACTER SET gbk;

修改列名

ALTER TABLE user CHANGE [原名] [新名] [参数];

删除表

DROP TABLE [表名];

附录:常用数据类型:

  1. int:整型
  2. double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
  3. char:固定长度字符串类型; char(10) 'abc '
  4. varchar:可变长度字符串类型;varchar(10) 'abc'
  5. text:字符串类型;
  6. blob:字节类型;
  7. date:日期类型,格式为:yyyy-MM-dd;
  8. time:时间类型,格式为:hh:mm:ss
  9. timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值
  10. datetime:日期时间类型 yyyy-MM-dd hh:mm:ss

示例代码

--选择数据库
USE mydb1;
--查询数据库
SELECT DATABASE();
--创建一个员工表
CREATE TABLE emp(
id INT,
NAME VARCHAR(50),
gender VARCHAR(10),
birthday DATE,
entry_date DATE,
job VARCHAR(100),
salary DOUBLE,
RESUME VARCHAR(200)
);
--显示数据库中的所有表
SHOW TABLES;
--查看表的字段信息
DESC emp;
--在上面的员工表中添加一个image列
ALTER TABLE emp ADD image BLOB;
--修改job列,长度变成60
ALTER TABLE emp MODIFY job VARCHAR(60);
--删除列,一次只能删除一行
ALTER TABLE emp DROP image;
--把表的名称改为USER
RENAME TABLE emp TO USER;
--查看表的详细创建信息
SHOW CREATE TABLE USER;
--修改表的字符集为jbk
ALTER TABLE USER CHARACTER SET gbk;
--列名NAME改为username
ALTER TABLE USER CHANGE NAME username VARCHAR(100);
DESC USER;
--删除表
DROP TABLE USER;
SHOW TABLES; 

  • DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等; CREATE、 ALTER、DROP
  • DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据); INSERT、 UPDATE、 DELETE
  • DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
  • DQL(Data Query Language):数据查询语言,用来查询记录(数据)。

SELECT

  • 注意:sql语句以;结尾

  • 按win+R键,输入运行cmd
  • 打开mysql -uroot -p[密码]
  • 修改mysql root用户密码
  • 停止mysql服务 运行输入services.msc 停止mysql服务或者net stop mysql
  • 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)
  • 新打开cmd 输入mysql -u root -p 不需要密码 use mysql;update user set password=password('【新密码】') WHERE User='root';
  • 关闭两个cmd窗口 在任务管理器结束mysqld 进程
  • 在服务管理页面 重启mysql 服务

密码修改完成

启动MySQL数据库

net start mysql

关闭MySQL数据库

net stop mysql

连接MySQL数据库

mysql -h[ip地址] -r[用户名] -p[密码]

显示数据库

show databases;

选择数据库

use [数据库名];

创建数据库

create database [数据库名];

创建编码格式为gbk的数据库

create database [数据库名] character set gbk;

创建编码格式为gbk,字符校对gbk_chinese_ci为的数据库

Create database [数据库名] character set gbk COLLATE gbk_chinese_ci;

显示数据库数据库的定义信息

Show  create  database [数据库名];

删除数据库

Drop database [数据库名];

查看服务器中的数据库,并把mydb2的字符集修改为utf8;

alter database mydb2 character set utf8;

产看当前数据库

select database();

退出数据库

`exit`或者`quit`


代码实例

--创建数据库
CREATE DATABASE mydb1;
--显示所有数据库
SHOW DATABASES;
--创建一个使用gbk字符集的mydb2数据库
CREATE DATABASE mydb2 CHARACTER SET gbk;
--显示mydb2数据库的字符集
SHOW CREATE DATABASE mydb2;
--创建一个带字符校对的数据库mydb3
CREATE DATABASE mydb3 CHARACTER SET utf8 COLLATE utf8_general_ci;
--查看前面创建的数据库的定义信息
SHOW CREATE DATABASE mydb2;
--删除数据库
DROP DATABASE mydb3;
--修改mydb2的编码为utf8
ALTER DATABASE mydb2 CHARACTER SET utf8;
--切换数据库到mydb1;
USE mydb1;
--查看当前数据库
SELECT DATABASE();