MY SQL 基础语法

发布时间 2023-03-27 20:58:15作者: #岛

MY SQL 基础语法

image-20230224101317435

基础语法:

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.数据处理函数

(这些函数在其他数据库里可能不存在)

image-20210726094720441

image-20210726095719543

select lower(--)from--;//表示转小写,仅将数据转化成小写,数据库底层数据没变

image-20210726095024449

image-20210726100001871

8.去重复性(distinct):

去除重复性distinct(只能 出现所有关键字最前方,即它前面不能出现字段名称)

image-20210726230452651

9.合并查询结果(union)

要求:多个结果的字段个数要相同,数据类型可以不同(oracle不允许此操作)

image-20210727232532874


10.获取表中部分数据(limit)

只在MYSQL数据库中存在,不建议使用

image-20210727233540525

10.退出mysql:

\q ctrl+c quit exit

11.一个完整的DQL语句总结:

image-20210726235335231

查询语句:

1.简单查询:

select--from---

(查询一个字段)

select--,--,--from--

(查询多个字段信息,用“ ,”隔开)

select * from--;

(“*”查询所有字段)

2.条件查询:

select --from-- where--

(where后跟查询条件)

image-20210725234237381

where后面的天健语句可以跟“or","and","between...and...","like"模糊查询等条件

模糊查询:。。。。like '%模糊语句%'

3.分组查询

分组查询一般搭配与聚合函数使用,注意所有null值都不参与聚合函数运算,分组之后查询其他字段是没有意义的

image-20230224153452796

—group by--;

(通过哪个或者哪些字段进行分组)

如果一条DQL语句当中有group by句子,那么select关键字后面只能跟参与分组的字段和分组函数。

image-20210726232624904

image-20210726232908386

执行顺序: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表相配的数据时使用,相当于查询两个表的交集部分)

*等值连接

image-20210727165652812

*非等值连接

inner 可以省略

*自连接

(一张表看成两张表,进行连接,实际上显示的是两个表的交集)

image-20210727221914462

—外连接

(除了要求输出a表和b表相匹配的数据之外,还要无条件输出a表或者b表所有数据,对方表没有匹配的记录,会自动模拟出null与之匹配)

*左外连接

(将左表数据全部显现出来)

image-20210727224117611

*右外连接

(将右表数据全部显现出来)

—全连接(很少用)
多张表连接原理:

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='市场部');

image-20210727231334004

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

image-20210726092702003

select--,--from—order by --(a1)desc,--(a2)asc;//表示首先按照a1降序排列,如果a1的值相同,z1相同的几个值再按照a2升序排列

image-20210726093313857

日期数据处理 :

回顾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类型)

image-20210726211416625

2.date_format();

(“日期类型数据”,“日期格式”)

image-20210726213139657

表:

对表的操作

表的创建:

image-20210728114225999

default"--";//表示在创建表格的时候设置默认值

eg:sex char(1) default "m";

表中常见数据类型:

image-20230224104810243

表的删除(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,实际上 就是表中数据的限制条件,加入约束的目的就是为了保证表中数据的完整和有效

image-20230224161932517

非空约束(not null)

-> cerat table t_user(
-> id int(10),
-> name varchar(10) not null,
-> email varchar(128)
-> );

表示字段不能为空,且not null与unique 可以联合使用

唯一性约束(unique)

image-20210729001221415

字段唯一性,不能有重复可以为null

email varchar(128) unique 此为列级约束,多个字段约束可以用此种方法

email varchar(128),

unique(email);//此为表级约束 ,可以给表级约束起名字,方便以后删除此约束

construction newtablename unique(tablename);//给约束起新名字

unique(email,name)//此为email和name联合结果的唯一性

主键约束(primary key)

主键约束

添加primary key之后,该字段唯一且不能为空,并且默认添加“索引-index”

image-20210729010214744

image-20210729010358989

主键字段

(表中的某个字段添加主键约束之后,该字段被称为主键字段一张表只能有一个主键)

image-20210729005344593

image-20210729005905548

image-20210729010724202

主键值

(主键字段中每一个数据被称为主键值)

外键约束(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:

image-20210729012124091

外键字段去引用一张表的字段的时候,被引用的字段必须具有unique约束;

image-20210729012842702

外键字段

(表中的某个字段添加外键约束之后,该字段被称为外键字段一张表可以有多个外键)

外键值

(外键字段中每一个数据被称为外键值)

检查约束

(目前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):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的