mysql数据库学习整理
登录数据库
mysql -u用户名 -p密码
查看数据库 注意以分号结尾
show databases;
#显示所有数据库,(#是mysql注释的符号)
_____________________________________________________________________________________
SQL概述
SQL(Structural query language) 结构化查询语言,用于操作数据库
SQL学习的三条主线
#SQL的学习分为如下的三部分:
#DML :数据操纵语言 ---> INSERT / DELETE / UPDATE / SELECT ----增删改查
#DDL :数据定义语言 ---> CRAETE(加一个列) / ALTER (修改)/ DROP(删除) / TRUNCATE (清空)/ RENAME(重命名)
#DCL :数据控制语言 ---> COMMIT 提交数据) / ROLLBACK(回滚操作) / GRANT / REVOKE
#说到数据库,习惯上提到增删改查,数据库的增删改比较简单,查询比较难一些
#数据量大可以用limit分页显示,比如:查询五百条数据,十条十条显示
_____________________________________________________________________________________
查询
基本的SELECT语句;
elect 查询的列 from 查询的表`
show databases;
use test1
#有些字段为 null 和java的null是一个意思就是没有赋值的意思,NULL和0是两个概念
select name myname , age as myage
from myname
#为查询后表的字段指定别名 可用 字段名 别名 的形式
#或者 字段名 as 别名 的形式
#注意所有"," 全都是半角的
#如果列的别名中想要包含空格 则用"别 名"或’别 名’引起来
#规范里要求用双引号,mysql里不严格 oracle数据库里必须是双引号
SELECT hid H_ID,gname AS "GAME NAME"
FROM girl;
#查询所有的数据库
SHOW DATABASES;
#使用指定的数据库
USE test1;
#基本的查询操作,查哪个列,哪些列
SELECT hid,gname #要查询字段
FROM girl; #要查询的表
查询的快捷键是F9
查询此表中的全部的列
SELECT *
FROM girl;
#列的别名
#可以使用一对""包裹别名
SELECT hid 'H ID',gname AS "游戏 昵称"
FROM girl;
#三类常见的数据类型:
#1数值型,java的整型浮点型
#2字符型/字符串型,姓名,街道,省份 没有严格要求说字符就是一个,字符串就是多个
#3日期型
#除此以外还有很多
#日期型和字符型变量。要使用一对 单引号来引用,只能在单引号中出现
#双引号是给列起别名是使用
#显示表结构
#对应改变表
#显示字段名 数据类型 是否为空 key default extra字段属性
#图形化界面相当于选中表以后,右键,改变表
DESC girl;
#命令行显示表结构
#或者使用命令全称
DESCRIBE girl;
比较运算
操作符 含义
= 等于(不是==)
> 大于
>= 大于、等于
< 小于
<= 小于、等于
<> 不等于(也可以是!=)
重点 : 赋值使用 :=符号
#其他比较运算符
操作符 含义
BETWEEN 在两个值之间(包含边界)
... AND ...
IN(set) 等于值列表中的一个
LIKE 模糊查询
IS NULL 空值
在sqlyog中将光标定位在某个查询语句上,就可以执行当前的查询
sql 中的字符理解成字符串
逻辑运算
操作符 含义
AND 逻辑并 (且)
OR 逻辑或 (或)
NOT 逻辑否 (非)
#mysql 刚安装完初始化的数据库有4个
#比较关键的是mysql 这里放的是系统相关的表
#用户名,密码都在这里,密码是加密过的
_____________________________________________________________________________________
过滤和排序数据
#1 过滤 2 排序
#查询 test1 数据库中表 goods 中所有cat_id 是8的信息,并返回
SELECT *
FROM goods
#过滤数据
WHERE cat_id=8;
#查询shop_price > 60的货物
SELECT goods_name,cat_id,shop_price
FROM goods
#WHERE (shop_price > 3000 or shop_price < 2000) ;
WHERE shop_price != 1000;
#between …and … (在两个值之间,包含边界)
SELECT *
FROM goods
#where shop_price between 2000 and 3000;
WHERE shop_price BETWEEN 3000 AND 2000;
#包含边界时用between and 比较方便,不包含时还是使用 >=之类的操作符比较简单
#in (set ) :取值为()中的任一个
SELECT *
FROM goods
#where shop_price=2000 or shop_price=2500 or shop_price=3000;
WHERE shop_price IN( 2000,2500,3000 );
#like :模糊查询 查询goods表 goods_name 包含a的数据
SELECT *
FROM goods
#where goods_name like '%p%e%' or goods_name LIKE '%e%p%';
#此处谁like 要写全 写具体
#%号代表0个或多个字符
#oracle 在单引号引的里边是区分大小写的
#WHERE goods_name LIKE ‘%p%’ and goods_name LIKE ‘%e%’;
#查询goods_name 第二个字符是a的数据
WHERE goods_name LIKE ‘_d%’; #mysql 中 _是占位符,一个下划线代表一个字符’___d%'第四个字符是d
#什么字符都可以,任意一个字符
#查询第二个字符是,且第三个字符是a的数据
#转义字符 \
SELECT *
FROM girl
#where gname like '%\_%女';
WHERE gname LIKE '%_%女' ESCAPE '_';
#ESCAPE '_' 是指定转义字符的意思,所以转义有两种方法
#is null :空值
#is not null :非空值
SELECT *
FROM girl
WHERE gname IS NOT NULL;
SELECT goods_name, goods_id,market_price,goods_number , (market_price * goods_number) AS '可得销售总额'
#指定一个新列,字段为总额,内容是乘积
#凡是null值参与运算,结果都是null,应该明白,null就是null 不等同于0,如果想把null 当成0 可以用函数来实现
FROM goods;
#排序 分组 order by
SELECT *
FROM goods
#Order By market_price;
#Order by 默认按升序排序
#也可以自己指定排序方式
#ASC : 升序 (ascend) 也可以省略不写
#Desc : 降序 (descend)
ORDER BY market_price DESC;
#如果想在排序的同时做一些过滤操作,那么 where 不能乱放,不能放在order by 的后边
#where通常和from 挨着,
#from后边紧跟着where,order by 写的时候通常写在查询语句的最后
#查询 goods_number >10 的 market_price 降序之后的数据
SELECT *
FROM goods
WHERE goods_number>10
ORDER BY market_price DESC;
#二级排序
SELECT *
FROM goods
WHERE goods_number>10
ORDER BY market_price DESC,click_count;
#如果一级排序结果比较多,那么就可以指定二级,三级,n级排序
#就在原先的排序条件后加 ,条件即可
#可以使用别名排序
SELECT goods_name AS GOODSNAME #指定别名
FROM goods
WHERE goods_number>10
ORDER BY GOODSNAME; #按别名排序
_____________________________________________________________________________________
多表查询
#实现多个表之间的查询
#涉及到多个表连接
#多表连接,多表查询
#为什么不把所有信息都放一张表里,乱,杂,管理起来不方便,如同java中类
#create database 学生信息;
USE 学生信息;
SELECT 姓名,对应地址
FROM 基本信息,区域表;#30行 6*5=30
#以上查询是错误的,称这种错误为:笛卡尔集错误。
#没有写两个表的连接条件,或写条件了,但失效了
#如果多表连接中,没有声明多表连接条件或连接条件失效。
#直角坐标系,又叫笛卡尔坐标系
SELECT 30/6
FROM DUAL;
#dual是虚拟表
#正确的,多表连接,一定会有连接条件
USE 学生信息;
SELECT 姓名,对应地址
FROM 基本信息,区域表
#连接条件
WHERE 基本信息.`区域编号`= 区域表.`区域编号`;
#关联的语法是 表1.字段名=表2.字段名,如果两个字段名相同,则关联成功
#满足连接条件的显示出来了,
#错误示范
USE 学生信息;
SELECT 姓名,对应地址,区域编号#此时这个区域编号是基本信息表里的呢,还是区域表里的呢
#产生了二义性,所以报错ambiguous,此时的解决办法是指定具体的表
#用表.区域编号来表示
#select 后边的两个字段 姓名和对应地址都唯一的存在对应的两个表中,很好查找
#如果查询的列在多个表中都出现
#则一定要指明此列所属的表
#最好是查询时每一列都指明表,
#从SQL优化的角度说,指定所属表的字段效率比较高
#mysql高级课中有优化等其他操作
FROM 基本信息,区域表
WHERE 基本信息.`区域编号`= 区域表.`区域编号`;
#ambiguous 不确定的模糊的
#表的别名
USE 学生信息;
SELECT e.姓名 , d.对应地址
FROM 基本信息 AS e ,区域表 d
#连接条件
WHERE e.`区域编号`= d.`区域编号`;
#如果指定别名则用别名操作,不能用原有名称操作,指定别名也可用AS
#列的别名只能使用在 order by,其他地方不好使
#所以说列的别名只能用来排序,不能用来过滤
#查询具体地址操作三个表
SELECT e.姓名 , d.`区域编号` ,f.具体地址
FROM 基本信息 AS e , 区域表 AS d , 地址表 AS f
WHERE e.`区域编号`=d.`区域编号`
AND d.`地址编号`=f.`地址编号`;
#三个表写两个连接条件
#等值连接,两个表必须有共同字段
#总结1:如果有N个表做查询操作,那么连接条件至少有N-1个
#总结2:表的连接分类
#等值连接 VS 非等值连接
#自连接(自己连接自己) VS 非自连接(自己连接别人)
#内连接 VS 外连接
#非等值连接基本信息
SELECT 基本信息.`姓名`,基本信息.`年龄`,工资等级.`等级`
FROM 基本信息,工资等级
#where 基本信