mysql笔记一

一:数据库简介

1.什么是数据库,数据库有什么作用?

       数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。

2.关系数据库:

      是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据。

3.数据库管理系统(DBMS)

        我们通常将数据库管理系统称为数据库,当我们安装了数据库(数据库服务器),就可以在数据库服务器中创建数据库,每个数据库中还可以包含多张表。

数据库中的表就是一个多行多列的表格。在创建表时,需要指定表的列数,以及列名称,列类型等信息。而不用指定表格的行数,行数是没有上限的。

表中的列我们称之为字段,表中的行我们称之为记录。

那么用我们熟悉的java程序来与关系型数据对比,就会发现以下对应关系。

类-------表

类中属性-------表中的字段

对象--------记录。

4.关于开启与关闭mysql服务

开启  net start mysql

关闭  net stop mysql

5.操作mysql数据库

1.mysql默认的客户端

默认的客户端连接的是 localhost   3306这个数据库服务器.

2.在命令行下操作

1. mysql -u root -p 回车

输入密码  root

这种方式,默认连接的也是localhost  3306这个数据库服务器

-u 代表用户

-p 代表

2. mysql -u root -h localhost -P 3306 -p

输入密码 root

-h 代表的是服务器的主机地址

-P 代表的是端口号

二:SQL

1.SQL是什么,它的作用是什么

结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统.

2.SQL分类

SQL一共分成四类,如下所示:

  1. 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等,例如创建、删除、修改:数据库、表结构等;
  2. 数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新,例如:增、删、改表记录;
  3. 数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户;
  4. 数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。

大家可能会对DDL和DML分的不太清楚,DDL是对数据库或表的结构进行操作,而DML是对表的记录进行操作(增、删、改)。以上四个分类,我们以后最常用的就是DDL、DML、DQL,其中,DQL是难点。

3.SQL语法

SQL的语法有以下要求:

4.常用语句

1.创建数据库

    1>使用默认的字符集与校对

     create database 数据库名;

  1. SQL语句可以单行或多行书写,以分号结尾;
  2. 可使用空格和缩进来增强语句的可读性;
  3. MySQL数据库的SQL语句不区分大小写,建议使用大写,例如:SELECT * FROM user。

     create database day_6;

    2>可以指定数据库字符

      create database 数据库名  character  set gbk;

      create database mydb2 character set utf8;

    3>可以指定数据库字符与校对

     create database 数据库名 character set 编码 COLLATE 校对;

    create database mydb3 character set utf8 collate utf8_general_ci;

2.查看数据库

 1>查看当前数据库服务器下所有数据库

    show databases;

  2>查看创建数据库的语句

    show create database 数据库名;

练习:

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

      show databases;

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

      show create database mydb2;

3.修改数据库

修改数据库操作我们很少使用,了解一下语法就可以。

修改数据库的编码集

alter database 数据库名称  character set 编码 collate 校对

练习:

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

     show create database mydb2;

     alter database mydb2 character set utf8 collate utf8_general_ci;

练习:

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

show create database mydb2;

alter database mydb2 character set utf8 collate utf8_general_ci;

4.删除数据库

 drop database 数据库名;

练习:

     删除前面创建的mydb1数据库

      drop database mydb1;

其它关于库的操作创建表时要切换到数据库

1.切换数据库

use 数据库名称;

2.查看当前所使用的事数据库

select database();

三.MySql

mysql中数据类型

MySQL与Java一样,也有数据类型,MySQL中的数据类型主要应用在列上。我们在定义表的时候对每一列的定义有列名和列类型。这个列类型就是我们今天要讲的数据类型。

以下是MySQL数据库常用的数据类型:

char与varchar区别?

char是一个定长字符串.指定长度不会随着内容的不足而改变

varchar是一个可变长度的字符串,它根据信息自动改变长度.(只在字符串长度小于指定长度情况下)

1.创建表与约束

    1>创建表

     创建表---使用默认的字符集与校对          

      create table 表名(

      字段1 类型,

      字段2 类型,

      .....

      );

     创建表--指定字符集与校对

      create table 表名(

     字段1 类型,

     字段2 类型,

      .....

      ) character set 字符集  collate 校对;

表名后面的内容需要使用“()”括起来,里面的内容是表结构,由列名和列类型组成,列名与列类型之间用空格隔开,每一列之间用逗号隔开,最后一列后面不需要加逗号,语句结束后需要加“;”。

2>约束

它是用于限定表中字段。

我们在mysql中会介绍5种约束(注意:数据库中一共有六种约束,而mysql只支持五种)

  1. 主键约束

主键是用于标识当前记录的字段。它的特点是非空,唯一。

在开发中一般情况下主键是不具备任何意义,只是用于标识当前记录。

创建主键:

1.在创建表时,在字段后面加上  primary key.

     create table tablename(

     id int primary key,

     .......

     )

2.也可以表创建的最后来指定主键 create table tablename(

    id int

    .......

   primary key(id)

   )

3.删除主键:alter table tablename drop primary key ;

    唯一约束

某一列的值不为重复可以使用唯一约束. unique  

    非空约束

      not null

     默认值约束

     default 值

     自动增长  

     auto_increment

扩展:

mysql :  auto_increment 自动增长

            sqlserver: identity(1,1)

                    oracle:sequence序列

 

表操作-查看修改删除表

      desc 表名;

     查看当前数据库下所有表

      show tables; 

     查看表的字符编码集

  1. 查看表结构

     show create table 表名;

   2.修改表

修改表的结构语法格式:alter table 表名 关键字 ….;

      关键字有以下几个:

1.add----添加列操作   alter table 表名  add 列名 类型;

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

3.drop --删除列  alter table 表名  drop 列名;

4.change--修改列名称  alter table 表名 change 旧列名  新列名  类型;

 

   1.修改表的名称

rename table 旧表名 to 新表名;

   2.修改表的字符编码集

alter table 表名 character set 字符集;

练习:

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

alter table user add image blob;

修改job列,使其长度为60。(修改列的类型

alter table user modify job varchar(60);

删除gender列。

alter table user drop gender;

表名改为employe。

rename table employee to employe;

修改表的字符集为utf8

alter table employee character set utf8;

列名name修改为username

alter table employee change column name username varchar(20);

alter table employee change name username varchar(20);

3.删除表

drop table 表名;

 

记录操作

insert操作

插入所有列值

insert into 表名(列名1,列名2, ...) values(列值1, 列值2, ...);

表名后面是当前表中所有字段名称

插入部分列值

: insert into 表名(列名1,列名2) values(列值1, 列值2);

表名后面是当前表中部分字段名称

批量插入:

insert into students values(3,"wangwu",1,17),(4,"lisi",0,18),(5,"zhangsi",0,18),(6,"zhangyi",0,18);

不指定列名

: insert into 表名 values(列值1, 列值2, ...);

  1. 没有给出要插入的列,那么表示插入所有列;
  2. 值的个数必须是该表的列的个数;
  3. 值的顺序,必须与表创建时给出的列的顺序相同。

 

插入操作注意事项

  1. 插入的数据应与字段的数据类型相同
  2. 数据的大小应该在列的长度范围内
  3. 在values中列出的数据位置必须与被加入的列的排列位置相对应。
  4. .除了数值类型外,其它的字段类型的值必须使用引号引起。
  5. 如果要插入空值,可以不写字段,或者插入 null.

注意:对于自动增长的列在操作时,直接插入null值即可.

update操作

下面语句会将指定字段的值全部修改

update 表名 set 字段名称=值;

如果要修改多个字段

update 表名 set 字段1名称=值 ,字段2名称=值,...;

字符需要加:单引号

数字:直接写

以上方式,进行修改,会将表中这个字段所有值都修改.

在实际开发中,对于修改操作,都是有条件修改.

update 表名 set 字段=值 ,... where 条件.

 

delete操作

delete操作是删除数据.

格式  delete from 表名.

这会将表中所有数据删除。在开发一般情况下有条件删除

delete from 表名 where 条件.

delete from 表名;如果没有指定条件,删除表中所有数据

 

关于删除表与删除表数据区别:

 

1.删除表   drop table 表名

2.删除表中记录

1.delete from 表名

2.truncate table 表名

 

关于delete 与truncate的区别?(笔试题)

 

1.delete是一行一行删除   truncate是将表结构销毁,再重新创建表结构.

如果数据比较多,truncate的性能高。

如果数据比较少,delet的性能高。

2.delete是dml语句  truncate dcl语句

 

delete是受事务控制. 可以回滚数据.

truncate是不受事务控制. 不能回滚.

select基本查询

select [distinct] [*] [列名,列名2] from 表名 [where 条件]

查询指定列

 select 字段 from 表名;

查询指定字段信息,如果要查询多个字段

 select 字段1,字段2,...from 表名;

查询所有列

select * from 表名;

查询表中所有字段.

注意:使用"*"在练习,学习过程中可以使用,在实际开发中,不建议使用。

去掉重复记录

select distinct 字段 from 表名;

distinct它的作用是去除重复.

使用别名

使用as 别名可以给表中的字段,表设置别名.

在查询中可以直接对列进行运算

我们在sql操作中,可以直接对列进行运算。

ifnull函数使用

在对数值类型的列做运算的时候,如果做运算的列的值为null的时,运算结果都为null,为了解决这个问题可以使用ifnull函数。

 

记录操作-where子句

我们在开发中,使用select操作,一般都是有条件查询,那以我们介绍一下关于where子句的使用

  格式 :select 字段  from 表名  where 条件;

where条件种类:

1.比较运算符

> >= < <= = !=(<>)

2.逻辑运算符

and  or not

3.between ...and

相当于 >= and <=

注意:between 后面的值必须是小值 and后面的是大值

4.in

可以比较多个值

5.like

模糊查询

通配符使用:

1.% 匹配多个

2._ 匹配一个

6.null值操作

 is null; 判断为空

 is not null; 判断不为空

练习:

  1. 查询所有计算机类商品信息

SELECT * FROM products WHERE category="计算机";

  1. 查询出商品价格大于90的商品信息

SELECT * FROM products WHERE price>90;

  1. 查询出商品总价大于10000的商品信息

SELECT * FROM products WHERE (price*pnum)>10000

  1. 查询出价格在100-200之间的商品信息

SELECT * FROM products WHERE price>=100 AND price<=200;

SELECT * FROM products WHERE price BETWEEN 100 AND price;

  1. 查询出商品价格是65,100或190的商品信息

SELECT * FROM products WHERE price=65 OR price=100 OR price=190;

SELECT * FROM products WHERE price IN(65,100,190);

  1. 查询出商品的名称中包含java的商品信息。

SELECT * FROM products WHERE NAME LIKE "%java%";

  1. 查询出书名是两个字的商品信息

SELECT * FROM products WHERE NAME LIKE "__";

  1. 查询出商品价格不为null商品信息

SELECT * FROM products WHERE price IS NOT NULL;

SELECT * FROM products WHERE NOT price IS NULL;

 

记录操作-order by排序

在开发中,我们从数据库中查询出的数据经常需要根据某些字段进行排序,可以使用order by关键字,后面跟的就是要排序的列

order by 子句是select的最后的一个子句。

asc 升序 (默认)

desc 降序

 

练习:

  1. 查询出所有商品,并根据价格进行升序排序

SELECT * FROM products ORDER BY price ASC;

  1. 查询出所有商品,根据数量进行升序排列,如果数量相同,根据价格进行降序排列

SELECT * FROM products ORDER BY pnum ASC, price DESC;

记录操作-聚合函数

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

今天我们学习如下五个聚合函数:

  1. count:统计指定列不为NULL的记录行数;
  2. sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
  3. max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
  4. min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
  5. avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

记录操作-分组操作

分组查询是指使用group by字句对查询信息进行分组,例如:我们要统计出products表中所有分类商品的总数量,这时就需要使用group by 来对products表中的商品根据category进行分组操作.

分组后我们在对每一组数据进行统计。

分组操作中的having子名是用于在分组后对数据进行过滤的,作用类似于where条件。

 

笔试题: having与where的区别:

1.having是在分组后对数据进行过滤.

  where是在分组前对数据进行过滤

  

2.having后面可以使用分组函数(统计函数)

                  where后面不可以使用分组函数。

 

例子:

 
 商品分类:
	商品id
	商品名称
	商品属性
创建表:
	 create table category(
	 cid int primary key auto_increment,
	 cname varchar(10),
	 cdesc varchar(31)
	 );
 商品:
 插入数据:
	 所属关系
	 insert into category values(null,'手机数码','电子产品');
	 insert into category values(null,'鞋靴箱包','江南制造');
	 insert into category values(null,'香烟酒水','京东打折');
	 insert into category values(null,'瓜子花生','好吃不贵');
	 insert into category values(null,'酸奶饼干','啊哈哈哈');
 
 
 产品:
	产品id
	产品名称
	产品价格
	产品日期
	产品编号
	
 create table product(
	pid int primary key auto_increment,
	pname varchar(10),
	price double,
	pdate timestamp,
	cno int
 );
 
	 insert into product values(null,'小米',998,null,1);
	 insert into product values(null,'锤子',2888,null,1);
	 insert into product values(null,'阿迪王',88,null,2);
	 insert into product values(null,'老村长',98,null,3);
	 insert into product values(null,'劲酒',99,null,3);
	 insert into product values(null,'小瓜子',9,null,4);
	 insert into product values(null,'大花生',19,null,4);
	 insert into product values(null,'旺旺雪饼',55,null,5);
	 insert into product values(null,'小酸奶',44,null,5);
 
 
 简单查询:
--查询所有商品:
	select * from product;
--查询商品的名称和商品价格:
	select pname,price from product;
--别名查询,as关键字,as 关键字可以省略:
	--表别名:select p.pname,p.price from product p;(主要用在多表格查询)
	select p.pname,p.price from product as p;
	--列别名:select pname as 商品名称,price as 商品价格 from product;
	select pname as 商品名称,price as 商品价格 from product;
	省略as关键字
	select pname 商品名称,price 商品价格 from product;
--去掉重复的值
	--查询商品所有的价格
	select price from product;
	(去掉重复的价格)
	select distinct price from product;
--select运算查询:仅仅在查询结果上做了运算+-*/
	select *,price*1.5 from product;
	select *,price*1.5 as 折后价 from product;
--条件查询[where关键字]
	指定条件,确定要操作的记录
	--查询商品的价格>60元的所有商品的信息
	select * from product where price>60;
	--where 后的条件写法
	--关系运算符:> >= < <= = != <>
	<>:不等于:标准SQL语法
	!=:不等于:非标准SQL语法
	--查询商品价格不等于88的商品
	select * from product where price<>88;
	select * from product where price!=88;
	
	--查询商品价格在10到100之间
	select * from product where price>10 and price<100;
	
	between...and...
	select * from product where price between 10 and 100;
	
	--逻辑运算符:and ,or,not 
	
	--查询出商品价格 小于100 或者商品价格大于9000
	select * from product where price<50 or price>900; 
	
	--like:模糊查询
	_:代表的是一个字符
	%:代表的是多个字符
	--查询名字中带有小的所有商品:'%小%'
	select * from product where pname like '%小%';
	--查询出第二个名字是米的商品:'_米%'
	select * from product where pname like '_米%';
	
	--in 在某个范围中获得值
		--查询出商品分类ID在1,4,5里面的所有商品
		select * from product where cno in (1,4,5);
	
--排序查询:order by 关键字
	asc : ascend升序(默认的排序方式)
	desc:descend降序
	
	--0.查询所有商品,按照价格排序:
	select * from product order by price;
	
	--1.查询所有商品,按照价格降序排序:
	select * from product order by price desc;
	
	--2.查询所有名称有小的商品,按价格升序
		1.--查询名字中带有小的所有商品:'%小%'
		select * from product where pname like '%小%';
		2.按价格升序
		select * from product where pname like '%小%'order by price asc;
	
--聚合函数:
	sum():求和
	avg():求平均值
	count():统计数量
	max():最大值
	min():最小值
	--1.获得所有商品价格的总和:
	select sum(price) from product;
	--2.获取所有商品的平均价格
	select avg(price) from product;
	--3.获取所有商品的个数
	select count(*) from product;
	
	..Note: where 条件后面不能接聚合函数
	
	--查出价格大于平均价格的商品
	select * from product where price>(select avg(price) from product);
	
	【select后面跟输出的内容】
	--分组:group by
		--1.根据cno字段分组,分组后统计商品的个数
		select cno,count(*) from product group by cno;
		--2.根据cno字段分组,分组统计每组商品的平均价格 并且平均价格大于60
		select cno,avg(price)
		from product group by cno
		having avg(price)>60;
 
	--having关键字 可以接聚合函数 出现在分组之后
	--where关键字 它是不可以接聚合函数 出现在分组之前
 
	编写顺序:
		..S..F..W..G..H..O
		select..from..where..group by ..having..order by
	执行顺序:
		..F..W..G..H..S..O
		from..where..group by..having..select.. order by..
 

猜你喜欢

转载自blog.csdn.net/TDOA1024/article/details/84073653