mysql数据库
数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作
User id name age pojo bean
id |
name |
age |
|
|
|
|
|
1 |
lisi |
李思思 |
|
|
|
|
|
2 |
zs |
89 |
|
|
|
|
|
3 |
zs |
89 |
|
|
|
|
|
mysql 列 添加
数据类型
约束 一行数据的正确
由于mysql数据库体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库
c s
b s
官网:https://www.mysql.com/
下载:https://dev.mysql.com/downloads/mysql/
官方版和社区版的区别:
① 企业版只包含稳定后的工程,社区版包含所有的Mysql的最新功能。
② 社区版不提供官方技术支持。
③ 社区版免费,企业版收费。
Sc delete MySQL ----先删除
安装包安装:
① 解压mysql-5.7.17-winx64.zip压缩包(32位操作系统的请解压winx32的压缩包)
② 添加环境变量:
将MYSQL_HOME追加到系统的path变量的末尾, 注意用英文分号(;)隔开。:
追加内容:;%MYSQL_HOME%\bin;
③ 将MySQL添加到系统服务中并启动:
1) 右键“开始”——> “运行(R)”或者快捷键:“开始”+“R”(以管理员身份运行cmd)
2) cd 到MySQL所在的本地磁盘路径的bin目录,然后回车:
执行:mysqld install MySQL --defaults-file="D:\big331\mysql-5.7.17-winx64\my-default.ini"(自己实际解压的位置)
启动:net start mysql
此时会出现MySQL服务无法启动,服务没有报告任何错误。
解决办法:
执行:
mysqld --install
mysqld --initialize
net start mysql
④ 修改mysql密码
Mysql在启动后会初始化一个默认密码,该密码在mysql的安装目录data/xxx.err结尾的文件中。
在cmd下执行:mysql -uroot -p
输入上面文件中的密码:lsix6)UhXhsJ
修改密码,执行:SET PASSWORD = PASSWORD('root');
退出使用新密码123456登录。
在cmd下执行:mysql -uroot -p
输入正确的密码后就能登录到mysql中。
创建数据库
1.使用默认的字符集与校对
create database 数据库名;
2.可以指定数据库字符
create database 数据库名 CHARACTER set gbk
3查看当前数据库服务器下所有数据库
show databases;
4 查看创建数据库的语句
show create database 数据库名;
5删除数据库
drop database 数据库名
6.切换数据库
use 数据库名称
7查看当前所使用的事数据库
select database();
数据库中表数据和java中的实体bean比较,用来面描述和存储数据
|
char与varchar区别?
char是一个定长字符串.指定长度不会随着内容的不足而改变
varchar是一个可变长度的字符串,它根据信息自动改变长度.(只在字符串长度小于指定长度情况下)
A. 主键约束 primary key, primary key(id)
B. 唯一约束 某一列的值不为重复可以使用唯一约束. unique
C. 非空约束 not null
D. 默认值约束 default 值
E. 外键约束
创建表
create table 表名( 字段1 类型, 字段2 类型, ..... ) character set 字符集 |
查看表
l查看表结构 desc 表名; l查看当前数据库下所有表 show tables; l查看表的字符编码集就是表的创建语句 show create table 表名; |
修改表 基本不用 迫不得已也别用
1.add----添加列操作 alter table 表名 add 列名 类型; 2.modify--修改列的类型 alter table 表名 modify 列名 类型; 3.drop --删除列 alter table 表名 drop 列名. 4.change--修改 列名称 alter table 表名 change 旧列名 新列名 类型; |
删除表 一般不用
drop table 表名; TRUNCATE TABLE 表名 区别 前者有条件,自增主键不初始化 , 后者不可回退 , 速度快 , 相当于新建一个一样的空表 |
Insert into 表名 (files) values (values)
1 约束条件 长度 约束类型
2 数据类型
3 (files 和values 一一对应
① 插入所有列值
insert into 表名(列名1,列名2, ...) values(列值1, 列值2, ...);
表名后面是当前表中所有字段名称
INSERT INTO Persons (lastName,FirstName,Address,City) VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
② 插入部分列值
insert into 表名(列名1,列名2) values(列值1, 列值2);
表名后面是当前表中部分字段名称
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
③ 不指定列名
insert into 表名 values(列值1, 列值2, ...);
u 没有给出要插入的列,那么表示插入所有列;
u 值的个数必须是该表的列的个数;
u 值的顺序,必须与表创建时给出的列的顺序相同。
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
注意
u 插入的数据应与字段的数据类型相同
u 数据的大小应该在列的长度范围内
u 在values中列出的数据位置必须与被加入的列的排列位置相对应。
u .除了数值类型外,其它的字段类型的值必须使用引号引起。
u 如果要插入空值,可以不写字段,或者插入 null.
u 注意:对于自动增长的列在操作时,直接插入null值即可.
Update 语句用于修改表中的数据。
语法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
更新某一行中的一个列
我们为 lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
更新某一行中的若干列
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'
DELETE 语句用于删除表中的行。用于删除表中的数据
语法
DELETE FROM 表名称 WHERE 列名称 = 值
删除某行
DELETE FROM Person WHERE LastName = 'Wilson'
删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name
或者
DELETE * FROM table_name
truncate table 表名 删除表中的数据
truncate table Person
删除表 drop table 表名 删除的是整个表
l 关于delete 与truncate的区别
ü delete是一行一行删除 truncate是将表结构销毁,在重新创建表结构.
ü 如果数据比较多,truncate的性能高。
ü delete是受事务控制. 可以回滚数据.
ü truncate是不受事务控制. 不能回滚.
u SELECT 语句用于从表中选取数据。
语法
SELECT 列名称 FROM 表名称
或者
SELECT * FROM 表名称
查询指定列
select 字段 from 表名;
查询指定字段信息,如果要查询多个字段
select 字段1,字段2,...from 表名;
SELECT LastName,FirstName FROM Persons
查询所有列
select * from 表名;
查询表中所有字段.
注意:使用"*"在练习,学习过程中可以使用,在实际开发中,
SELECT * FROM Persons
去掉重复记录
select distinct 字段 from 表名;
distinct它的作用是去除重复.
SELECT DISTINCT Company FROM Orders
使用别名
使用as 别名可以给表中的字段,表设置别名.
SELECT LastName as lname ,FirstName as fname FROM Persons
或者 直接用空格隔开
SELECT LastName lname ,FirstName fname FROM Persons
ifnull函数
在对数值类型的列做运算的时候,如果做运算的列的值为null的时,运算结果都为null,为了解决这个问题可以使用ifnull函数
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL。
使用ifnull函数
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
WHERE 子句用于规定选择的标准,规定查询条件查询范围
语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
这是正确的:
SELECT * FROM Persons WHERE FirstName='Bush'
这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush
数值不能加引号
这是正确的:
SELECT * FROM Persons WHERE Year>1965
这是错误的:
SELECT * FROM Persons WHERE Year>'1965'
and or
select * from tb_item where id = 536563 AND num = 99999
select * from tb_item where id = 536563 OR num = 99999
相当于 >= and <=
注意:between 后面的值必须是小值 and后面的是大值
SELECT * FROM products WHERE price BETWEEN 100 AND price; |
可以比较多个值
SELECT * FROM products WHERE price IN(65,100,190); |
模糊查询
通配符使用:
1.% 匹配多个
2._ 匹配一个
查询出商品的名称中包含java的商品信息。 SELECT * FROM products WHERE NAME LIKE "%java%"; 查询出书名是两个字的商品信息 SELECT * FROM products WHERE NAME LIKE "__"; |
is null; 判断为空
is not null; 判断不为空
查询出商品价格不为null商品信息 SELECT * FROM products WHERE price IS NOT NULL; SELECT * FROM products WHERE NOT price IS NULL; |
语法
select 字段from table where 条件 order by 字段 asc/desc ,字段 asc/desc
asc 升序 (默认)
desc 降序
查询出所有商品,并根据价格进行升序排序 SELECT * FROM products ORDER BY price ASC; 查询出所有商品,根据数量进行升序排列,如果数量相同,根据价格进行降序排列 SELECT * FROM products ORDER BY pnum ASC, price DESC; |
Select简单的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值
u count:统计指定列不为NULL的记录行数;
u sum:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
u max:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
u min:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
u avg:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
|
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
分组操作中的having子名是用于在分组后对数据进行过滤的,作用类似于where条件
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING 条件
对商品分类别统计,求出每一种类商品的总数量 SELECT category,SUM(pnum) FROM products GROUP BY category; 对商品分类别统计,求出每一种类商品的总数量,数量要大于100 SELECT category,SUM(pnum) FROM products GROUP BY category HAVING SUM(pnum)>100
|
总结
Having与where的区别
l having是在分组后对数据进行过滤.
where是在分组前对数据进行过滤
l having后面可以使用分组函数(统计函数)
where后面不可以使用分组函数。
总结:
SELECT category ,,SUM(pnum),count(*) FROM products WHERE id <9 GROUP BY category HAVING SUM(pnum)>100 ORDER BY SUM(pnum) DESC LIMIT 1 ,2 |
概念模型在数据库中就对应数据表,那么表与表之间的关系也包括:一对一,一对多,多对多。而表与表之间关系是通过外键来维护的。
将两张表联系在一块 让表和表发生关系
外键约束特性如下:
l 外键必须是另一表或自身表的主键的值;
l 外键可以重复;
l 外键可以为空;
l 一张表中可以有多个外键。
CONSTRAINT FK_UID FOREIGN KEY orders(uid) REFERENCES USER(uid)
语法
Select * from A cross join B; Select * from A,B; |
实现原理是 笛卡尔积
order 主表
User 用户
Detai 明细
内连接就是两张表同时都满足一定的条件的的结果
语法
显式内连接语法: Select * from A inner join B on (连接条件[外键字段名=另一个表的主键字段]) |
隐式内连接语法: Select * from A,B where 条件 select * from orders A ,customer B where A.customer_id=B.id; |
左外连接 以左边表为主
语法
Select * from A left join B on (A. 外键字段=B.主键字段) |
查询到的结果是左边表全部显示右表补齐
右外连接 以右边表为主
语法:
Select * from A right join B on (连接条件) |
语法:
Select 字段 from A where 条件 Union Select 字段 from B where 条件 |
可以自动消除重复记录
子查询:放在外面的查询语句称为父查询,放在里面查询称为子查询。
语法:
Select * from A where Id in ( Select id from B where 条件 )
|
Select * from orders where customer_id=(select id from customer where name='zhangsan'); |
l NOW()
语法
SELECT NOW() FROM table_name
显示当天的日期所对应的名称和价格。
SELECT ProductName, UnitPrice, Now() as PerDate FROM Products
select year(now()); 取出年份
l Md5()
select md5('123');
给添加的密码加密
INSERT into person (name,PASSWORD) values ('zhangsan' ,MD5('123') ) ;
Limit 起始行数 | 每页显示的行数
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10 |