目录
MySQL数据库和SQL语句(重点)
1、数据库的简介
2、MySQL数据库的安装和卸载
3、MySQL数据库概念
4、SQL语言(操作数据库)
5、SQL语言分类
1、数据库的操作(CURD)创建数据库(重点)
2、查看数据库(重点)
3、表结构操作(CURD)
<1>创建表
<2>数据库的数据类型(重点)
<3>单表的约束(了解)
<4>查看表和删除表(掌握)
<5>修改表(掌握)
4、数据操作
<1>插入数据(insert添加)(掌握)
<2>如何解决中文乱码(*)
<3>修改数据的语句(update更新)(掌握)
<4>删除数据的语句(delete可以还原/truncate不可还原)(掌握)
<5>查询数据的语句(select)(掌握)
(1)where子句后可以使用的符号
(2)使用order by 对结果进行排序
(3)聚集函数
(4)分组查询概念
1、单表的约束(主键)
2、唯一和非空约束
3、多表约束(外键)
4、多表的设计(3种方式)
5、多表的查询(重要)
<1>多表查询之内连接
<2>多表查询之外连接
<3>总结
<4>内连接和外连接的数据的区别
6、子查询
1、什么是数据库:数据仓库。访问必须只能用SQL语句来访问。数据库也是一个文件的系统。
2、数据库的作用:存储数据的作用。开发任何的应用,都有数据库。
3、关系型的数据库:数据库中保存的都是实体之间的关系。
4、常见的数据库
*Java开发,必须的两个数据库Qracle和MySQL
*Oracle数据库(甲骨文) 大型的数据库,收费的。
*MySQL数据库 小型数据库,免费开源的。被Qracle收购了(在6.x版本下开始收费了)
*SQLServer 微软的数据库
*DB2 IBM公司产品,大型的数据库,收费的。
*SyBASE 退出了历史的舞台。PowerDigener(数据库的设计的工具)
1、MySQL数据库的卸载
*先找到MySQL的安装路径,找到my.ini配置文件。
*[一般安装路径]basedir="C:/Program Files(x86)/MySQL/MySQL
Server 5.5/" --MySQL安装路径(my.ini没有删除)
*basedir="C:/ProgramData/MySQL/MySQL
Server 5.5/Data/" --MySQL数据存放位置(手动删除)
*直接通过控制面板卸载程序。
2、安装MySQL
*安装的路径中不能有中文和空格。
3、进行测试
*cmd --输入mysql -u root -p --回车--输入密码--进入MySQL的服务器。
1、总结:一个数据库的服务器中包含多个数据库,一个数据库中有多张表,一个表中包含多个字段(字段和JavaBean的属性是对应),表中存放是数据,一行数据和一个JavaBean实体对象是对应的。
1、Structured Query Language,结构化查询语言
2、SQL非过程性的语言
*过程性的语言:依赖上一条或者几条语句执行。
*非过程性的语言:一条语言,就对应一个返回结果。
3、SQL语言是基础
*在Oracle使用自己的语言,PL/SQL只能在Oracle来说使用。
1、DDL 数据定义语言
*创建数据库 创建表 创建视图 创建索引 修改数据库 删除数据库 修改表 删除表
*create --创建 alter --修改 drop--删除
2、DML 数据操作语言
*操作数据 插入数据(insert添加) 修改数据(update更新) 删除数据(delete)
3、DCL 数据控制语言
*if else while
4、DQL 数据查询语言
*从表中查询数据(select)
1、创建数据库的语法
*基本的语法:create database 数据库名称;
*正宗的语法:create database 数据库名称 character set 编码 collate 校对规则;
2、校对规则(了解):决定当前数据库的属性。
创建一个名称为my1的数据库。
*create database my1;
创建一个使用utf-8字符集的my2数据库。
*create database my2 character set 'utf-8';
创建一个使用utf-8字符集,并带校对规则的my3数据库。
*create database my3 character set 'utf-8' collate 'utf8_bin';
1、show database; --查看所有的数据库
2、use 数据库名称;(*****) --使用数据库
3、show create database 数据库名称; --查询数据库的建的信息
4、select database(); --查询当前正在使用的数据库
1、语法:
create table 表名称(
字段1 类型(长度)约束,
字段2 类型(长度)约束,
字段3 类型(长度)约束
);
2、注意:
*创建表的时候,后面用小括号,后面分号。
*编写字段,字段与字段之间使用逗号,最后一个子段不能使用逗号。
*如果声明字符串数据的类型,长度是必须指定的。
*如果不指定数据长度,有默认值的。int类型的默认长度是11
3、创建一张表结构(员工表练习)
create table employee(
id int,
name varchar(30),
gender char(5),
birthday date,
entry_date date,
job carchar(50),
salary double,
resume text
);
4、执行SQL语句
*查询当前正在使用的数据库 select database();
*选择你要使用的数据库 use 数据库名;
*执行创建表的SQL语句。
5、使用desc employee;查询表的信息
1、字符串型(重点)
VARCHAR(用的比较多):长度是可变的。
例子:name varchar(8),存入数据hello,存入进去之后,name字段长度自动变成了5.
CHAR:长度是不可变的。
例子:name char(8)存入数据hello,用空格来不全剩余的位置。
2、大数据类型(不常用)
BLOB:字节(电影 mp3)
TEXT:字符(文本的内容)
3、数值型(重点)
TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
4、逻辑性
BIT
在Java中是true或者false
在数据库bit类型(1或者0)
5、日期型(重点)
DATE :只包含日期(年月日)
TIME :只包含时间(时分秒)
DATETIME :包含日期和时间。如果插入数据的时候,字符值为空,字段的值就是空了。
TIMESTAMP:包含日期和时间。如果插入数据的时候,设置字段的值为空,默认获取当前的系统的时候,把时间保存到字段中。
1、约束的好处:保证数据的完整性。
2、主键约束(重要)代表记录的唯一标识。
*关键字:primary key 通过该关键字声明某一列为主键。
*唯一 值就不能相同
*非空 值也不能为空
*被引用 (和外键一起来使用)
3、唯一约束
*声明字段值是唯一的。使用关键字 unique
4、非空约束
*声明字段的值是不能空的。 not null
查看表:
1、查询所有的表结构,前提条件,先切换到数据库中。
*show tables;
2、查询表结构的详细的信息
*desc 表名称;
3、查看表结构定义的信息
*show create table 表名称;
删除表:
1、删除表结构
*drop table 表名称;
1、添加一个新的字段
*alter table 表名称 add 字段名称 数据类型(长度)约束;
2、修改字段的数据类型、长度或者约束
*alter table 表名称 modify 字段名称 数据类型(长度)约束;
3、删除某一个字段
*alter table 表名称 drop 字段名称;
4、修改字段的名称
*alter table 表名称 change 旧字段 新字段 数据类型(长度)约束;
5、修改表的名称
*rename table 旧表名 to 新表名;
6、练习
*在员工表的基础上增加一个image列。
alter table emp add image varchar(30);
*修改job列,使其长度为60。
alter table emp modify job varchar(60);
*删除gender列。
alter table emp drop gender;
*表名改为user。
rename table emp to user;
*列名name修改为username。
alter table user change name username varchar(30);
1、添加数据,使用insert关键字来添加数据
*insert into 表(字段1,字段2,字段3)valuse(值1,值2,值3);---向表中的指定的字段中添加值
*insert into 表 values (值1,值2,值3...); ---向表中的所有的字段添加值
2、注意事项:
*插入的数据与字段数据的类型相同
*数据的大小应该在规定的范围内
*数据中的数据的列的位置和字段位置是相同的
*字符串和日期类型的数据,必须要使用单引号括起来
1、插入中文,会产生乱码的问题。
2、怎么产生?怎么解决?
*解决的方案,修改MySQL客服端的编码就可以了。改成GBK
3、修改MySQL客户端的编码
*先把MySQL服务器停止
*找到MySQL安装的路径,找到my.ini的配置文件
*修改客户端的编码,改成gbk
[client]
port=3306
[mysql]
default-character-set=gbk
*重启动MySQL的服务
1、修改数据,使用update关键字来完成修改数据
*update 表名称 set 字段1=值1,字段2=值2 where 条件;
*修改字段1和字段2的值
*如果没有where的关键字,说明修改的默认所有的记录
*如果有where的关键字,修改的是符合条件的记录
2、注意
*如果要是没有where的条件子句,默认是修改所有的数据。
*如果有where的条件子句,修改的符合条件的数据。
1、删除语法的语法
*delete from 表 where 条件;
*如果不加where,默认删除所有的数据
*如果添加where条件,删除符合条件的数据
2、删除所有的数据
*delete from 表;
*一行一行的数据
*支持事物的操作。事物是数据库中的特性。
*truncate 表;
*先把整个表删掉(数据也删除了),创建一个与原来一模一样的表(表里没有数据【空表】)
3、例如:
*删除表中名称为‘tom’的记录。
*delete from user where username = ‘tom’;
*删除表中所有记录。
*添加数据
*start transaction;
*delete from user where username = ‘tom2’;
*rollback; --恢复所有表中数据
*使用truncate删除表中记录。
*truncate user;
查询语句的语法
*select * from 表; --默认查询所有的字段的数据
*select 字段1,字段2,字段3 from 表; --查询指定的字段的数据
*DISTINCT --去除重复的关键字
*可以对查询的列进行运算
*查询语句中可以使用as的关键字,起别名。
*别名的真正的用法,采用的多表的查询,为了区分每张表,表起个别名。
*as的关键字可以省略不限。中间需要使用空格
*一般都是给表来起别名
*select s.username,s.math from stu s;
*select s.username,u.username from stu s,user u;
*使用where的条件语句,进行查询条件的过滤
1、常用的符号
* > < <= >= <>(不等于)
*in --代表的范围。
* select * from stu where math = 88; ---查询一条数据,条件是数学=88
* select *from stu where math in(18,88,90) ---查询的结果可能是多条数据,数学的成绩
需要在in值的范围内
*like ---模糊查询
*like关键字的值的写法
* select * from stu where username like '张_';----使用占位符,结果:张飞,张三,张x,张翼德(不符合)
* select *from stu where username like '张%'; ----使用%占位符,结果是姓张的都会查询出来
* like '%张'; ----结果:以张结尾的,飞张 医德张
* like '%张%'; ----结果:只要包含张的就可以 张 张飞 医德张
*总结like的关键字
*条件需要使用单引号
*需要使用占位符
*_ --代表的一个位置
*% --代表的多个位置
*and --与
*or --或
*not --非
*between...and
1、语法
*order by 字段 asc | desc;
*asc --代表升序(默认值)
*desc --代表降序
2、注意
*order by 自己放在select的语句末尾。
*eg:select * from xx where xx order by xx;
1、什么是聚集函数:Excel表格。求数量,求和,平均值,最大值,最小值。
2、聚集函数操作的都是某一列的数据。
3、聚集函数
*count()---求数量
例如:select count(*)| count(列名)from 表; --某一列数据行的总数
*sum() ---求某一列数据的和
例如:select sum(列名)from 表; --某一列数据行的和
注意:没有sum(*),求的某一列,sum对数值类型起作用。
4、总结
*聚集函数、是函数,不要忘记编写()
*计算都是某一列的数据
*聚集函数
*count() --求数量
*sum() --求和
*avg() --平均值
*max() --最大值
*min() --最小值
1、分组产生效果?聚集函数与分组效果。
2、select * from stu; --查询所有数据。默认是一组。
3、可以使用关键字 group by sex 根据字段进行分组。
*注意
*使用where的条件,如果有分组,where的条件是分组之前的条件。
*新的关键字,having关键字进行分组的条件过滤。
*总结
*where关键字后不能使用聚集函数,而是having可以使用聚集函数!!
1、可以把某一列字段声明主键,这一列的数据有如下特点
*唯一
*非空
*被引用 --当前主键的列,作为一条记录的标识。
2、声明主键
*使用关键字 primary key 声明某一个字段为主键。
3、主键的自动增长
*主键的值特点,可以把主键的值交给数据库去维护。
*自动增长只能使用int和bigint类型
*通过关键字 auto_increment
*演示自动增长
drop table person;
create table person(
id int primary key auto_increment,
username varchar(20)
);
*添加数据的时候
*insert into person values (null,‘美美’);
*insert into person values (null,‘懒懒’);
*insert into person values (2,‘小花’);
*如果删除了一条记录
*delete from person where id = 2;
4、开发中,主键基本上是必须要设置的。
1、唯一的约束
*可以把某个字段声明成唯一的值。
*使用该关键字 unique
2、非空
*可以把某个字段声明成非空的
*值是不能为空值。
*使用关键字 not null
*外键的约束:目的保证表结构中的数据的完整性!!
1、模拟的过程
2、有一个部门表,还有一个员工表。一个部门下有多个员工。
3、直接删除部门,程序是可以的,但是不合理。通过设置外键的约束来避免这一类的问题的发生。数据要保证完整性!!
*一对多
*在多方表中,创建一个新的字段,作为当前表的外键,指向一方表的主键。
*多对多
*先创建一张中间表,中间表中至少包含2个字段,两个字段作为当前中间表的外键,指向原来多对多表的主键。
*一对一
*一对一,一般不处理,放在同一张表中就可以。
*前提条件:两个表有联系,通过外键关联。
1、普通内连接
*语法: 关键字 ... inner join ... on 条件;
*注意:
*在 inner join关键字之前写表1
*在 inner join关键字以后写表2
*on的后面写条件:(表1是dept,表2是emp)dept.did = emp.dno
*语句: select * from dept inner join emp on dept.did = emp.dno;
2、隐式内连接(用的最多)
*语法:select...from 表1,表2 where 表1.字段 = 表2.字段;
*语句:select * from dept,emp where dept.did = emp.dno;
*别名:select * from dept d,emp e where d.did = e.dno;
*指定字段:select d.dname,e.ename,e.sal from dept d,emp e where d.did = e.dno;
1、左外连接(左连接)
*语法: ...表1 left outer join 表2 on 表1.字段 = 表2.字段
*语句: select * from dept left outer join emp on dept.did = emp.dno;
*特点:看左表,默认把左表中全部数据都查询出来,再查询出有关联的数据。
2、右外连接(右连接)
*语法:...表1 right outer join 表2 on 表1.字段 = 表2.字段
*语句: select * from dept right outer join emp on dept.did = emp.dno;
1、笛卡尔积
*两个结果的乘积,数据是重复,目的:去除掉重复的数据
2、需要使用多表的查询
*内连接
*普通内连接
*表1 inner join 表2 on 主键和关键关联
*隐式内连接
*select * from 表1,表2 where 条件;
*外连接
*左外连接
*表1 left outer join 表2 on
*右外连接
*表1 right outer join 表2 on
*如果数据正常的话,不管是内连接和外连接,查询的结果都是一样的。
1、内连接查询的结果都是有关系的数据
2、左连接,先看SQL语句中哪个表是左表,把左表中的数据全部都查询出来,和有关系的数据也会查询出来。
3、右连接,先SQL语句中的那个表是右表,把右表中的数据全部查询出来,和有关系数据查询出来。
*eg:
*内连接
*select * from dept d,emp e where d.did = e.dno;
*查询的结果都是主外键关联的数据
*左连接
*select * from dept left outer join emp on dept.did = emp.dno;
*把左表中所有的数据全部都查询出来和有关联的数据
*右连接
*select * from dept right outer join emp on dept.did = emp.dno;
*把右表中所有的数据全部都查询出来和有关联的数据
1、子查询,嵌套查询,一个select语句不能查询出结果的,可以通过多个select语句来查询结果。
2、例子:查询出英语成绩大于英语平均分的同学?
*先计算出英语的平均分(select avg(english)from stu;)
*再编写select语句
*select username,english from stu where english >(select avg (english)from stu);