java与MySQL数据库详细基础笔记

                                      学习心得

一、专业复习

      1.操作数据库

      (1)创建数据库

CREATE  DATABASE  [IF NOT EXISTS] db_name [create_specification[, create_specification] ...]

              create_specification:   

[DEFAULT] CHARACTER SET charset_name  |   [DEFAULT] COLLATE collation_name

            ~创建一个名称为mydb1的数据库。

                create database mydb1;

            ~创建一个使用gbk字符集的mydb2数据库。

                create database mydb2 character set gbk;

            ~创建一个使用utf8字符集,并带校对规则的mydb3数据库。

                create database mydb3 character set utf-8collate utf8_bin;

      (2)查看数据库

            显示数据库语句:

                  SHOW DATABASES

            显示数据库创建语句:

                  SHOW CREATEDATABASE db_name

                   ~查看当前数据库服务器中的所有数据库

                  show databases;

             ~查看前面创建的mydb2数据库的定义信息

                  show createdatabase mydb3;

      (3)修改数据库

ALTER DATABASE  [IF NOT EXISTS]db_name  [alter_specification [, alter_specification] ...]

            alter_specification:   

 [DEFAULT] CHARACTER SET charset_name |   [DEFAULT] COLLATE collation_name

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

            alter database mydb2character set utf8;

      (4)删除数据库

            DROP DATABASE  [IF EXISTS] db_name

           

            ~删除前面创建的mydb1数据库 drop databasemydb1;

            drop database mydb1;

      (5)选择数据库

            进入数据库:use db_name;

            查看当前所选的数据库: selectdatabase();

2.操作表

      (1)创建表

            CREATE TABLE table_name

            (

                  field1  datatype,

                  field2  datatype,

                  field3  datatype,

            )[character set 字符集] [collate 校对规则]

            field:指定列名 datatype:指定列类型

     

            ~创建一个员工表employee

                  create tableemployee(

                       id intprimary key auto_increment,

                       namevarchar(20) unique,

                       gender bitnot null,

                       birthdaydate,

                       entry_datedate,

                       jobvarchar(40),

                       salarydouble,

                       resume text

                  );

      (2)查看表

            查看表结构:desc tabName

            查看当前数据库中所有表:show tables

            查看当前数据库表建表语句 show createtable tabName;

      (3)修改表

ALTER TABLE table  ADD/MODIFY/DROP/CHARACTER SET/CHANGE  (column datatype [DEFAULT expr][, columndatatype]...);

            *修改表的名称:rename table 表名 to 新表名;

            ~在上面员工表的基本上增加一个image列。

                  alter tableemployee add image blob;

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

                  alter tableemployee modify job varchar(60);

            ~删除gender列。

                  alter tableemployee drop gender;

            ~表名改为user。

                  rename tableemployee to user;

            ~修改表的字符集为gbk

                  alter table usercharacter set gbk;

            ~列名name修改为username

                  alter table userchange name username varchar(20);

      (4)删除表

            DROP TABLE tab_name;

            ~删除user表

                  drop table user;

//查看MySQL服务系统属性          

mysql> showvariables like 'character%';

+--------------------------+------------------------------------------------+

|Variable_name            | Value                                          |

+--------------------------+------------------------------------------------+

|character_set_client     | gbk                                            |

|character_set_connection | gbk                                            |

|character_set_database   | utf8                                           |

|character_set_filesystem | binary                                         |

|character_set_results    | gbk                                            |

|character_set_server     | utf8                                           |

|character_set_system     | utf8                                           |

|character_sets_dir       |D:\Software\ProgramFiles\mysql\share\charsets\ |

+--------------------------+------------------------------------------------+

//改变当前客户端的编码解码集

mysql> setnames utf8;

Query OK, 0 rowsaffected (0.00 sec)

8 rows in set(0.00 sec)

3.操作表记录CRUD

      (1)INSERT

            INSERT INTO table[(column [, column...])] VALUES (value [, value...]);

            插入的数据应与字段的数据类型相同。

数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。

            在values中列出的数据位置必须与被加入的列的排列位置相对应。

            字符和日期型数据应包含在单引号中。

            插入空值:不指定或insert into tablevalue(null)

            如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表

            ~使用insert语句向表中插入三个员工的信息

insert into employee(id,name,gender,birthday,entry_date,job,salary,resume)values (null,'张飞',1,'1999-09-09','1999-10-01','打手',998.0,'老大的三弟,真的很能打');

insert into employee values (null,'关羽',1,'1998-08-08','1998-10-01','财神爷',9999999.00,'老大的二弟,公司挣钱都指着他了');

insert into employee values (null,'刘备',0,'1990-01-01','1991-01-01','ceo',100000.0,'公司的老大'),(null,'赵云',1,'2000-01-01','2001-01-01','保镖',1000.0,'老大贴身人');

      (2)UPDATE

UPDATE      tbl_nameSET col_name1=expr1 [, col_name2=expr2 ...] [WHEREwhere_definition]  

            UPDATE语法可以用新值更新原有表行中的各列。

            SET子句指示要修改哪些列和要给予哪些值。

WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行

            ~将所有员工薪水修改为5000元。

                  update employeeset salary = 5000;

            ~将姓名为’张飞’的员工薪水修改为3000元。

                  update employeeset salary = 3000 where name='张飞';

            ~将姓名为’关羽’的员工薪水修改为4000元,job改为ccc。

                  update employeeset salary=4000,job='ccc' where name='关羽';

            ~将刘备的薪水在原有基础上增加1000元。 

                  update employeeset salary=salary+1000 where name='刘备';

           

             

      (3)DELETE

           

            如果不使用where子句,将删除表中所有数据。

            Delete语句不能删除某一列的值(可使用update)

使用delete语句仅删除记录,不删除表本身。如要删除表,使用drop table语句。

同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。

            外键约束

删除表中数据也可使用TRUNCATE TABLE 语句,它和delete有所不同,参看mysql文档。

            delete fromtbl_name [WHERE where_definition]   

            ~删除表中名称为’张飞’的记录。

                  delete fromemployee where name='张飞';

            ~删除表中所有记录。

                  delete from employee;

            ~使用truncate删除表中记录。

                  truncate tableemployee;

      (4)SELECT

            ~1.基本查询

            SELECT [DISTINCT]*|{column1, column2. column3..} FROM                     table;

~查询表中所有学生的信息。

            select * from exam;

            ~查询表中所有学生的姓名和对应的英语成绩。

            select name,english fromexam;

            ~过滤表中重复数据

            select distinct englishfrom exam;

            ~在所有学生分数上加10分特长分显示。

            select name ,math+10,english+10,chinese+10 from exam;

            ~统计每个学生的总分。

            select name,english+math+chinese from exam;

            使用别名表示学生总分。

            select name as 姓名,english+math+chinese as 总成绩 from exam;

            select name 姓名,english+math+chinese 总成绩 from exam;

            select name english fromexam;

            ~2.使用where子句进行过滤查询

            ~查询姓名为张飞的学生成绩

            select * from exam wherename='张飞';

            ~查询英语成绩大于90分的同学

            select * from exam whereenglish > 90;

            ~查询总分大于230分的所有同学

select name 姓名,math+english+chinese 总分 from exam wheremath+english+chinese>230;

            ~查询英语分数在 80-100之间的同学。

            select * from exam whereenglish between 80 and 100;

            ~查询数学分数为75,76,77的同学。

            select * from exam wheremath in(75,76,77);

            ~查询所有姓张的学生成绩。

            select * from exam wherename like '张%';

            select * from exam wherename like '张__';

            ~查询数学分>70,语文分>80的同学。

            select * from exam wheremath>70 and chinese>80;

            ~3.使用order by关键字对查询结果进行排序操作

                    SELECT column1, column2.column3.. FROM    table where... order bycolumn asc|desc;

            asc 升序 -- 默认就是升序

            desc 降序

            ~对语文成绩排序后输出。

            select name,chinese fromexam order by chinese desc;

            ~对总分排序按从高到低的顺序输出

select name 姓名,chinese+math+english 总成绩 from exam orderby 总成绩 desc;

            ~对姓张的学生成绩排序输出

select name 姓名,chinese+math+english 总成绩 from exam where namelike '张%' order by 总成绩 desc;

            ~4.聚合函数

             (1)Count -- 用来统计符合条件的行的个数

            ~统计一个班级共有多少学生?

            select count(*) fromexam;

            ~统计数学成绩大于90的学生有多少个?

            select count(*) fromexam where math>70;

            ~统计总分大于230的人数有多少?

            select count(*)from examwhere math+english+chinese > 230;

             (2)SUM -- 用来将符合条件的记录的指定列进行求和操作

             ~统计一个班级数学总成绩?

             select sum(math) from exam;

             ~统计一个班级语文、英语、数学各科的总成绩

             select sum(math),sum(english),sum(chinese)from exam;

             ~统计一个班级语文、英语、数学的成绩总和

             selectsum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

             在执行计算时,只要有null参与计算,整个计算的结构都是null

             此时可以用ifnull函数进行处理

             ~统计一个班级语文成绩平均分

             select sum(chinese)/count(*) 语文平均分 from exam;

             (3)AVG -- 用来计算符合条件的记录的指定列的值的平均值

             ~求一个班级数学平均分?

             select avg(math) from exam;

             ~求一个班级总分平均分?

             select avg(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0))from exam;

             (4)MAX/MIN -- 用来获取符合条件的所有记录指定列的最大值和最小值

             ~求班级最高分和最低分

             selectmax(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;

             select min(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0))from exam;

            ~5.分组查询

             ~对订单表中商品归类后,显示每一类商品的总价

             select product,sum(price) from orders group byproduct;

             ~询购买了几类商品,并且每类总价大于100的商品

select product 商品名,sum(price)商品总价 from ordersgroup by product having sum(price)>100;

            where子句和having子句的区别:

            where子句在分组之前进行过滤having子句在分组之后进行过滤

            having子句中可以使用聚合函数,where子句中不能使用

            很多情况下使用where子句的地方可以使用having子句进行替代

            ~查询单价小于100而总价大于150的商品的名称

select product from orders where price<100group by product having sum(price)>150;

            ~~sql语句书写顺序:

            select from wheregroupby having orderby

            ~~sql语句执行顺序:

            from where select groupby having order by   

            ~~备份恢复数据库

            备份:   在cmd窗口下 mysqldump -uroot -p dbName>c:/1.sql

            恢复:   方式1:在cmd窗口下 mysql -u root -pdbName<c:/1.sql

            方式2:在mysql命令下, source c:/1.sql

要注意恢复数据只能恢复数据本身,数据库没法恢复,需要先自己创建出数据后才能进行恢复.

4.多表设计多表查询

      1.外键约束

表是用来保存显示生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,向这种约束就叫做外键约束

      create table dept(

      id int primary keyauto_increment,

      name varchar(20)

      );

      insert into dept values(null,'财务部'),(null,'人事部'),(null,'销售部'),(null,'行政部');

      create table emp(

      id int primary keyauto_increment,

      name varchar(20),

      dept_id int,

      foreign key(dept_id)references dept(id)

      );

insert into empvalues(null,'奥巴马',1),(null,'哈利波特',2),(null,'本拉登',3),(null,'朴乾',3);

      2.多表设计

      一对多:在多的一方保存一的一方的主键做为外键

      一对一:在任意一方保存另一方的主键作为外键

      多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系

      3.多表查询

      笛卡尔积查询:

将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用

      select * from dept,emp;

      内连接查询:查询的是左边表和右边表都能找到对应记录的记录

      select * from dept,emp wheredept.id = emp.dept_id;

      select * from dept inner joinemp on dept.id=emp.dept_id;

外连接查询:左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录

      select * from dept left joinemp on dept.id=emp.dept_id;

      右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录

      select * from dept right joinemp on dept.id=emp.dept_id;

全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左表表没有的记录

      select * from dept full joinemp on dept.id=emp.dept_id; -- mysql不支持全外连接

      可以使用union关键字模拟全外连接:

      select * from dept left joinemp on dept.id = emp.dept_id

      union

      select * from dept right joinemp on dept.id = emp.dept_id;

         

   学习心得:

   1.温故而知新可以为师也

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值