MySQL

来源:互联网 发布:apache 无法访问 编辑:程序博客网 时间:2024/06/06 19:10

什么是 ADO
ADO 是一个访问数据库中数据的编程接口

关系型数据库:存放实体之间的关系
实体:对应了数据库的一张表
数据库存储结构:
数据存储在表中,一行记录对应一个实体示例,一张表中可以有很多行记录
一个应用对应一个数据库

SQL的分类    DDL:数据定义语言  create(创建表),drop(删除表),alter(修改表的字段)..------------>对表进行操作,    DCL:数据控制语言  grant,if…    DML:数据操纵语言  insert,update,delete…    DQL:数据查询语言  select

数据库操作
查看:
 查看数据库服务器中所有的数据库:
show databases;
查看某个数据库的定义信息:
show create database 数据库名称;
创建数据库
create database 数据库名称 [character set 字符集 collate 字符集校对规则]
删除数据库
drop database 数据库名
修改数据库
alter database 数据库名称 character set 字符集 collate 校对规则;
切换数据库:
use 数据库名称;
表操作
1.创建表
create table 表名称(字段名称 字段类型(长度)约束,字段名称 字段类型(长度)约束)
{
字段类型:
一个实体对应一个表,一个实体属性对应表的一个字段。
Java中的类型 MySQL中的类型
byte/short/int/long tinyint/smallint/int/bigint
float float
double double
boolean bit
char/String char和varchar类型
—————
char和varchar的区别:
char代表是固定长度的字符或字符串。

定义类型char(8),向这个字段存入字符

不用管长度 : int double float date 管长度: char varchar

约束:        约束作用:保证数据的完整性       单表约束分类:       主键约束:primary key 主键约束默认就是 唯一 非空的    auto_increment,       唯一约束:unique       非空约束:not null    {    建表语句:us            create database web_test1;            use web_test1;            create table user(            id int primary key auto_increment,            username varchar(20) unique,            password varchar(20) not null,            age int,            birthday date            );            }           }2.查看表{    查看某个数据库下的所有的表

 语法:show tables;
查看某个表的结构信息
 语法:desc 表名;
}
3.删除表{
drop table 表名

    }4.修改表{    修改表:添加列

 alter table 表名 add 列名 类型(长度) 约束;

    a.修改表:修改列类型,长度和约束

 alter table 表名 modify 列名 类型(长度) 约束;

    b.修改表:删除列(要删除的列一定要存在)

 alter table 表名 drop 列名;
c.修改表:修改列名称
 alter table 表名 change 旧列名 新列名 类型(长度) 约束;
d.修改表:修改表名
rename table 表名 to 新的表名;
 e.修改表:修改表的字符集
 alter table 表名 character set 字符集;
}
5.添加表
{
语法:
 向表中插入某些列:insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…)
 向表中插入所有列:insert into 表名 values (值1,值2,值3…);
添加中文记录
show variables like ‘%character%’; –查看数据库中与字符集相关参数:
需要将MySQL数据库服务器中的客户端部分的字符集改为gbk。
找到MySQL的安装路径:my.ini文件,修改文件中[client]下的字符集
}

6.修改表记录查询{       insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…)        delete from user;        update 表名 set 列名=值,列名=值 [where 条件];        select [distinct] *|列名 from 表 [条件];       1.删除表的记录,指的是删除表中的一行记录。

 2.删除如果没有条件,默认是删除表中的所有记录。

删除某一条记录    delete from user where id = 2;删除表中的所有记录    delete from user;    注意:{    删除表中的记录有两种做法:       delete from user;       删除所有记录,属于DML语句,一条记录一条记录删除。事务可以作用在DML语句上的       truncate table user;       删除所有记录,属于DDL语句,将表删除,然后重新创建一个结构一样的表。事务不能控制DDL的        }}

查表{
语法:select [distinct] *|列名 from 表 [条件];
查询所有学生考试成绩信息
select * from exam;
————————————-
查询所有学生的姓名和英语成绩
select name,english from exam;
————————————-
查询英语成绩信息(不显示重复的值)
select distinct english from exam;
————————————-
查看学生姓名和学生的总成绩
select name,english+chinese+math from exam;
—————————————–
别名查询
select name,english+chinese+math as sum from exam;
—————————————–
条件查询
{
 使用where子句
 > , < , >= , <= , <> ,=
 like:模糊查询
 in:范围查询
 条件关联:and , or ,not
}
—————————
查询李四学生的成绩:
select * from exam where name = ‘李四’;
—————————
查询名称叫李四学生并且英文大于90分
select * from exam where name = ‘李四’ and english > 90;
———————————
 查询姓李的学生的信息
like可以进行模糊查询,在like子句中可以使用或者%作为占位符。只能代表一个字符,而%可以代表任意个字符。
* like ‘李_’ :名字中必须是两个字,而且是姓李的。
* like ‘李%’ :名字中姓李的学生,李子后可以是1个或任意个字符。
* like ‘%四’ :名字中以四结尾的。
* like ‘%王%’ :只要名称中包含这个字就可以。
select * from exam where name like ‘李%’;
————————————-
查询英语成绩是69,75,89学生的信息
select * from exam where english in (69,75,89);
————————————–
}
排序查询{
 使用order by 字段名称 asc/desc;
 查询学生信息,并且按照语文成绩进行排序:
select * from exam order by chinese;
————————–
查询学生信息,并且按照语文成绩倒序排序:
select * from exam order by chinese desc;
——————————
 查询学生信息,先按照语文成绩进行倒序排序,如果成绩相同再按照英语成绩升序排序
select * from exam order by chinese desc,english asc;
———————————–
查询姓李的学生的信息,按照英语成绩降序排序
select * from exam where name like ‘李%’ order by english desc;
——————————————–
}
分组统计查询{
 聚合函数使用
 sum();
 获取所有学生的英语成绩的总和:
select sum(english) from exam;
————————————-
获取所有学生的英语成绩和数学成绩总和:
select sum(english),sum(math) from exam;
————————————–
查询姓李的学生的英语成绩的总和
select sum(english) from exam where name like ‘李%’;
————————————–
查询所有学生各科的总成绩:
select sum(english)+sum(chinese)+sum(math) from exam;
————————————
count();
 获得学生的总数
select count(*) from exam;
——————————-
获得姓李的学生的个数
select count(*) from exam where name like ‘李%’;
——————————-
max();
 获得数学成绩的最高分:
select max(math) from exam;
————————————-
min();
 获得语文成绩的最小值
select min(chinese) from exam;
————————————-
avg();
 获取语文成绩的平均值
select avg(chinese) from exam;
—————————————
}
分组查询{

 语法:使用group by 字段名称;

按商品名称统计,每类商品所购买的个数:    select product,count(*) from orderitem group by product;-----------------------------------按商品名称统计,每类商品所花费的总金额:    select product,sum(price) from orderitem group by product;-----------------------------------按商品名称统计,统计每类商品花费的总金额在5000元以上的商品    select product,sum(price) from orderitem  group by product having sum(price) > 5000;----------------------------------按商品名称统计,统计每类商品花费的总金额在5000元以上的商品,并且按照总金额升序排序    select product,sum(price) from orderitem  group by product having sum(price) > 5000 order by sum(price) asc;----------------------

总结:
S(select)… F(from)…W(where)…G(group by)…H(having)…O(order by);

}

//分2组:80以上和80以下的.每组个数
SELECT SUM(CASE WHEN math>=80 THEN 1 ELSE 0 END) AS “80分以上人数”,SUM(CASE WHEN math<80 THEN 1 ELSE 0 END) AS “80分以下人数” FROM student;


    insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…)    delete from user;    update 表名 set 列名=值,列名=值 [where 条件];    select [distinct] *|列名 from 表 [条件];

快速查询:
一般查询
SELECT * FROM 表名称
查询全部
SELECT DISTINCT 列名称 FROM 表名称
查询指定列
SELECT DISTINCT 列名称 FROM 表名称 用于返回唯一不同的值。
查询不重复值
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值(可以用 AND|| OR&&)

排序查询顺序:    SELECT 列名称,列名称 FROM 表名称 ORDER BY 列名称逆序:    SELECT 列名称,列名称 FROM FROM 表名称 ORDER BY 列名称(参考列) descLIKE 操作符    ------->通配符            % 替代一个或多个字符             _ 仅替代一个字符 IN 操作符    IN 操作符允许我们在 WHERE 子句中规定多个值。        SELECT * FROM 表单名   WHERE 列表名 IN ('值1','值2')BETWEEN 操作符    操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。    SELECT * FROM 表名    WHERE 列表名 BETWEEN '列表值1' AND '列表值2'别名查询:

SELECT 列明 AS 别名, 列名2 AS 别名2 FROM 表名

外键: constraint 外键名称 foreing key(外键字段) reference 主键表名(主键字段)
当有了外键约束时:
添加先添加主表
删除,修改先修改副表.
级联操作
直接操作主表
级联修改:ON UPDATE CASCADE

级联删除:ON DELETE CASCADE

关联查询

内连接查询:(内连接用的最多,一定掌握)

多表查询规则:1确定查那几张表2确定哪些字段,3表与表之间的链接条件例如:    SELECT emName,deName FROM employee,dept WHERE employee.deptId=dept.id;        select 表1字段值,表2字段值 from 主表,副表 where(连接条件)    SELECT emName,deName FROM employee INNER JOIN dept ON employee.deptId=dept.id;        select 表1字段值,表2字段值 from 表1 INNER JOIN 表2 where(连接条件)别名查询    SELECT e.emName,d.deName FROM employee e INNER JOIN dept d ON e.deptId=d.id;

Join 和 Key
主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。
这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
(表1中定义主键)=(表2中的一列)
内连接
SELECT 表名.列表1, 表1.列表2, 表2.列表2名 FROM 表1, 表2 WHERE Persons.Id_P = Orders.Id_P
外链接
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
•JOIN: 如果表中有至少一个匹配,则返回行
•LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
•RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
•FULL JOIN: 只要其中一个表中存在匹配,就返回行

如果我们希望列出所有人的定购,

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName

关键字:
SQL INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

SELECT 表1.列名, 表1.列表名2, 表2.表2列表名 FROM 表1 INNER JOIN Orders ON 表1.主键列表名=表2.外键名 ORDER BY 表1.表1列名

    SQL LEFT JOIN 关键字

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName


JDBC
1.加载驱动
Class.forName(“com.mysql.jdbc.Driver”);
2.获得连接对象
Connection conn= DriverManager.getConnection(“jdbc:mysql://localhost:3306/web_02”, “root”, “123”);
3.=获得执行SQL语句的对象
Statement statement = conn.createStatement();

4.执行SQL语句(statement)
boolean execute(String sql);

   执行查询,    ResultSet executeQuery(String sql);    修改,添加,删除的SQL语句。    executeUpdate

ResultSet
{
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

}
 执行查询(执行select语句)。

int executeUpate(String sql);
 执行修改,添加,删除的SQL语句。

    void addBatch(String sql)     将给定的 SQL 命令添加到此 Statement 对象的当前命令列表     void clearBatch()     清空此 Statement 对象的当前 SQL 命令列表。 int[] executeBatch()     将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。 

5.1.1.1 ResultSet:结果集.
boolean next() throws SQLException
如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false
int getInt(int columnIndex) 以 Java 编程语言中 int 的形式获取此 ResultSet 对象的当前行中指定列的值。

http://localhost:8080/

JDBC
一.
{
无预处理
a.驱动
b.连接对象 Connection conn=null;
c.sql执行语句对象 Statement pre=null;
d.执行并处理结果 ResultSet rs=null;
e.释放资源
有预处理
a.驱动
b.连接 Connection conn=null;
c.sql执行语句对象 PreparedStatement pre=null;
d:预处理 pre=conn.prepareStatement(sql);
f:设置参数 pre.setXXX(index,value)
g:执行并处理结果 ResultSet rs =pre.executeQuery()//int num= pre.executeUpdate()
e.释放资源

批量处理:.......    预编译    PreparedStatement   pstmt=conn.prepareStatement(sql);    添加到批量处理    pstmt.addBatch();    预编译    添加到批量处理    ..n...    执行批量处理    pstmt.executeBatch();    清空批处理:    pstmt.clearBatch();    }    ...    ...    ...释放资源

二.事务管理
Connection conn= JDBCUtils.getConnection();
开启事务
conn.setAutoCommit(false);
try{
A开始转账
B:收到转账
提交事务:
conn.commit();
}catch(SQLException e1){
//回滚事务
conn.rollback();
}
释放资源
三.连接池(装有多个Connection的容器)
{
Druid的使用:
①自定义连接
//创建连接池
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(“com.mysql.jdbc.Driver”);
dataSource.setUrl(“jdbc:mysql:///web_02”);
dataSource.setUsername(“root”);
dataSource.setPassword(“123”);
———-
获得Connection
Connection conn=dataSource.getConnection()
…………..

        释放资源    ②二配置文件导入    ......    Properties properties = new Properties();    properties.load()    //导入后获得DataSource    //创建连接池并使用连接池:    DataSource dataSource= DruidDataSourceFactory.createDataSource(properties);    //获得Connection进行后续操作    ..........C3P0连接池的使用[重点]    ①自定义连接    ...........    //创建连接池    ComboPooledDataSource dataSource = new ComboPooledDataSource();    dataSource.setDriverClass("com.mysql.jdbc.Driver");    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/web_02");    dataSource.setUser("username");    dataSource.setPassword("password");    //从连接池获得Connection对象    Connection conn = dataSource.getConnection();        ...        ...        ...    释放资源②二配置文件导入c3p0-config.xml:    <attribute name="JndiName">java:PooledDS</attribute>    <attribute name="JdbcUrl">jdbc:mysql://localhost:3306/web_02</attribute>    <attribute name="DriverClass">com.mysql.jdbc.Driver</attribute>    <attribute name="User">root</attribute>    <attribute name="Password">123</attribute>//创建连接池默认去类路径下查找c3p0-config.xml    ComboPooledDataSource dataSource = new ComboPooledDataSource();从连接池子获得Connection对象    Connection conn = dataSource.getConnection();     .     .     .释放资源}

四.DBUtils的工具类 对JDBC的简单封装,而且没有影响性能。
1.导jar包
2.QueryRunner对象:核心运行类
构造
①public class QueryRunner extends AbstractQueryRunner
public QueryRunner()
public QueryRunner(DataSource ds) //DataSource来自于连接池
方法:
update(String sql,Object … params)/Object … params中为语句中?所对应的值 /
执行给定的INSERT(插入),UPDATE(修改)或DELETE(删除) SQL语句。

T query(Connection conn,String sql,ResultSetHandler <T> rsh,Object ... params)/*Object ... params中为语句中?所对应的值    */    使用替换参数执行SQL SELECT查询。-------------------3.增删改{    JDBCUtils2工具类中只需要试用连接池获得DataSource就可以了,释放资源的都不需要    // 创建核心类:QueryRunner:        QueryRunner queryRunner = new QueryRunner(JDBCUtils2.getDataSource());    queryRunner.update("insert into account values (null,?,?)", "ddd",10000);    queryRunner.update("update account set name=?,money=? where id =?", "eee",20000,4);    queryRunner.update("delete from account where id = ?", 3);  }-------------查找    QueryRunner类有以下查询方法:    T query(Connection conn,String sql,ResultSetHandler <T> rsh,Object ... params)/*Object ... params中为语句中?所对应的值    */        使用替换参数执行SQL SELECT查询。3

**重点,对得到的结果进行遍历
ArrayHandler,转换为Object []的ResultSetHandler实现ArrayListHandler,
BeanHandler,一行记录,一个标准类对象 BeanListHandler,多行记录得到一个list集合.集合中一个元素是一行记录
ColumnListHandler 将一个ResultSet列转换为对象列表 KeyedHandler,
MapHandler, 一行记录,一个MAp集合 MapListHandler, 多行记录得到一个list集合.集合中一个元素是一行记录
ScalarHandler ResultSetHandler实现将一个ResultSet列转换为Object。 这个类是线程安全的。