mysql笔记之SQL语法--多表查询

SQL语法

使用DDL来操作MySQL:

  • 通过use来使用本数据库,然后使用show来显示当前的数据库(当然显示表是相同的写法,只是他们的格式是tables跟databases)
  • 使用DESC 表名;来显示他们的表结构。
  • 使用SHOW CREATE TABLE 表名;来查询指定表的建表语句。
  • 使CREATE TABLE 表名()来创建表
  • 还可以使用SELECT DATABASE()来查询当前的数据库。(这是一个函数)
  • 使用DROP DATABASE来删除数据库名

~当然使用IF NOT EXISTS 表示如果当前存在即不做反应。(写在当前语句里,命名的前面)

数据类型:数值类型,字符串类型,日期类型

数值类型:TINYINT小整数值,SMALLINT大整数值,MEDIUMINT大整数值,INT或者INTEGER大整数值,BIGINT极大整数值,FLOAT单精度浮点数,DOUBLE双精度浮点数值,DECIMAL小数值(精确点数,依赖M精度跟D标度的值)(234.45这个数值他的精度是5标度是2)

在数值的后面空格写入UNSIGNED表示无符号范围,即数值非负数。
DOUBLE(有2个值,一个写长度,一个写小数的位数)

字符串类型:CHAR定长字符串0255,VARCHAR变长字符串,TINYBLOB不超过255个字符的二进制数据0255,TINYTEXT短文本字符串0~255,BLOB二进制形式的长文本数据,TEXT长文本数据,MEDIUMBLOB二进制形式的中等长度文本数据,MEDIUMTEXT中等长度文本数据,LONGBLOB二进制形式极大文本数据,LONGTEXT极大文本数据。

BLOB是二进制(一些视频音频都是可以存进数据库中)!性能不高
定长是不管写几个都占你写入括号的数值长度,而变长是可以根据你输入的长度来占空间。当然他们两个一旦超过括号内的长度都会报错。

定长的性能更高。

日期类型:DATE日期值,格式YYYY-MM-DD,TIME时间值或持续时间,格式为HH:MM:SS,YEAR年份值,格式YYYY,DATETIME表示混合日期和时间值(2个一起展示),TIMESTAMP混合日期和时间值,时间戳。

TIMESTAMP最大取值范围到2038年。
comment “表示注释”
date直接显示当前的时间。

DDL的修改:

  1. 使用ALTER TABLE表名 ADD 字段名 类型 (长度);当然可以在里面添加一些约束跟注释都是可以的

  2. 修改数据类型:ALTER TABLE 表名 MODIFY字段名 新数据类型(长度);

  3. 修改字段名跟字段类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度)【约束】;

  4. 删除字段 :ALTER TABLE 表名 DROP 字段名;

  5. 修改表名:ALTER TABLE 表名 RENAME TO 新表名

  6. 删除表:DROP TABLE 表名;

  7. 删除指定表,并重新创建该表:TRUNCATE TABLE 表名;

DML:对表中的数据进行增删改操作

  • 添加数据:INSERT insert into 表名(name)values(),();插入的字符串跟日期类型应该包含在引号里面。
  • 修改数据:UPDATE update 表名 set 字段1=值1,字段2=值2;
  • update kang set name=“ying” where id=1;
  • 修改id为1的name字段。如果要修改全部,则不加where

删除数据: DELETE delete from kang where id=1;不加where删除整表。删除符号条件的一整行。

//tinyint unsigned无符号,只能输入0或者正数,数值类型

DQL:select查询
SELECT 字段列表
FROM 表名列表
WHERE条件列表
GROUP BY分组字段列表
HAVING分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页参数

select name as nm from zhnag;
select distinct * from zhnag;去重复记录

!=不等于,BETWEEN AND 在范围内,IN()匹配in里面的值,是否前面含在后面的范围里。 LIKE
模糊匹配,_单个字符,%匹配任意字符数,IS NULL 是为NULL ,IS NOT NULL 是非NULL AND &&并且,OR
||或者,NOT ! 非,不是。

select * from kang where age<20;
select * from kang where age in(18,20,40);
select * from kang where name like "_ _";2个字的名字

聚合函数用于表的某一列的。

COUNT统计数量,MAX最大值,MIN最小值,avg平均值,SUM求和。

  • 语法:SELECT 聚合函数(字段列表) FROM 表名;
select count(*) from kang;用于整表的数量,统计企业员工数量。
  • where跟having:where是在分组前过滤,having是在分组之后对结果进行过滤。where不能对聚合函数进行判断,而having可以。
  • 聚合函数只跟having有关!!,聚合函数是对分组后的各种操作。
select gender ,count(*) from kang group by gender;根据性别分组(聪明的机器),计算分组后的人数。

select gender ,avg(age) from kang group by gender;

select address,count(*) from kang where age<45 group by address having count(*)>=3;
  1. !!执行顺序为:where》聚合函数》having
  2. !!分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  3. 排序:ORDER BY name ASC, age DESC;
  4. 如果是多字段排序,当第一个字段值相同时,才会根据第3个字段进行排序,一同二定。
  5. SELECR 字段 FROM 表名 LIMIT 起始索引 ,查询记录数(在MySQL里面是limit,查询第一页前十行可以写limit
    10,前面的0可以省略)
  6. 查询第2页的数据,每页展示10条记录,(页码-1)*每页展示记录数 limit 10,10;
  7. 小技巧只要记住第一个参数为(页码-1)*每页展示条数,第二个参数为每页展示条数即可。
select distinct * from kang where age  in (20,23,22);
select distinct * from kang where gender="男" and age between 20 and 40 and name like "_ _ _";
select distinct count(*) from kang where age<60 groder by gender;
select distinct name age from kang where age<=35 order by age asc,wortime desc;
select distinct * from kang where gender="男" and age between 20 and 40 order by age asc,wortime desc limit 5;

limit要写最后!!

DCL:管理用户,控制访问权限。

查询用户:use mysql; select * from user;
创建用户:create user "用户名“@”主机名” identified by "密码”;
修改用户密码:alter user "用户名“@”主机名” identified with mysql_native_password by "新密码”;
删除用户:drop user "用户名“@”主机名“;

create user “kang”@“%” identified by “345”;创建用户,%表示可以在任意主机访问数据库。

权限控制:
ALL,ALL PRIVILEGES 所有权限
SELECT 查询数据
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库、表、视图
CREATE 创建数据库、表

  • 查询权限:SHOW GRANTS FOR“用户名”@“主机名”;
  • 授予权限:GRANT 权限列表 ON 数据库名.表名 TO “用户名”@“主机名”;
  • 撤销权限:REVOKE 权限列表 ON 数据库名.表名 FROM “用户名”@“主机名”;

多个权限可以用,分割。!!

函数:指一段可以直接被另一段程序调用的程序或者代码。

字符串函数内置:

CONCAT(A1,A1)字符串拼接
LOWER(STR)将字符串转为小写
UPPER(STR)将字符串转为大写
LPAD(STR,N,PAD)左填充,用字符串pad对str进行填充,直到长度为N。
RPAD(STR,N,PAD)右填充,用字符串pad对str进行填充,直到长度为N。
TRIM(STR)去掉字符串头部和尾部的空格
SUBSTRING(STR,START,LEN)返回字符串str从start1位置起len个长度的字符串。

select 函数(参数);即可

改变员工编号,不足5位前面补0update kang set workno=lpad(workno,5,"0");

数值函数:

CEIL(X)向上取整
FLOOR(X)向下取整
MOD(X,Y)返回x/y的模--求余数
RAND()返回0~1内的随机数
ROUND(X,Y)求参数x的四舍五入,保留y位小数

select 函数(参数);即可

生成一个六位数的随机验证码:
select rpad(round(rand()*1000000,0),6,“0”);

日期函数:

CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
YEAR(DATE)获取指定date的年份
MONTH(DATE)获取指定date的月份
DAY(DATE)获取指定date的日期
DATE_ADD(DATE,INTERVAL EXPR TYPE)返回一个日期或者时间值加上一个时间间隔expr后的时间值。
DATEDIFF(DATE1,DATE2)返回起始时间跟结束时间之间的天数。

select 函数(参数);即可

当前时间70天后的时间(当前时间是含有年月日的):
select date_add(now(),interval 70 day);
查询所有员工入职天数,倒叙排列:
select name,datediff(curdate(),onetime) from kang order by onetime desc;

if函数

if():select if(true,"yes","no");
ifnull():select ifnull(null,"kang");第一个值为null则返回第2个值,否则返回第一个值。
case when then else end:
select
  name,
  case workadd when "北京" then "yes" when"河南" then "yes2" else "no" end
from kang;
select 
  name,
  case when fs>=90 then "优秀" when fs>=80 then "中等" else "不及格" end
from kang;

约束:
目的:保证数据库中的数据的正确性,有效性,完整性。

非空约束 NOT NULL
唯一约束 UNIQUE
主键约束 PRIMARY KEY
默认约束 DEFAULT
检查约束 保证字段值满足一个条件 CHECK
外键约束 FOREIGN KEY
自动增长 AUTO_INCREMENT

默认一张表要有主键这是规范。
添加外键的两种方式:

FOREIGN KEY 自己列表名  REFERENCES 主表(主表列表名)---添加创建时,最下面的一行里。
外部添加用:alter table kang add CONSTRAINT 外键名称 foreign key 外键字段名 references 主表(主表类名);

删除外键:ALTER TABLE kang DROP FOREIGN KEY 外键名;

外键的约束:

CASCADE:当在父表内删除或者更新对应记录是,首先检查GIA记录是否对应外键,如果有,则也删除或者更新外键在子表中的记录。 SET
NULL:当父表中删除对应记录时,首先检查记录是否有对应的外键,如果有,则设置子表中该外键值为null(这就要求该外键允许取值为null)

语法:ALTER TABLE kang ADD CONSTRAINT 外键名称 foreign key 外键字段 references
主表名(主表字段名)ON UPDATE CASEADE ON DELETE CASCADE;

多表查询:
笛卡尔积:集合a跟集合b的组合情况:a*b

消除笛卡尔积:select *from kang,ying where kang.id=ying.naid;加上where用=解决。

连接查询:
内连接–相当于查询A,B交集部分的数据
外连接–(左外连接,查询左表所有数据,以及两张表交集部分数据)(右外连接,查询右表所有数据,以及两张表交集部分数据)
自连接–当前表与自身的连接查询,自连接必须使用表别名。

子查询:

内连接-:
隐式内连接select 字段列表 from 表1,表2 where 条件;
显示连接select 字段列表 from 表1 inner join 表2 on 连接条件;

select kang.name,ying.worna from kang,ying where kang.id=ying.id;
select kang.name,ying.worna from kang inner join ying on kang.id=ying.id;(inner可以省略)

没有交集的就不会显示!!
简化表名的写法:select k.name,y.worna from kang k,ying y where k.id=y.id;

左外连接:select 字段列表 from 表1 left join 表2 on 条件;
–相当于查询表一所有的数据包含表1根表2交集的数据。

右外连接:select 字段列表 from 表1 right join 表2 on 条件;
–相当于查询表2的所有数据包含表1根表2交集部分的数据。

select k.* ,y.worna from kang k left join ying y on k.id=y.id;
select k.* ,y.worna from kang k right join ying y on k.id=y.id;

自连接:自己连接自己 select 字段列表 from 表A 别名A join 表A 别名B on 条件;

自连接查询,可以是内连接查询,也可以是外连接查询。

要根据本表内容查询跟本表有联系的本表信息。
自连接必须起别名!!

查询员工及其所属领导的名字:
select k.name ,a.name from kang k,kang a where k.id=a.woid;(自连接内)
查询(所有)员工及其领导的名字,如果员工没有领导,也要显示出来:
select k.name,a.name from kang k left join kang a on k.id=a.worid;(自连接外)

联合查询:对应union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

语法:select 字段列表 from 表A … union [all] select 字段列表 from 表B…;

相当于是用union all把两个表的显示结果合并了一起去展示。

  • !!不加all表示去重,去掉两个表中重复显示的。
  • 使用union的条件:多表的字段列表必须保持一致,字段类型也要保持一致。

子查询:SQL语句嵌套select语句,称为嵌套查询,又称子查询。

例如:select * from kang where name=(select name from ying);

子查询外部的语句可以是insert,update,delete,select的任何一个。

根据子查询结果分为:标量子查询单个值,列子查询查询结果为一列,行子查询查询结果为一行,表子查询查询结果为多行多列。

子查询的位置分为:where之后,from之后,select之后。

标量子查询:常用操作符= <> > >= < <=

例如:select * from kang where id=(select id from ying where name="z");

select * from ying where time>(select time from where name="bai");

列子查询:常用操作符in 指集合范围之内,not in不在指定集合范围之内,any子查询返回列表中,有任意一个满足即可,some与any等同,all子查询返回列表的所有值都必须满足。

select * from kang where id in(select name from ying where name="dd" or name="yy");

行子查询:常用操作符=,<>,in,not in

```sql
select * from kang where (name,age)=(123,34);
name相对于123,age相对34.
select * from kang where (name,age)=(select name,age from ying where worid="ddd

");


> **表子查询**:返回相当于一个表,常用操作符in

```sql
select * from kang where (job,sal) in (select job,sal from ying where name="d" or name="ff");
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值