MY SQL 基础语法
基础语法:
1.创建数据库:
creat database ***;(数据库名称自定义)
2.使用数据库:
use ***;(已经创建好的数据库名称)
3.描述表的结构:
desc **(表字段成员)
4.显示表格:
show tables;
5.查询当前数据库:
select database();
6.重命名文件:
select --as(as可省略)--(中文用单引号引用)from--;
6.查看当前表:
show creat table+表的名字(table namer)
7.数据处理函数
(这些函数在其他数据库里可能不存在)
select lower(--)from--;//表示转小写,仅将数据转化成小写,数据库底层数据没变
8.去重复性(distinct):
去除重复性distinct(只能 出现所有关键字最前方,即它前面不能出现字段名称)
9.合并查询结果(union)
要求:多个结果的字段个数要相同,数据类型可以不同(oracle不允许此操作)
10.获取表中部分数据(limit)
只在MYSQL数据库中存在,不建议使用
10.退出mysql:
\q ctrl+c quit exit
11.一个完整的DQL语句总结:
查询语句:
1.简单查询:
select--from---;
(查询一个字段)
select--,--,--from--;
(查询多个字段信息,用“ ,”隔开)
select * from--;
(“*”查询所有字段)
2.条件查询:
select --from-- where--
(where后跟查询条件)
where后面的天健语句可以跟“or","and","between...and...","like"模糊查询等条件
模糊查询:。。。。like '%模糊语句%'
3.分组查询
分组查询一般搭配与聚合函数使用,注意所有null值都不参与聚合函数运算,分组之后查询其他字段是没有意义的
—group by--;
(通过哪个或者哪些字段进行分组)
如果一条DQL语句当中有group by句子,那么select关键字后面只能跟参与分组的字段和分组函数。
执行顺序:where>聚合函数>having,因此where后面不能跟聚合函数,having后面可以跟聚合函数
!!!分组函数(count sum avg max min)不能使用在where后面
分组函数需要分完组之后执行,但是现实情况group by在where 后面执行,即where后面跟的分组函数在group by分组之前执行,为错误执行语句。
—having
having功能与where功能都是为了完成数据过滤
having与where后面都是添加条件
where在group by之前完成过滤
having在group by之后完成过滤
eg:
select job,avg(sal)from emp where avg(sal)>1500 group by jop;//错误写法,分组函数不能跟在where后面
select job,avg(sal)from emp roup by jop having avg(sal)>1500;//正确写法
为了提高效率,一般是先过滤,再分组,即优先考虑where,where不能用再用having
4.连接查询
(多表联合,跨表查询)
如果两张表在连接的时候没有经过任何限制,最后查询结果会是两张表记录条数乘积,这种现象被称作笛卡尔积现象为了避免此现象发生,两个表连接查询时需要添加条件
左(右)连接可以写成右(左)连接,若存在right或left,一定外连接,否则是内连接。outter可以省略
注意:虽然连接查询使用限制条件,但是匹配次数没有减少
—内连接
(要求输出a表和b表相配的数据时使用,相当于查询两个表的交集部分)
*等值连接
*非等值连接
inner 可以省略
*自连接
(一张表看成两张表,进行连接,实际上显示的是两个表的交集)
—外连接
(除了要求输出a表和b表相匹配的数据之外,还要无条件输出a表或者b表所有数据,对方表没有匹配的记录,会自动模拟出null与之匹配)
*左外连接
(将左表数据全部显现出来)
*右外连接
(将右表数据全部显现出来)
—全连接(很少用)
多张表连接原理:
5.子查询
(select 语句嵌套select语句)
select...(select)
select e.ename,(select d.dname from dept d where e.deptno=d.deptno) as dname from emp e;
from...(select)
将查询结果当做临时表eg:
select * from emp where dep_id in (select did from dept where dname='财务部' or dname='市场部');
where...(select)
eg:select ename,sal from emp where sal>(select avg(sal)from emp);
6.分页查询
select 字段列表,from 表名 limit 起始索引 ,查询条目数
eg:
select * from stu limit 0,3;
从索引0开始查询,查询三条数据
排序语句:
1.升序排序:
select--(a2)from--(a1)order by --(a3)asc;//表示在字段a1中将a2按照a3升序的顺序排列,默认为升序,即asc可以省略。
2.降序排列:
select--,--from—order by --desc
select--,--from—order by --(a1)desc,--(a2)asc;//表示首先按照a1降序排列,如果a1的值相同,z1相同的几个值再按照a2升序排列
日期数据处理 :
回顾Java日期类型:
SimpleDataFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
Date data=sdf.parse("2000-04-10");
MYSQL 的日期格式:
%Y 年,%m月,%d日,%H时,%i分,%s秒
获取当前时间 -now();
1.-str_to_data();
//通常使用在插入操作中字段是date类型,不接受字符串varchar类型,需要先通过函数将varchar变成date再插入数据才能成功。
如果字符串格式为"200-04-10",符合“%y-%m-%d”格式,自动将字符串格式转化为日期数据
如果字符串格式为"04-10-2000",需要使用-str_to_data(将日期字符串转换成日期data类型)
2.date_format();
(“日期类型数据”,“日期格式”)
表:
对表的操作
表的创建:
default"--";//表示在创建表格的时候设置默认值
eg:sex char(1) default "m";
表中常见数据类型:
表的删除(drop):
drop table t_student;(如果数据库中没有这样的表格,这种方式删除会报错)
drop table if exists t_student ;(最好用这种,此种方法是MYSQL数据库特有)
表的插入(inser into):
INSERT INTO tablename (columnname1,columnname2...)value(value1,value2...);
字段和值一一对应(个数相同,数据类型一致);
eg: insert into emp select *from emp2 where sal=300;//将查询结果当做表插入
表的复制(as):
creat table --as--;
eg:creat table emp1 as select * emp;//复制表emp全部数据给emp1
creat table emp1 as select empname,empno from emp;//复制表emp部分数据给emp1
对表的字段操作
表中字段的添加(add):
alted table --表名add --字段名 数据类型(数据长度);
eg:alted table t_student add tel varchar(10);
表中字段的修改(modify):
alted table --表名modify --字段名 数据类型(数据长度);
eg:alted table t_student modify tel varchar(20);
表中字段删除(drop):
alted table --表名drop--字段名 数据类型(数据长度);
eg:alted table t_student drop tel varchar(20);
对表的数据处理(dml语句)
表数据增加:
与前面对表的操作一致
表数据修改:
update table set 字段名=字段值,字段名=字段值...where..
//如果没有where条件,将会全部更新表中所有数据
表数据删除:
delete from tablename where 条件;
约束
constraint,实际上 就是表中数据的限制条件,加入约束的目的就是为了保证表中数据的完整和有效
非空约束(not null)
-> cerat table t_user(
-> id int(10),
-> name varchar(10) not null,
-> email varchar(128)
-> );
表示字段不能为空,且not null与unique 可以联合使用
唯一性约束(unique)
字段唯一性,不能有重复可以为null
email varchar(128) unique 此为列级约束,多个字段约束可以用此种方法
email varchar(128),
unique(email);//此为表级约束 ,可以给表级约束起名字,方便以后删除此约束
construction newtablename unique(tablename);//给约束起新名字
unique(email,name)//此为email和name联合结果的唯一性
主键约束(primary key)
主键约束
添加primary key之后,该字段唯一且不能为空,并且默认添加“索引-index”
主键字段
(表中的某个字段添加主键约束之后,该字段被称为主键字段一张表只能有一个主键)
主键值
(主键字段中每一个数据被称为主键值)
外键约束(foreign key)
constraint 外键名称 foreign key (外键列名) references 主表(主表列名)
外键约束
--部门表
create table dept(
id int primary key,
dep_name varchar(20),
addr varchar(20)
);
-- --员工表
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键,dep_id关联dep里的id
constraint fk_emp_dept foreign key (dep_id) references dept(id)
);
eg:
外键字段去引用一张表的字段的时候,被引用的字段必须具有unique约束;
外键字段
(表中的某个字段添加外键约束之后,该字段被称为外键字段一张表可以有多个外键)
外键值
(外键字段中每一个数据被称为外键值)
检查约束
(目前MYSQL不支持,oracle数据库支持)
数据库设计
有哪些表,表里有哪些字段,表和表有什么关系
数据库设计的步骤
1.需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
2.逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数库管理系统)
3.物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
4.维护设计(1.对新的需求进行建表;2.表优化)
表与表之间的关系:
一对多
多对多
一对一
1.一对多实现方式
在多的一方建立外键关联一的一方主键
2.多对多实现方式
建立第三张中间表
中间表至少包含2个外键,分别关联双方主键
3.一对一实现方式
在任意一方建立外键,关联对方主键,并设置外键唯一
事务
事务简介
- ·数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
- 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
- ·事务是一个不可分割的工作逻辑单元
举例:
如张三向李四转账五百元,
事件一:张三账户减去五百元,
事件二:李四账户增加五百元
事务的作用就是保证事件一与事件二同时成功或者同时失败
否则业务将会出现严重的后果,如多出五百块或少了五百块。
事务操作
update account set money=1000;
-- 开启事务
begin;
update account set money=money-500 where name='张三';
update account set money=money+500 where name='李四';
-- 提交事务,对数据库数据更改,数据持久化
commit;
-- 若出错回滚,不会更改数据库的数据
rollback;
事务四大特征:
- ·原子性(Atomicity):事务是不可分割的最小操作单位,要么同时成功,要么同时失败·一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
- ·隔离性(Isolation):多个事务之间,操作的可见性
- ·持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的