JavaWeb:MySql基本操作

注意事项:

条件查询,分组查询,分页查询,子查询,模糊查询,连接查询

下划线命名法  distinct,  IFNULL, order by+列名+排序规则

 

Sql语句

 

#创建数据库
CREATE DATABASE day14;
#展示所有的数据库,包括系统数据库
SHOW DATABASES;
#删除指定名称的数据库
DROP DATABASE test;
#修改数据库字符集
ALTER DATABASE 	day14 CHARACTER SET utf8;
#切换到某一数据库
USE testStudent;
USE day14;
#显示用户创建的数据库
SELECT DATABASE();
#显示用户创建的数据库的语句
SHOW CREATE DATABASE day14;

#创建表----------------------------------------------------------
USE test;
CREATE TABLE t_student(
	NAME VARCHAR(10),
	PASSWORD VARCHAR(20),
	age INT,
	birthday DATETIME,
	hiredate TIMESTAMP
);

#查看当前数据库中有哪些表
SHOW TABLES;
#查看表结构
DESC t_student;
#删除表
DROP TABLE t_student;
SHOW TABLES;
#添加列
ALTER TABLE t_student ADD photo BLOB;
DESC t_student;
#修改列的类型
ALTER TABLE t_student MODIFY photo VARCHAR(20);
DESC t_student;
#修改列的名称
ALTER TABLE t_student CHANGE photo image BLOB;
DESC t_student;
#删除某列
ALTER TABLE t_student DROP image;
DESC t_student;
#修改表的名称
RENAME TABLE t_student TO t_people; 
SHOW TABLES;

#列的约束----------------------------------------------------------
CREATE TABLE t_user(
	id INT PRIMARY KEY AUTO_INCREMENT,
	loginname VARBINARY(20) NOT NULL UNIQUE,
	NAME VARBINARY(20) NOT NULL,
	PASSWORD VARCHAR(20) NOT NULL,
	age INT NOT NULL,
	birthday DATETIME NOT NULL,
	hiredate TIMESTAMP NOT NULL	
);
DESC t_user;

#对表中数据的增删改操作----------------------------------------------------------
#指定列插入值(必须要使用引号包裹)
INSERT INTO t_people(NAME) VALUE('TOM');
SELECT * FROM t_people;
#不指定列插入值(必须给所有列设置值)
INSERT INTO t_people VALUE('TOM','111',11,NOW(),NOW());

#如何修改一条记录?(按照某种条件进行修改记录) update...set...
UPDATE t_people SET age=55 WHERE NAME='TOM';

#删除语句 delete from...where...(删除条件)
DELETE FROM t_people WHERE PASSWORD='111';
DELETE FROM t_people;#删除所有的记录

#查询操作(条件查询)----------------------------------------------------------
#关键是理清查询逻辑 
#查询条件为单个值,使用关键字in
#通过not关键字进行取反
#要查询的列名,要查询的表名,查询条件,对结果进行分组,
SELECT age,NAME FROM t_people;

#案例一:
CREATE TABLE t_stu ( -- 学生表
	sid	CHAR(6),	 -- 学生编号
	sname		VARCHAR(50), -- 学生姓名
	age		INT,	-- 年龄
	gender	VARCHAR(50)	-- 性别
);
SHOW TABLES;
INSERT INTO t_stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO t_stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO t_stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO t_stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO t_stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO t_stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO t_stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO t_stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO t_stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO t_stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO t_stu VALUES('S_1011', 'xxx', NULL, NULL);
#1 查询一张表中所有数据(下面效率高)、*号 是通配符.通配所有列
SELECT * FROM t_stu;
SELECT sid,sname,age,gender FROM t_stu;
#2 查询性别为女,并且年龄小于50的记录
SELECT * FROM t_stu WHERE gender='female' AND age<50;
#3 查询学号为S_1001,或者姓名为liSi的记录
SELECT * FROM t_stu WHERE sid='S_1001' OR sname='liSi';
#4 查询学号为S_1001,S_1002,S_1003的记录
SELECT * FROM t_stu WHERE sid IN('S_1001','S_1002','S_1003');
SELECT * FROM t_stu WHERE sid='S_1001' OR sid='S_1002' OR sid='S_1003';
#5 查询学号不是S_1001,S_1002,S_1003的记录
SELECT * FROM t_stu WHERE NOT(sid='S_1001' OR  sid='S_1002' OR  sid='S_1003')
SELECT * FROM t_stu WHERE sid NOT IN('S_1001','S_1002','S_1003');
#6 查询年龄为null的记录 
SELECT * FROM t_stu WHERE age IS NULL; 
#7 查询年龄在20到40之间的学生记
SELECT * FROM t_stu WHERE age BETWEEN 20 AND 40;
SELECT * FROM t_stu WHERE age >=20 AND age<=40;
#8 查询性别非男的学生记录
SELECT * FROM t_stu WHERE gender='female';
SELECT * FROM t_stu WHERE gender !='male';
SELECT * FROM t_stu WHERE gender NOT IN ('male');
#9 查询姓名不为null的学生记录
SELECT * FROM t_stu WHERE sname IS NOT NULL;

#模糊查询----------------------------------------------------------
#where 字段 like '字符串表达式'(理解为像这样); 使用通配符,
#% :匹配任意字符   _ :匹配单个字符

#1 查询姓名由5个字母构成的学生记录
SELECT * FROM t_stu WHERE sname LIKE '_____';
#2 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
SELECT * FROM t_stu WHERE sname LIKE '____i';
#3 查询姓名以“z”开头的学生记录
SELECT * FROM t_stu WHERE sname LIKE 'z%';
#4 查询姓名中第2个字母为“i”的学生记录
SELECT * FROM t_stu WHERE sname LIKE '_i%'
#5 查询姓名中包含“a”字母的学生记录
SELECT * FROM t_stu WHERE sname LIKE '%a%';
#6 去除重复记录 DISTINCT
SELECT gender FROM t_stu;  -- 出现大量重复记录
SELECT DISTINCT gender FROM t_stu;  -- 去掉重复记录
#7 查看雇员的月薪与佣金之和,通过IFNULL()函数进行进行判断
#null与任何数字计算结果都是null
SELECT ename,sal+ IFNULL(comm,0) FROM emp;
#8 给列名添加别名(一定要学会给查询结果起别名)
SELECT ename,sal*12 + IFNULL(comm,0) AS '年收入' FROM emp;

#排序----------------------------------------------------------
#ASC: 升序(默认就是升序)   DESC:降序  使用order by 关键字
#1 查询所有学生记录,按年龄升序排序
SELECT * FROM t_stu ORDER BY age;
SELECT * FROM t_stu ORDER BY age ASC ;
#2 查询所有学生记录,按年龄降序排序
SELECT * FROM t_stu ORDER BY age DESC;
#3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
SELECT * FROM emp ORDER BY sal DESC,empno ASC;

#聚合函数----------------------------------------------------------
#聚合函数是用来做纵向运算的函数:(对某一列进行计算)
#COUNT():统计指定列不为NULL的记录行数; 如果值为null,不进行统计
#MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
#MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
#SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
#AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
# 查询emp表中记录数:
SELECT COUNT(*) AS '总列数' FROM emp;	
# 查询emp表中有佣金的人数:
SELECT COUNT(*) AS '有佣金人数' FROM emp WHERE comm IS NOT 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(*) AS '人数' FROM emp WHERE comm IS NOT NULL AND mgr IS NOT NULL;
# 查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal),SUM(comm)FROM emp;		
# 统计所有员工平均工资:
SELECT AVG(sal) FROM emp;
# 查询最高工资和最低工资:
SELECT MAX(sal)AS '最高工资',MIN(sal) AS '最低工资' FROM emp;

#分组查询----------------------------------------------------------
#当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。(分组按照属性进行归类)
#查询每个部门的部门编号和每个部门的工资和:(首先进行分组,关键是理清逻辑顺序,逻辑思维)
#根据(by)一定的规则进行分组(Group),根据哪种规则进行分组;分组会消耗大量的性能,对十万条数据进行分组,然后再进行赛选
USE test;
SELECT deptno, SUM(sal) AS '工资和' FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门的人数:
SELECT deptno AS '部门',COUNT(deptno)AS '人数' FROM emp GROUP BY deptno;
#查询每个部门的部门编号以及每个部门工资大于1500的人数:	
SELECT deptno,COUNT(empno) FROM emp WHERE sal>1500 GROUP BY deptno;

#HAVING子句(作用是什么,什么时候使用)(对分组后的数据进行限制) 
#使用having在分组之后加条件.where和having都可以加条件? 1.where在分组之前加条件.2.having在分组之后加条件. where的效率要远远高于having. 分组本身消耗资源非常大.
#查询工资总和大于9000的部门编号以及工资和:
SELECT deptno AS '部门编号',SUM(sal) AS '工资和' FROM emp  GROUP BY deptno HAVING SUM(sal)>9000;

#数据库的备份与恢复----------------------------------------------------------
#备份数据库:份库中的所有表结构和表记录 ----> mysqldump -u root -p day15>e:/day15.sql
#恢复数据库:登录数据库进行回复,不登录数据库进行恢复两种情况

#多表连接查询----------------------------------------------------------
#通过外键来设置两张表之间的关系(通过外键关联两张表)
#外键列:这一列引用了另外一张表中的主键,在数据比较多的一张表中添加一列,此列去引用另外一张表的主键。
#表关系:一对多/多对一;多对多: 建立中间表. 中间表至少包含两个字段,分别引用两张表的主键; 一对一: 三种方式:1> 主键同步,两张表的主键保持一致.2> 在一张表加外键3> 在另一张表加外键
#多表数据完整性约束  如何为表添加外键约束
#指定一列当做外键列,它引用另外一张表中的哪一列。
ALTER TABLE `emp` ADD CONSTRAINT `fk_deptno` FOREIGN KEY (`deptno`) REFERENCES `dept`(`deptno`); 

#多表查询 (内连接,外连接)(会生成有一个新的查询结果表)
#笛卡尔积(起始就是一个简单的排列组合,第一张表中的每一条记录都和第二张表的记录进行匹配,实际没有意义)
SELECT * FROM emp,dept;  -- 该多表查询 因为没有加连接条件,那么该查询没有意义. 注意: 开发时要避免笛卡尔积的出现(特别消耗性能).
#内连接查询  #内连接:左表与右表中的数据能够匹配
#查询所有有部门的员工以及员工的部门信息(此需求需要在两张表中进行查询操作)
#从两张表中进行查询,把两张表中有关系的数据拼接在一起
SELECT * FROM emp,dept WHERE emp.`deptno`=dept.`deptno`;
#外连接
#左外连接    查询所有员工信息(包括没有部门的员工),以及部门信息.	
#有些员工是没有部门的如何处理?(和哪张表进行连接,on后面跟的是连接条件,左外连接把左表中的所有数据都查询出来)
SELECT * FROM emp LEFT JOIN dept ON emp.`deptno`=dept.`deptno`;
		
#右外连接    查询所有部门信息(包括没有员工的部门),以及员工信息.(右外链接,把右侧表中所有的数据都查询出来)
SELECT * FROM emp RIGHT JOIN dept ON emp.`deptno`=dept.`deptno`;

#子查询----------------------------------------------------------
查询出 所有员工中 工资高于名叫 SIMTH 的员工信息 (子查询返回是一行一列,将子查询的结果当做单个值)	
#普通的查询方式
USE test;
SELECT sal FROM emp WHERE ename='SMITH';
SELECT * FROM EMP WHERE sal>800;
#通过子查询进行实现(查询结果为单个值)
SELECT * FROM EMP WHERE sal>(SELECT sal FROM emp WHERE ename='SMITH');
#查询出所有员工中 比 20号部门 所有员工工资都高的员工信息
#普通的查询方式
SELECT MAX(sal) FROM emp WHERE  deptno=20;
SELECT * FROM emp WHERE sal>3000;
#通过子查询进行实现(查询结果为单个值)
SELECT * FROM emp WHERE sal>(SELECT MAX(sal) FROM emp WHERE  deptno=20);	
SELECT * FROM emp WHERE sal> ALL( SELECT sal FROM emp WHERE  deptno=20);
#查询出员工信息 以及 员工领导的名字					
#使用子查询 (子查询返回多行多列 , 可以把子查询的结果当做一张表)

#子查询分类:
#一行一列,将子查询的结果当做单个值.
#多行一列,将子查询结果当做一个集合.
#多行多列,将子查询结果当做一张表.

#all与any 关键字的使用

#分页查询----------------------------------------------------------
#LIMIT用来限定查询结果的起始行,以及总行数。
#第一个参数表示从第几行开始查询,最后一个参数表示,查询多少行
#查询5行记录,起始行从0开始
USE test;
SELECT * FROM emp LIMIT 0,5;
#查询10行记录,起始行从3开始
SELECT * FROM emp LIMIT 3,10;



	

#案例二:
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		-- 部门编号
);
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);


CREATE TABLE dept( -- 部门表
	deptno		INT,	-- 部门编号
	dname		VARCHAR(14), -- 部门名称
	loc		VARCHAR(13)	-- 部门地址
);

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');

 

 

 

Sql测试

1.SQL 指的是Structured Query Language
2.哪个 SQL 语句用于从数据库中提取数据? SELECT
3.哪条 SQL 语句用于更新数据库中的数据? UPDATE
4.哪条 SQL 语句用于删除数据库中的数据? DELETE
5.哪条 SQL 语句用于在数据库中插入新的数据? INSERT INTO
6.通过 SQL,您如何从 "Persons" 表中选取 "FirstName" 列? SELECT FirstName FROM Persons(列名,想查询哪一列的数据)
7.通过 SQL,您如何从 "Persons" 表中选取所有的列? SELECT * FROM Persons
8.通过 SQL,您如何从 "Persons" 表中选取 "FirstName" 列的值等于"Peter" 的所有记录? SELECT * FROM Persons WHERE FirstName='Peter'
9.通过 SQL,您如何从 "Persons" 表中选取 "FirstName" 列的值以 "a" 开头的所有记录? SELECT * FROM Persons WHERE FirstName LIKE 'a%'
10.当所列出的某个条件为 true 时,OR 运算符会显示记录。当列出的所有条件为 true 时,AND 运算符会显示记录。
11.通过 SQL,您如何在表 Persons 中选择 FirstName 等于 Thomas 而 LastName 等于 Carter 的所有记录? SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
12.通过 SQL,您如何按字母顺序选取 Persons 表中 LastName 介于 Adams 和 Carter 的所有记录? SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
13.哪条 SQL 语句可返回唯一不同的值? SELECT DISTINCT(去掉重复元素)
14.哪个 SQL 关键词用于对结果集进行排序? ORDER BY
15.通过 SQL,您如何根据 "FirstName" 列降序地从 "Persons" 表返回所有记录? SELECT * FROM Persons ORDER BY FirstName DESC
16.通过 SQL,您如何向 "Persons" 表插入新的记录? INSERT INTO Persons VALUES ('Jimmy', 'Jackson')
17.通过 SQL,您如何向 "Persons" 表中的 "LastName" 列插入 "Wilson" ? INSERT INTO Persons (LastName) VALUES ('Wilson')
18.您如何把 "Persons" 表中 "LastName" 列的 "Gates" 改为 "Wilson" ?UPDATE Persons SET LastName='Wilson' WHERE LastName='Gates'
19.通过 SQL,您如何在 "Persons" 表中删除 "FirstName" 等于 "Fred" 的纪录? DELETE FROM Persons WHERE FirstName = 'Fred'
20.通过 SQL,您如何返回 "Persons" 表中记录的数目? SELECT COUNT(*) FROM Persons

 

sql理论知识

 

数据仓库

就与我们之前学过的纯文本,properties,XML这些技术一样.用来保存数据.并提供对数据进行增删改查的操作.我们以后做项目时,项目中的数据都是保存在数据库中的.

和文本存数据的区别是数据库中存放的是格式化、有结构的数据

 

为什么要用数据库, 数据库的特点?

1、实现数据共享

2、减少数据的冗余度(大量重复的内容)

3、数据实现集中控制

4、数据一致性,完整性和可维护性,以确保数据的安全性和可靠性(数据库的事务)

5、故障恢复(数据安全措施)

 

常用数据库

1、MySQL:MySQL是最受欢迎的开源SQL数据库管理系统,MySQL是一个关系数据库管理系统。MySQL是开源的。

2、SQL Server:SQL Server是由微软开发的数据库管理系统,它只能在Windows上运行.

3、Oracle:提起数据库,第一个想到的公司,一般都会是Oracle(甲骨文)。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处于领先地位。 Oracle数据库成为世界上使用最广泛的关系数据系统之一。

power designer 数据库设计软件,建模工具。

.MSI就是microsoft installer的简写,是微软格式的安装包。一般是程序的安装软件。

mysql.exe的路径配置到环境变量里面。

 

MySql数据库的安装

安装位置有两个.

1)数据库服务位置: MySQL Server;启动运行在内存中的应用程序,由服务帮你操作数据库

2)数据库数据文件位置: Server data files;存储数据。(首先选择的)

数据库服务配置注意事项:

1)数据库对连接人数有限制。

2)记住数据库应用程序的端口号3306、tomcat的端口号是8080

3)选择MySql默认的字符集:默认的编码方式;自定义选择utf-8。

4)mysql数据库,管理员名称为root。

5)是否允许远程计算机以root方式连接到你的数据库?

mysql数据库卸载: 1、运行卸载程序。2、删除目录

忘记root密码;

忘记了配置mysql的环境变量需要手动配置(新版数据库不需要手动配置)。

(数据库文件与数据库服务,由数据库服务帮助我们操作数据库文件;如何启动数据库服务?)

 

数据库是由两部分构成的:数据库服务和库文件。通过数据库服务操作库文件。

DDL 数据库定义语言 Data Definition Language  || create alter drop(操作数据结构的语句)

DCL 数据库控制语言 Data Control Language || grant rollback commit.

DML 数据库操纵语言 Data Manipulation Language || insert update delete select;对数据库的

增删改查。

Mysql中的语法:

1)sql中的注释  --  表示注释一行

2)sql不区分大小写吗?  关键字不区分大小写.  数据区分大小写.

3)sql语句的结束.使用";"表示sql语句的结束.  分号

4)命名法: 下划线命名法

 

数据文件目录:

1)可以建立多个数据库;

2)每一个数据库中可能包含多张数据表;数据以表的形式进行保存

3)表是存储数据的载体,所有的数据都是存储在表中的

 

DDL 数据库定义语言(库的操作)

1.创建一个库

create database 库名称 [character set 码表名称collate字符校对集名称];

create database day15;

1>看到Query OK, 1 row affected (0.00 sec)表示执行成功.

2>sql语句语法:结尾应使用";"号.

3>字符校对集:决定数据排序的。

2.显示mysql中都有哪些库了.

show databases; 有s一定要注意。

可以看到除了自己创建的库之外,还有一些其他库。其他库(除了test)不要乱动。因为是保存mysql的配置信息,账户信息等等。

test库: 自动创建用于测试的。

3.删除一个数据

drop database 数据库名称;

drop database day15;

4.修改数据库码表

alter database 数据库名称 character set 数据库码表;

alter database day15 character set utf8;

5.当前要使用的库(重要) 要必指定当前操作的库是哪个数据库?

use 库名

use day15; 出现Database changed,说明数据库切换完成.

6.查看当前选择的数据库(或者说是查看当前正在操作的数据库)

select database();   只会显示一个数据库

7.显示创建某个数据库的语句.

show create database 数据库名称;

show create database day15;

 

| day15    | CREATE DATABASE `day15` /*!40100 DEFAULT CHARACTER SET utf8 */ |

 

图形化界面工具介绍:SQLyog的使用注意事项:

1)SQLyog-11.2.5-0.x64.reg注册表文件,破解SQLyog使用的;安装SQLyog前,首先运行.reg即可。

2)新建连接,如果不写数据库名称,可以操作很多数据库。推荐不填写。如果要连接到别人电脑上的数据库,只需要输入别人的ip地址即可。

3)可以进行点击测试连接,测试连接是否成功。

4)通过图形化界面创建数据库,直接右键单击即可。快捷键 Ctrl+D。你所有的操作都会通过sql语句传递给mysql服务区执行。语句的显示在“历史记录”面板里面。

5)F5创建对象浏览器,刷新数据库。

6)改变表 相当于desc table表名;

 

数据库中的数据类型:varchar最好指定长度; 整型一般不指定.

数字型,字符串,小数,文本型,字节型

知道在什么情况下应该使用什么类型的数据?

一、数字型

整型

        INT (常用) 4字节      int

浮点型

FLOAT    单精度4字节   float

  DOUBLE  双精度 8字节 double

DECIMAL 没有精度损失

DOUBLE 和 DECIMAL 区别?

DOUBLE类型在运算时会有精度的缺失。

DECIMAL 就是解决精度缺失问题的。(底层使用字符串来保存数字)

单纯想表示小数属性时,使用double。

需要频繁参与运算的小数,使用decimal。

二、字符串类型  

注意: 字符串类型要使用单引号包裹.

1)短字符串类型

CHAR/VARCHAR  (最大长度255字节)问题:char和varchar有什么区别?

char定长字符串. varchar表示变长字符串.

同时指定长度为10。当存储abc

char => 'abc       '

varchar => 'abc'   开发中varchar用的最多。char只在表示固定长度的枚举中使用。例如 :性别(用01,02表示)

2)长字符串类型

TEXT/CLOB 保存文本(字符流) -->当要保存的内容超过255字节时使用. java中的writer字符

BLOB      保存字节(字节流) -->开发中用不到 java中的stream字节

区别:text:只能存储字符数据. BLOB:可以存储字符和多媒体信息(图片 声音 图像)

三、日期和时间类型

datatime  又记录日期 又记录 时间    2015-01-14 11:36:25

timestamp 同上 2015-01-14 11:36:25

问题: datatime 和 timestamp 区别?

这两种类型记录的数据是一模一样.区别在于插入的时候,如果插入datatime类型时,没有传值,那么该类型默认值就是null;如果插入timestamp类型时,没有 传值,那么该类型默认值就是当前时间;默认值不同。

 

与创建表相关的语句(DDL) (记住)  都是些固定的东西 用的多了就好了!

Create table table_name

(

field1  datatype  约束/主键约束auto_increment,

field2  datatype  约束,

field3  datatype  约束

)character set 字符集 collate校对规则

一定要记住是小括号

1.创建表

create table t_user(

name varchar(10),

password varchar(20),

age int,

birthday datetime,

hiredate timestamp    入职日期;

);

2.查看当前库中有哪些表show tables;

3.查看表的结构 desc 表名; desc t_user;   description

4.删除表 drop table表名; drop table t_user;

5.添加一列 alter table 表名 add 列名类型;  alter table t_user add photo blob;

6.修改列的类型  alter table表名modify 列名类型;

alter table t_user modify photo varchar(20);

7.修改列的名称 alter table 表名 change  旧列名  新列名数据类型;

将 photo这一列 改名为image   alter table t_user change photo image varchar(20);

8.删除某列  alter table表名drop 列名; alter table t_user drop image;

9.修改表的名称 rename table 旧表名 to 新名; rename table t_user to user;

 

列的约束(约束主要分三种) (规范用户操作数据的

保证数据的完整性和规范性.

1.非空约束(not null)  指定非空约束的列,在插入记录时 必须包含值.

2.唯一约束(unique)  该列的内容在表中.值是唯一的.

3.主键约束(primary key)  当想要把某一列的值,作为该列的唯一标示符时,可以指定主键约束(包含 非空约束和唯一约束). 一个表中只能指定一个主键约束列.

主键约束 , 可以理解为 非空+唯一(不能重复).注意: 并且一张表中只能有一个主键约束.(右键单击表名--->改变表--->查看表的约束)

约束体现数据库的完整性.  例如:创建带有约束的表 

create table t_user2(

id int primary key auto_increment,-- 员工编号  主键自动增长

name varchar(10) not null, -- 员工姓名

loginname varchar(10) not null unique,  --登陆名称

password varchar(20) not null, -- 密码

age int not null, -- 年龄

birthday datetime not null, -- 生日

hiredate timestamp not null -- 入职日期

);

 

主键自动增长

注意:

1.前提某个表的主键是数字. 我们可以将该主键设置为自增.

2.使用主键自增可能会造成主键的断层

3.mysql,sqlserver这两个数据库具有该功能.

4.主键自增只能给主键约束的列加

自增就是:每次插入记录时不需要指定值.该字段自己维护自己的值.

维护方式就是每次加1;

语法:

create table t_user(

id int primary key auto_increment,

password varchar(30) not null,

age int not null,

birthday datetime not null,

hiredate timestamp not null,

number int unique

);

 

如何向MySql中插入时间?

CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。

CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。

例:insert into tablename (fieldname) values (now())

 

练习:创建修改表

CREATE TABLE employee (

   id INT(10),

   NAME VARCHAR(10),

   gender VARCHAR(10),

   birthday DATETIME,

   entry_date TIMESTAMP,

   job VARCHAR(5),

   salary DOUBLE(5,3),

   RESUME TEXT

);

1在上面员工表的基础上增加一个image列。

2修改job列,使其长度为60。    

3删除gender列。  drop关键字

4表名改为user。Rename  to

5修改表的字符集为utf8

6列名name修改为username

相当于是修改列的数据类型   使用modify关键字   大致是这样的思路。

alter table t_user modify lever int;

alter table employee drop gender

rename table employee to user_;

alter table user_ character set utf8;

alter table user_ change name userName varchar(10);

 

关系数据库,是建立在关系模型基础上的数据库;现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。

标准数据查询语言SQL就是一种基于关系数据库的语言,这种语言执行对关系数据库中数据的检索和操作。 关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。

关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织

 

对数据库中的表进行增删改

create table student(

id int primary key auto_increment,

name varchar(10) not null,

email varchar(10) unique

);

如何为表添加记录? 一个记录就相当于一个对象

1)指定列插入数据(指定要想那些列插入数据?)

2)给所有的列插入数据

 

常见的查询条件介绍:where子句相当于查询条件

=、!=、<>、<、<=、>、>=;BETWEEN…AND;IN(集合);IS NULL;

条件连接:AND(两个条件全都成立);&&  OR;||  NOT;!

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值