MySQL笔记大全

SQL语句笔记大全

第一章 DDL数据定义语言

1.1数据库的相关操作


-- 数据库的查看
show databases;

-- 数据库的创建
-- create database [if not exists] 库名 
-- if not exists:表示如果不存在就创建(非必须条件)存在了就不创建了
create database school;
create database if not exists school;

-- 数据库的修改
-- rename database 原来的库名 to 现在的库名
rename database school to s_school;       -- 修改库名 
-- 数据库的删除
-- drop database 库名
drop database school;
-- drop database [if exists]库名 如果存在就删除
drop database if exists school;



1.2数据表的相关操作

-- 表的创建
-- 在创建表之前需要使用数据库(也就是需要进入数据库)
-- create table[if not exists]表名(
-- 字段名1 字段类型 [约束],    -- 约束非必须条件 类型必须填
-- 字段名2 字段类型 [约束],
-- 字段名3 字段类型 [约束]
--);
use school;-- 进入数据库
-- 创建表格
create table if not exists  students(
  sid int,-- 约束暂时不添加 后面会专门讲约束
  ssex char(2),
  sname varchar(10),
  sage int,
  sclassid int 
);

-- 表的修改(修改表结构 其实就是增删改)
-- 增加表中列
-- alter table 表名 add column 列名 类型;
alter table students add column sscore float;

-- 修改表中列
-- alter table 表名 modify column 列名 新类型;
alter table students modify column s_name varchar(20);

-- 修改列名
-- alter table 表名 change column 旧列名 新列名 类型;
alter table students change column sid snum;

-- 删除表中列
-- alter table 表名 drop column 列名;
alter table students drop column sclassid;

-- 修改表名
-- rename table 原表名 to 现表名;
rename table students to students_tb;

-- 查看数据表结构
desc students;

-- 查看数据表
-- 这里查看的是数据库中所有的数据表(不是这数据表中的数据)
show tables;

-- 删除数据表
-- drop [if exists] 表名;
drop if exists students;
-- truncate table 表名;
truncate table students;

-- 另外一种创建表的方式(数据表的拷贝(备份))
-- 拷贝表结构
-- create table 现表名 like 原表名
create table students_tb1 like students;

-- 拷贝表的某些字段
-- create table 新表名 select 字段1,字段2,.....from 原表名 ;
create table students_tb1  select sid,sname,sage from students;

-- 拷贝整张表
-- create table 新表名 slect *from 原表名;
create table students_tb2 select *from students;

-- 其他的类似(就不过多写了)
 


1.3 数据类型(提一下常用的,与c/c++有许多相同数据类型)

1.浮点型:
float :4个字节

double: 8字节

2.字符型:
char():固定长度字符 char(m) :表示最大长度不能够大于m而且表示一共给了2m个字节的空间,不管你用没用完都是这么多。

varchar():可变长度的字符类型,varchar(m)表示最大长度不能够超过m,但是在不超过m长度的范围内,储存空间是用了多少就是多少。 (比较灵活)

3.数值类型(不多说)

4.日期类型(数据库函数(日期函数在详细介绍))

1.4约束(本身也是一个对象,用来限制表中数据的)

一、分类:

  1. not null:非空约束
  2. unique:唯一约束 (可以为空)
  3. 主键约束(primary key):unique+not null+索引(值不能够为空而且必须唯一不能够有重复值)
  4. 外键约束(foreign key):外键可以为空,外键可以不唯一,外键的值等于引用字段的值
  5. 检查约束 :not null check();
    二、废话不多说 (上代码)
--创建表格
create table student (
  sid int primary key,-- 设置id 为主键(第一种添加主键的方式)
  sname varchar(20) not null,-- 非空约束
  ssex char(2) not null check(sex='男'or sex='女') -- 检查约束
);
create table sc(
   sid int not null;
   score float not null;
);
-- 由于约束本身就是对象,所以可以用DDL语句来操作
-- 这里就展示主键,外键,其他的类似(更简单)
-- 添加主键
-- constraint 给约束取别名
-- alter table 表名 add constraint 约束名 primary key (字段名)
alter table sc add constraint pk_sc_score primary key (score);

-- 删除主键
-- alter table 表名 drop primary key;
alter table sc drop primary key;

-- 添加外键
-- alter table 表名 add constraint 约束名 foreign key(字段名) references 表名(引用的列)
alter table sc add constraint fk_sc_sid foreign key(sid) references student(sid);

-- 删除外键
-- alter table 表名 drop foreign key 约束名;
-- 外键可能有多个,所以要指明外键的约束名
alter table drop foreign key fk_sc_sid; 

-- 当把一张表的主键作为另外一张表的外键时,直接删除外键是不行的
-- 所以就有以下方式
-- 级联删除 on delete cascade;
alter table sc add constraint fk_sc_sid foreign key(sid) references student(sid)on delete cascade;
-- 级联置空 on delete set null;
alter table sc add constraint fk_sc_sid foreign key(sid) references student(sid)on delete set null;

第二章 DML数据操纵语言

1.插入数据

-- 插入单条数据
-- insert into 表名 value(数据);-- 要求按照建表顺序一一对应
-- insert into 表名(字段名) value (数据);
insert into students value(1,'小明','男');
insert into students(sid,sname,ssex)value(2,'小花','女');

-- 插入多条数据
insert into students values(3,'bob','男'),(4,'李华','男');
insert into students(sid,sname,ssex)values(5,'amy','女'),(6,'tonney','女')

2. 修改数据

-- 数据更新(修改)
-- update 表名 set 修改条件(表达式)where 限制条件(需要修改的那部分)
update students set ssex='女';-- 注意这里没有加限制条件,意为修改整张表数据的性别为女
-- 条件修改数据
update students set ssex='男' where s_name='小红';-- 把表中小红的性别改为男
-- 多条件修改数据 ||和or一样
update students set ssex='男'where sname='amy'||sname='tonney';-- 把表中amy 和 tonney的ssex改为男

3.删除数据

-- 数据的删除
-- delete from  表名 where 筛选条件
delete from students;-- 删除整张表的数据
-- 条件删除
delete from students where sname='小明';-- 删除表中小明的数据
-- 多条件删除
delete from students where sname='小花' or sname='amy';-- 删除表中小花和amy 的数据

第三章 DQL数据查询语言

1. 单表查询

-- 单表查询
-- select 查询列表 from 表名;
-- 查询单个字段
-- select 字段名 from 表名;
select sid from students;

-- 查询部分字段
select sid,sname from students;

-- 查询所有字段(* 表示所有)
select *from students;

-- 给表取别名查询
select *from students t1;-- t1相当于表的别名
select t1.sid,t1.sname from student t1;

-- 查询函数(后面会单独列数据库函数)
-- select 函数名(实参列表);

-- 去重 distinct
select distinct sid,sname from students;

-- 条件查询
-- select 查询列表 from 表名 where 筛选条件;
select *from students t1 where t1.sid=1;-- 查询sid为1的学生信息

-- 运算符:逻辑运算符,条件运算符,其他运算符
-- 逻辑运算符:and or not
-- 条件运算符:> < = != <= >= <>(就是!=)
-- 其他运算符:
-- 1.like :有模糊匹配的意思,其实可以理解成=,%表示任意多个字符 _表示任意单个字符 如果有特殊字符则需要用escape转义
-- 2.between and 介于两者之间  (a between 10 and 20) 等价于(a>=10 and a<=20)
-- 3.not between and 参照2
-- 4.in 在其中 b in(10,20,30)等价于(b=10 or b=20 0r b=30)
-- 5.not in 参照4 c not in(1,2,3) 等价于(c!=1 and c!=2 and c!=3)
-- 6.is null 为空
-- 7.is not null 不为空

-- 选择一些演示一遍
select *from students where sage>10;-- 查询年龄大于10的学生信息
select *from students where sid=1 or sid=2;-- 查询学号为1和学号为2的学生
select *from students where sage>12 and sage<18;-- 查询学生年龄大于12并且小于18的学生信息
select *from students where not(sage>12and sage<18)-- 查询学生年龄<=12或者>=18的学生信息
select *from students where sage between 12 and 18;-- 查询年龄在12到18之间的学生信息(包含12,18)
select *from students where sname like 'a%';-- 查询学生姓名为a开头的学生信息
select*from students where sid in(1,2,5);-- 查询学号是1,2,5的学生信息

2.排序查询

-- 排序查询(order by)
-- select 查询列表 from 表名 [where 筛选条件] order by 排序列表 [asc or desc] -- where 子句非必须

-- 升序排序(asc)
select *from students order by sid asc;-- 按照学生学号升序排序

-- 降序排序(desc)
select*from students order by sid desc;-- 按照学号降序排序

-- 默认排序(默认为升序)
select *from students order by sid;

-- 多个字段排序
select *from students order by sid desc ,sage asc;-- 先按照学号降序排序再按照年龄升序排序

3.分组查询(一般配合数据库函数一起使用)

-- 分组查询
-- select 查询列表 from 表名 【where 筛选条件】 group by 分组字段 【having 分组后的筛选】 【order by 排序的字段】
-- 【】里面的非必须
-- 其中where子句是分组前的筛选,having子句是分组后的筛选

select avg(score) from students t1 group by t1.sid;-- 查询每个学生的平均成绩 avg()--求平均值的函数 后面专门讲数据库函数

-- 查询每个学生的最低成绩并按照学号降序排序
select min(score),t1.sid ,t1.sname from students t1 group by t1.sid,t1.sname order by min(score)desc;

4.连接查询(多表查询)

-- 多表查询(内连接,外连接,交叉连接)

-- 1.内连接(inner join)(等值连接,非等值连接,自连接)
-- 内连接(随便定义哪张表为主表,关联上就出数据,没有关联上就不出数据)
-- 等值连接
select t1.sid,t1.sname,t2.scid from students t1 ,sc t2 where t1.sid=t2.sid;
select t1.sid,t1.sname ,t2.scid from students t1 inner join sc t2 on t1.sid=t2.sid;-- 这样也是可以的

-- 非等值连接(不是等号的连接方式)
select t1.sid,t1.sname,t2.scid from students t1,sc t2 where t1.sid between t2.scid and t2.scid; 
select t1.sid,t1z.sname,t2,scid from students t1 inner join sc t2 on t1.sid between t2.scid and t2.scid;-- 这样也行

-- 自连接(自己连接自己)
select *from students t1 ,students t2 where t1.sid=t2.sid;
select *from students t1 inner join students t2  on t1.sid=t2.sid;-- 这样也可

-- 外连接(outer join)(左连接,右连接,全连接)
-- 左连接(left join)
-- 把左边的表指定为主表(驱动表)关联上就出数据,
-- 左边的表没有关联上也会出数据,右边的表没有关联上就不出数据
select *from students t1 left join sc t2 on t1.sid=t2.sid;

-- 右连接(right join)
-- 把右边的表指定为主表(驱动表) 关联上就出数据
-- 右边的表没有关联上也要出数据,左边没有关联上就不出数据
select *from students t1 right join sc t2 on t1.sid=t2.sid;

-- 全连接(full join)
-- 把左右两张表都作为驱动表 不管关没关联上都会出数据
 select *from students t1 full join sc t2 on t1.sid=t2.sid;

-- 交叉连接(cross join)
-- 结果就是一个笛卡尔积
select t1.sid,t2.scid from students t1 cross join sc t2;


5.子查询(嵌套查询)

-- 子查询(嵌套查询):查询语句中还有查询语句(可以有很多个)
-- 子查询会优先于主查询先执行

-- 非关联子查询(子查询可以脱离主查询独立执行)
select*from students where sid in(select sid from sid);

-- 关联子查询(子查询不可以脱离主查询独立执行)
select *from students t1 where exists(select sid from sc t2 where t1.sid=t2.sid);-- exists 存在 (和in有点类似)

-- 集合运算
-- union(去重后的并集)
select sid from students union select sid from sc;

-- union all(不去重后的并集)
select sid from students union all select sid from sc;



第四章 数据库函数

1.单行函数

1.1 字符函数

-- 1.字符函数
-- concat: 连接字符(将字符串连接在一起)
select concat ('hello','world')as out_put;

-- substr: 截取字符 substr(a,b,c);a:传入的值,b:截断的字符起始位置 c:字符个数
select substr (sname 1,2)from students;

-- replace:替换字符 replace(a,b,c) a:传入的字符串 b:需要替换的字符 c:替换的字符
select replace('乔峰爱上了阿紫','阿紫','阿朱') as out_put;

-- upper 转字符大写
select upper('john')as out_put;
-- lower 转字符小写
select lower ('JHU')as out_put;
-- lpad 左填充 lpad(a,b,c) a:传入的字符 b:填充后一共有多少个字符 c:左填充的字符
select lpad('赵敏',10,'#') as out_put;
-- rpad 右填充 同lpad 类似
select rpad('双儿',10,'@') as out_put;
-- length 返回字符串长度
select length('殷素素')as out_put;
-- trim 去除前后空格
select tirm('   张无忌   ')as out_put;
-- instr 获取字串第一次出现的索引 如果找不到则返回0
select instr('佛前一跪三千年','三千年')as out_put;

1.2数值函数

--round:四舍五入
select round(-1.8965) as out_put;-- 默认四舍五入 系统默认是几位就是几位
select round (7.8945,2) as out_put;-- 指定位数的四舍五入
--ceil:向上取整
select ceil(2.34)as out_put;-- 值为3
-- floor:向下取整
select floor(3.45) as out_put;-- 值为3
-- mod:取模运算
select mod(10,3) as output;
-- truncate:保留小数的位数,不进行四舍五入
select truncate(1.789654,2);-- 值为1.78
-- rand:获取随机数,返回0-1之间的小数
select rand()as out_put;

1.3日期函数

-- now 返回当前的日期+时间
select now()as out_put;
-- curdate 返回当前日期
select curdate()as out_put;
-- curtime 返回当前时间
select curtime()as out_put;
-- year 返回年
select year(now())as out_put;
-- month 返回月
select month(now())as out_put;
-- day 返回日
select day(now())as out_put;
-- hour 返回时
select hour(now())as out_put;
-- minute 分
select minute(now())as out_put;
-- second 秒
select second(now()as out_put;
-- monthname 以英文形式返回月名
select monthname(now()) as out_put;
-- dayname 以英文的形式返回星期几
select dayname(now()) as out_put;
-- datediff 返回两个日期相差的天数
select datediff(now(),'2001-2-7')as out_put;-- 有正负数之分(前-后)
-- data_format 将日期类型转换成字符类型
select data_format(now(),'%Y年%m月%d日')as out_put;
-- str_to_date 将字符类型转换成日期类型
select str_to_date('2001-6-9','%Y-%c-%d')as out_put;

1.4条件表达

-- if 判断语句
-- if(条件表达式,表达式1,表达式2);如果条件表达式成立,返回表达式1,否则返回表达式2
select if(5<10,'small','big')as out_put;
select if(5=10,'true','false')as out_put;

-- case when 分支语句c
-- case  when 条件1 then 结果1
--       when 条件2 then 结果2
--       else 结果
--       end;
select sname,sid from students
(case when sex='男' then '男孩子'
     when sex='女' then '女孩子'
     when sex is null then '未知'
     else '流批class' end)
     as from students; 
    
       

1.5 其他函数

-- version 当前数据库的版本
select version();
-- database 当前打开的数据库
select database();
-- user 当前登录的用户
select user();
-- password('字符')
select password('123456');
-- md5('字符') 返回该字符的md5加密形式
select md5('123456');

2.组函数

-- 组函数
-- select 函数名(参数)【from 表名】;
-- sum 求和
select sum(score)from sc;
-- avg 求平均值
select avg(score)from  sc;
-- max 最大值
select max(score) from sc;
-- min 最小值
select min(score) from sc;
-- count 计算个数
select count(score) from sc;

你可能感兴趣的:(数据库,笔记,sql)