目录
一.MySql数据库的相关概念
1.MySql服务的登入和登出
(1)方式一:直接在wamp中打开MysSql的控制台
但是这种方式只适用于root用户,所以推荐使用方式二。
(2)方式二:以管理员运行运行cmd控制台
输入命令:mysql -h主机名 -P端口号 -u用户名 -p密码
如果进入的是本机的mysql那么主机名和端口号可以省略,直接-u用户名 -p密码即可
退出: exit
如果方式二提示“mysql”不是合法的内部命令,则需要配置环境变量。
2.数据库的常见概念
(1)DB:数据库,存储数据的容器
(2)DBMS:数据库管理系统,用于创建和管理DB
(3)SQL:结构化查询语言,用于和数据库通信的语言
注:MySQL已经被Oracle公司收购了
3.数据库存储数据的特点
(1)数据存放在表中,表放到库中
(2)一个库中可以有多张表,每张表都有自己的唯一表名
(3)表中有一个或者多个列,列又称为字段,相当于java中属性
(4)表中的每一行数据,相当于java中的对象
二.MySql的常见命令
1.查看当前所有的数据库
show databases;
2.打开指定的数据库
use 数据库名;
3.查看当前数据库的所有表
show tables;
4.查看其他数据库的所有表
show tables from 数据库名;
5.创建表
create table 表名(
列名 列类型,
列名 列类型,
......
);
6.查看表结构
desc 表名
7.查看数据库版本
select version();
8.查看MySQL支持的存储引擎
show engines;
三.MySql的语法规范
1.不区分大小写(但建议关键字,表名,列名大写)
2.每条命令用分号结尾
3.每条命令根据需要可以换行(推荐是关键字单独一行,但一般用图形化界面会自动换的)
4.注释
(1)单行注释:#注释文字
(2)单行注释:--注释文字
(3)多行注释:/*..注释..*/
补充:SQLyog和Eclipse一样导入后需要手动刷新,不然不会发生变化。
四.数据查询语言(DQL)
进行操作之前要记得使用 use 数据库名 切换要操作的数据库
1.基础查询
语法:
select 查询列表 from 表名;
注:
1.查询列表可以是:表中的字段,常量值,表达式,函数,也可以是它们的组合;
2.查询的结果是一个虚拟的表格,在数据库中并不真实存在;
(1)查询单个字段
select 字段名 from 表名
(2)查询多个字段
select 字段列表 from 表名
(3)查询所有字段
select * from 表名
(4)查询常量值
select 常量值;
字符型和日期型的常量值必须用单引号引起来,数值型不需要。
(5)查询计算表达式
select 计算公式;
支持简单的运算,不支持自加自减之类的复杂运算。
(6)查询函数
select 函数;#不能单单使用时函数不加select
显示的是函数调用后返回的结果,MySQL中函数是一定有返回值的。
(7)为字段起别名(之后如果要查询的字段有重名的情况,可以使用别名区分开来)
select 字段一 (as) 别名,字段二 (as) 别名...;
as可以省略
(8)去重
select distinct 字段名 from 表名;
即在查询的列名前加上distinct关键字即可,但要注意的是这个只能筛选单个字段,不能多个字段;
(9)+号的作用
mysql中的+号与java中的+号不同,不能用于字符串的连接,只有运算符的功能;
如果两个操作数都为数值型,则做加法运算
只要有一方为字符型,则尝试将字符型数值转换为数值型数据
select '123'+90;#如果转换成功,则继续做加法运算,
select 'daa'+90;#如果转换失败,则将字符型转换为0再做加法运算,
selcet null+90;#如果表达式中有NULL,则结果返回NULL;
(10)[补充]concat函数
功能:因为+号没办法连接字段,因此我们使用concat函数用于字段的连接;
select concat(字符或列表名,...);
(11)[补充]ifnull函数
功能:判断某字段或表达式的值是否为NULL,如果为NULL,则返回指定的值
即如果想把NULL值转换为数值可以使用IFNULL函数。
IFNULL(comission_pct,0);#如果是NULL就返回0
(12)[补充]isnull函数
功能:判断某字段或者表达式是否为NULL,如果是则返回1,否则返回0
select isnull(字段名);
注:
(1)如果列名与关键字名字相同,可以使用`列名`与关键字区分开。
(2)如果别名中含有关键字,可以用双引号把别名括起来,这里用``也可以;
2.条件查询
语法:
select
查询列表
from
表名
where
筛选条件;
执行的顺序是先表名然后看筛选条件,最后看查询列表
分类:
(1)按条件表达式筛选:
简单条件运算符:> < = != <> >= <= (<>和!=都表示不等于)
补充:安全等于号<=>,相当于=的升级版,能用于判断NULL值,但可读性比较差,用的比较少。
(2)按逻辑表达式筛选:
逻辑运算符:
作用:用于连接条件表达式
&& || !(java中的写法MySQL中也支持)
and or not(mysql中的写法)
(3)模糊查询(复杂条件运算符)
Ⅰ.like
特点:一般和通配符使用,可以判断字符型,也可以判断数值型:
通配符:
% 包含任意多个字符
_ 任意单个字符
如果like匹配的字符串中有与通配符相同的字符,可以在该字符前加上/转义字符
Ⅱ.between and
特点:
①包含临界值;
②两个临界值不要交换顺序(固定大于等于左边的值,小于等于右边的值)
③两个值的类型必须一致
Ⅲ.in('','',...)
功能:判断某字段的值是否属于in列表中的某一项
特点:
①in列表的值类型必须一致或者兼容
②in列表不支持通配符的使用,因为in相当于=,而不是like
Ⅳ.is null
Ⅴ.is not null
MySQL中的=和<>不能用于判断NULL值,因此需要用is null和is not null来判断NULL值。
补充:
select * from employees;
和select * from employees where commission_pct like '%%'
返回的结果不同,因为会有NULL值的情况,%匹配不了NULL值。
3.排序(查询)
语法:
select
查询列表
from
表名
[where
筛选条件]
order by
排序列表[asc|desc];
特点:
(1)asc是降序,desc是升序
(2)省略,默认是asc
(3)order by子句中的排序列表可以是单个字段,多个字段,表达式,函数,别名
(4)如果是多个字段排序,则用逗号分开,按照书写顺序依次为主关键字,次关键字...,每一个字段都可以指定是升序还是降序
(5)order by一般都放在查询语句的最后,除了limit字句都放在order by字句前
(6)order by的执行一般也是在前面的其他语句结束后,最后排的序
4.常用函数
概念:类似与java中的方法将一组逻辑语句封装在方法体中,对外暴露方法名;
特点:
(1)隐藏了实现细节
(2)提高了代码的重用性
(3)函数可以嵌套调用,即一个函数的返回值可以当作另一个函数的参数
调用的语法:
select 函数名(实参列表) [from 表];#只有函数用到了表中的字段才用加from
分类:
(1)单行函数
如:concat,length,ifnull等
(2)分组函数
功能:做统计使用,因此又称统计函数,聚合函数
(1)单行函数
Ⅰ.字符函数
1.length(str)
功能:返回str中的字节个数(一个英文一个字节,中文看具体使用的字符集)
2.concat(字符列表)
功能:拼接字符串
3.upper(str),lower(str)
功能:分别是将str中的字母转化为大写和小写
4.substr有四个重载
注意:SQL语句中索引都是从1开始的
(1)substr(str,num);#功能:截取从索引num开始往后的所有字符
(2)substr(str,benum,length);#功能:截取从索引benum开始,截取长度为length
5.instr(str1,str2)
功能:用于返回字串str2在str1中第一次出现的起始索引,如果找不到则返回0
6.trim(str1,str2)
功能:去掉str2中前后的str1
7.lpad(str,len,padstr),rpad(str,len,padstr)
功能:用padstr左填充和右填充str,使它的长度等于len,如果str已经超过len则截断
8.replace(str,str1,str2)
功能:把str中的str1全部替换成str2
Ⅱ.数学函数
1.round(num),round(num,len)
功能:四舍五入,小数点后面保留len位
2.ceil(num)
功能:向上取整,即返回>=该参数的最小整数
3.floor(num)
功能:向下取整,即返回<=该参数的最大整数
4.truncate(num,len)
功能:num小数点后保留len位
5.mod(num1,num2)
功能:取余,等同于%
6.rand()
功能:获取0-1之间的随机数
Ⅲ.日期函数
1.now()
功能:返回当前系统日期+时间
2.curdate()
功能:返回当前系统日期,不包含时间
3.curtime()
功能:返回当前时间,不包含日期
4.year(date),mouth(date),day(date),hour(time),minute(time),second(time)
功能:返回指定的部分,年,月,日,小时,分钟,秒
5.mouthname(mouth)
功能:返回月份的英文名
6.str_to_date('date','格式')
功能:将字符串date通过指定格式转换为日期
7.data_format('date','格式')
功能:将日期date转换为指定格式的字符串
8.datediff(date1,date2)
功能:返回date1和date2相差的天数

Ⅳ.其他函数
1.password('字符')
功能:返回该字符的密码形式
2.md5('字符')
功能:返回该字符的md5加密形式
Ⅴ.流程控制函数
1.if(expr1,expr2,expr3)
相当于三元运算符,如果表达式1成立,则返回表达式2的值,否则返回表达式3的值
例子:
SELECT
IF(commission_pct IS NULL,'没奖金','有奖金')
FROM
employees;
2.case函数
(1)使用方法一:类似于java中switch case的效果
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n;
end
如果then后面是值则不需要加';',如果是语句就需要加';'
例子:
SELECT salary AS 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
(2)使用方法二:类似于java中的多重if
case
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n
end
同样,如果then后面是值则不需要加';',如果是语句就需要加';'
例子:
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
这两种方法语法上的区别就是case后面有没有表达式
(2)分组函数
Ⅰ.分类:
sum 求和,avg 求平均,max 最大值,min 最小值,count 非空值的个数
例子:
SELECT
SUM(salary) AS 和,
AVG(salary) AS 平均值,
MAX(salary) AS 最大值,
MIN(salary) AS 最小值,
COUNT(salary) 个数
FROM
employees;
Ⅱ.特点:
①sum,avg一般只用于处理数值型
max,min,count可以用于处理任何类型数据
②以上分组函数均忽略NULL值
③可以和distinct关键字搭配使用,实现去重运算(加在函数实参名前)
④我们一般使用count(*)统计所有行的个数
count(*)只要一行中的元素不全为NULL,就+1,所以这样可以返回行的数量
⑤和分组函数一同查询的字段要求是group by后的字段,其他字段没意义
即我们不能这么写:SELECT SUM(DISTINCT salary),salary,这样sum只返回一行,salary又有很多行,表格匹配不上,失去意义
5.分组查询
(1)语法:
⑤select
分组函数,字段(这些字段必须也要出现在group by的后面)
①from
表名
②[where
筛选条件]
③group by
分组的列表
④[having
分组后的筛选]
⑥[order by
子句]
注意:查询列表必须特殊,要求是分组函数和group by后出现的字段
即需要先分组,然后再调用分组函数,这样就不会出现表格无意义的情况了
例如:是每个工作岗位工资的最大值,它会先每个工作岗位分组,然后再求最大值,这样就能匹配上
(2)例子
Ⅰ.分组前筛选查询
#查询每个有奖金的领导底下的员工工资最高是多少
SELECT
MAX(salary),
manager_id
FROM
employees
WHERE
commission_pct IS NOT NULL
GROUP BY
manager_id;
Ⅱ.分组后筛选查询
#查询哪个部门的员工个数>2
SELECT
COUNT(*),
department_id
FROM
employees
GROUP BY
department_id
HAVING
COUNT(*)>2;
注:这里不能用where进行筛选,因为where是在group by前面的
我们需要它在分完组后再进行筛选,这时我们需要用到having关键字,这个关键字在where后。
(3)特点:
Ⅰ.分组查询中的筛选条件可以分为两类:
①分组前筛选 原始表 用where放在group by字句前
②分组后筛选 分组后的结果表 用having放在group by字句后
具体是哪种看筛选条件是否能根据原始表看出
Ⅱ.分组函数做筛选条件肯定放在having子句中,因为一般都是先分完组再调用分组函数的,分组函数一调用完就只剩下一个值了还筛啥啊
Ⅲ.能用分组前筛选的,优先考虑分组前筛选,性能会好一点
Ⅳ.MySQL中group by和having后面是支持使用别名的,但是Oracle不支持
Ⅴ.group by子句支持多个字段分组,字段之间用逗号隔开没有顺序要求
Ⅵ.group by也支持表达式和函数,但用的较少
Ⅶ.可以添加排序order by,排序之前说了放在整个分组查询的最后
6.多表查询
含义:多表查询又称为连接查询,当查询的字段来自多个表时,就会用到多表查询
笛卡尔乘积:如果表1 n1行m1列,表2 n2行m2列,则连接之后的表有n1*n2行,m1+m2列
原因:我们没加约束条件就直接让两个表连接,输出的就是笛卡尔乘积,因此我们需要在where子句里加上约束条件。
分类:
按年代来分:
(1)sql92标准;#只支持内连接
(2)sql99标准[推荐使用];#不支持全外连接
按功能分类:
(1)内连接:
Ⅰ.等值连接
Ⅱ.非等值连接
Ⅲ.自然连接
(2)外连接:
Ⅰ.左外连接
Ⅱ.右外连接
Ⅲ.全外连接
(3)交叉连接
(1)sql92标准(只支持内连接)
语法:
select
查询列表
from
表列表
where
连接条件
[and
筛选条件]
group by
分组的字段
[having
分组后的筛选]
[order by
子句]
where子句中放连接条件,and子句里的才是筛选条件
Ⅰ.等值连接
用表1和表2中字段值相同作为筛选条件
(1)例子:
SELECT
employees.`last_name`,
employees.`job_id`,
jobs.`job_id`
FROM
employees,
jobs
WHERE
employees.`job_id` = jobs.`job_id`;
(2)做法:
拿表1中的每一行与表2进行匹配,如果满足连接条件则显示,如果不满足就过滤掉,所以结果为多个表的交集部分
(3)特点:
①从例子中我们可以看出多表查询如果使用的表名较长会导致看起来很复杂,因此我们一般会给表起别名
方法与字段起别名相同也是用as,但需要注意的是起了别名后,原本的名字就用不了了
而且起别名在自连接时能够避免表名冲突的问题
②两个表中同名的字段前需加上表名指明
③表的顺序无所谓
④可以添加筛选,但是where已经用来做连接条件了,因此我们使用and关键字
SELECT
e.`last_name`,
d.`department_name`,
e.`commission_pct`
FROM
employees AS e,
departments AS d
WHERE
d.`department_id` = e.`department_id`
AND
e.`commission_pct` IS NOT NULL;
⑤可以搭配前面介绍的所有子句使用,如添加分组,排序等
⑥可以实现n表连接,需要n-1个连接条件,多出来的连接条件就需要写在and子句里了,where里只能又一个连接条件。
⑦一个and子句里只能写一个连接条件或筛选条件,如果有多个可以写多个and子句
Ⅱ.非等值连接
其实就是之前等值连接的连接条件是字段值相同,而非等值连接的连接条件不是等于了,变成大于,小于啥的了。
(1)例子:
SELECT
salary,
grade_level
FROM
employees AS e,
job_grades AS g
WHERE
salary BETWEEN g.`lowest_sal` AND g.`higest_sal`;
(2)特点:
其他子句与等值连接相同,就连接条件变了一下
Ⅲ.自连接
与等值连接基本相同,只不过时把自己这张表当作多张表来连接查询。
自连接我们一般给表起多个别名来避免表名相同引起的冲突
例子:
SELECT
e.`employee_id`,
e.`last_name`,
m.`employee_id`,
m.`last_name`
FROM
employees AS e,
employees AS m
WHERE
e.`manager_id` = m.`employee_id`;
(2)sql99标准(不支持全外连接)
(1)语法:
select
查询列表
from
表1 as 别名
连接方式1 join
表2 as 别名 on 连接条件
连接方式2 join
表3 as 别名 on 连接条件
...(如果又多个表连接就继续加)
[where
筛选条件]
[group by
分组字段]
[having
筛选条件]
[order by
排序列表]
(2)不同点:
Ⅰ.sql99是在join后加上表2,不是用逗号隔开;
Ⅱ.sql99的来连接条件在on子句里,where子句放筛选条件,这样就不需要and了,可读性更高
(3)连接方式的关键字
Ⅰ.内连接:[inner]
Ⅱ.外连接
①左外连接:left [outer]
②右外连接:right [outer]
③全外连接:full [outer]
Ⅲ.交叉连接:cross
(4)特点:
①内连接inner可以省略,默认是inner
②sql92和sql99等值连接的效果是一样的,都是查询几个表的交集部分
Ⅰ.内连接
(1)语法:
select
查询列表
from
表1 as 别名
inner join
表2 as 别名 on 连接条件
...;
①等值连接
例子:
SELECT
last_name,
department_name,
job_title
FROM
employees AS e
INNER JOIN
departments AS d ON e.`department_id`=d.`department_id`
INNER JOIN
jobs AS j ON j.`job_id`=e.`job_id`
ORDER BY
department_name DESC;
注意:
这里的多表连接是依次进行的,你要连接的表必须要和前面的表连接形成的表能连接,所以和书写顺序还是有一些关系的
②非等值连接
例子:
#查询人数>2的工资级别,按工资级别降序排序
SELECT
COUNT(*),
grade_level
FROM
employees AS e
INNER JOIN
job_grade AS d ON e.`salary` BETWEEN g.`lowest_sal` AND g.`highest_sal`
GROUP BY
grade_level
HAVING
COUNT(*)>20
ORDER BY
grade_level DESC;
③自然连接
例子:
#查询姓名中包含字符k的员工名字,以及他们上级的名字
SELECT
e.`last_name`,
m.`last_name`
FROM
employees AS e
INNER JOIN
employees AS m ON e.`manager_id`=m.`employee_id`
WHERE
e.`last_name` LIKE '%k%';
Ⅱ.外连接
①左,右外连接
适用于查询一个表中有,另一个表中没有的记录
特点:
(1)区分主,从表,运行时是用主表中的每一条记录去匹配从表中的每一条记录
如果从表中有跟它匹配的,则合起来形成一条记录显示,
如果从表中没有跟它匹配的,则在从表的字段中填入NULL再显示;
主表中的每一条记录都会被显示.
(2)左外连接,left join左边的是主表
右外连接,right join右边的是主表
(3)左,右外连接交换两个表的顺序,可以实现相同的结果,所以理解一个就行了
例子:
SELECT
b.name,bo.*
FROM
beauty b
LEFT OUTER JOIN
boys AS bo ON b.`boyfriend_id`=bo.`id`;
②全外连接
全外连接=内连接结果+表1中有但表2中没有+表2中有但表1中没有的,但是不支持就不说了
Ⅲ.交叉连接
就是笛卡尔乘积,因为sql99不支持直接用逗号分割表了,因此使用交叉连接来表示笛卡尔乘积
例子:
SELECT
b.*,
bo.*
FROM
beauty
CROSS JOIN boys;
这样返回的就是两个表的笛卡尔乘积


7.子查询
出现在其他子句内部的select语句,称为子查询或内查询
内部嵌套其他select语句的查询,称为主查询或外查询
子查询一般都用小括号括起来,提高可读性
分类:
(1)按结果集的行列数不同
Ⅰ.标量子查询(结果集只有一行一列)
Ⅱ.列子查询(结果集为多行一列)
Ⅲ.行子查询(结果集为一行多列)
Ⅳ.表子查询(结果集一般为多行多列)
(2)按子查询出现的位置进行分类:
Ⅰ.select后面:
仅支持标量子查询
Ⅱ.from后面:
仅支持表子查询
Ⅲ.where或having后面:
支持标量子查询 (单行子查询)(★)
列子查询 (多行子查询)(★)
行子查询
Ⅳ.exists后面(这种又称为相关子查询):
全部支持
(1)放在where或having后面
特点:
Ⅰ.子查询放在小括号内
Ⅱ.子查询一般放在条件的右侧
Ⅲ.标量子查询,一般搭配单行操作符使用
单行操作符:>,<,=,>=,<=,!=,<>,<=>
列子查询,一般搭配多行操作符使用
多行操作符:in,any/some,all
in/not in:等于/不等于列表中的任意一个
any|some:效果相当于>min,即选出大于最小值
all:效果相当于>max,选出大于最大值
Ⅳ.子查询的执行优先于主查询执行,因为主查询的条件用到了子查询的结果
Ⅰ.标量子查询(查询的结果必须为一行一列)
①where后的标量子查询
#返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
SELECT
last_name,
job_id,
salary
FROM
employees
WHERE
job_id=(
SELECT
job_id
FROM
employees
WHERE
employee_id = 141
)AND
salary>(
SELECT
salary
FROM
employees
WHERE
employee_id = 143
);
②having后的标量子查询
#查询最低工资大于50号部门最低工资的部门idh和其最低工资
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id=50
);
Ⅱ.列子查询(查询结果为多行一列)
例子:
#返回其他工种中比job_id为'IT_PROG'工种任意任意工资低的员工的员工号,姓名,job_id和salary
SELECT last_name,employee_id,job_id,salary
FROM employees
WHERE salary<ANY(
SELECT salary
FROM employees
WHERE job_id='IT_PROG'
)AND job_id<>'IT_PROG';
#或者我们可以使用min来代替any和some
SELECT last_name,employee_id,job_id,salary
FROM employees
WHERE salary<(
SELECT MAX(salary)
FROM employees
WHERE job_id='IT_PROG'
)AND job_id!='IT_PROG';
Ⅲ.行子查询(结果集为一行多列)
例子:
#查询员工编号最小并且工资最高的员工信息
#用之前的写法
SELECT *
FROM employees
WHERE employee_id=(
SELECT MIN(employee_id)
FROM employees
)AND salary=(
SELECT MAX(salary)
FROM employees
);
#现在利用行子查询
SELECT *
FROM employees
WHERE (employee_id,salary)=(
SELECT MIN(employee_id),MAX(salary)
FROM employees
);
(2)放在select后面(仅支持标量子查询)
例子:
#查询每个部门员工的个数
SELECT d.*,(
SELECT COUNT(*)
FROM employees AS e
WHERE e.department_id=d.`department_id`
) AS 个数
FROM departments AS d;
(3)放在from后面(支持表子查询,把结果当成数据源)
例子:
#查询每个部门的平均工资等级
SELECT
FROM (
SELECT AVG(salary) AS ag,department_id
FROM employees
GROUP BY department_id
) AS ag_dep#这里必须起别名,不然这张表没有名字
INNER JOIN job_grades AS g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
(3)放在exists后面(又称相关子查询)
语法:
select exists(完整的查询语句)
如果查询语句返回不为空则显示1,否则为0
例子:
#查询有员工的部门名
SELECT department_name
FROM departments AS d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d.`department_id`=e.`department_id`
);
能用exists/not exists的都能用in/not in来实现,所以这个用的不多
8.分页查询(★)
适用于:当要显示的数据,一页显示不全,需要分页提交sql请求
(1)语法:
select 查询列表
from 表名
[连接类型 join 表2 on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by排序的字段]
limit [offset],size;#就是我们之前说的唯一写在order by后的关键词
其中
offest:要显示条目的起始索引(从0开始,可以不写)
size:要显示的条目个数
(2)例子:
#查询有奖金的员工信息,并且显示工资的前10名
SELECT
*
FROM
employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10;
(3)特点:
Ⅰ.limit语句放在查询语句的最后
Ⅱ.公式
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit (page-1)*size,size;
9.联合查询
union 联合:将多条查询语句的结果合并成一个结果
(1)适用于要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的字段一致时
(2)语法:
查询语句一
union
查询语句二
union
查询语句三
...
(3)特点:
Ⅰ.要求这多条查询语句的查询列数是一致的
Ⅱ.要求这多条查询语句查询的每一列的类型和顺序最好一致
Ⅲ.union关键字默认包含去重,如果不想去重可以使用union all
(4)例子:
#查询中国用户中男性的信息以及国外用户中年男性的用户信息
SELECT id,cname
FROM t_ca
WHERE csex='男'
UNION
SELECT t_id,tname
FROM t_ua
WHERE tGender='male';
五.数据操纵语言(DML)
数据操纵语言:
插入:insert
修改:update
删除:delete
1.插入
(1)方式一(用的较多)
(1)语法:
insert into 表名(字段名1,...)
values(值1,...)
(2)例子:
INSERT INTO beauty(NAME,sex,id,phone)
VALUES('张飞','男','119','1312431413');
(3)特点:
Ⅰ.插入的值的类型要与字段的类型一致或兼容(即能转换)
Ⅱ.不可以为NULL的列必须要插入值
Ⅲ.字段的顺序可以和表中的顺序不一致
Ⅳ.要插入的字段个数和你值的个数必须要匹配
Ⅴ.可以只写表名,这样默认所有列都有值,且列的顺序和表中列的顺序一致
(2)方式二
(1)语法:
insert into 表名
set 列名1=值1,列名2=值2,...
(2)例子:
INSERT INTO beauty
SET id=19,NAME='刘涛',phone='999';
(3)插入的两种方式比较
Ⅰ.方式一支持插入多行,方式二不支持
insert into 表名(字段名1,...)
values(值1,...),
(值1,...),
...;
Ⅱ.方式一支持子查询,方式二不支持
insert into 表名(字段名1,...)
select 查询语句
这样就不用写values了,即把查询结果集插入表中
2.修改
(1)修改单表记录(★)
(1)语法:
update 表名
set 列=新值,列=新值,...
where 筛选条件;#不加where所有行都会被改
(2)例子:
#修改beauty表中姓唐的女生的电话为138
UPDATE beauty
SET phone='138'
WHERE NAME LIKE '唐%';
(2)修改多表记录(补充,不是很重要)
(1)语法:
update 表1 as 别名
连接类型 join 表2 as 别名 on 连接条件
set 列=新值,列=新值,...
where 筛选条件;
即在连接后的新表上进行修改
3.删除
删除是以行为单位的
(1)方式一 delete
Ⅰ.语法:
①单表的删除(★)
delete from 表名
[where 筛选条件]
[limit 条目数]
②多表的删除(类似,也不太重要)
delete 表1的别名,... #要删除哪个表里的数据就在这里写上哪个表
from 表1 as 别名
连接方式 join 表2 as 别名 on 连接条件
where 筛选条件;
Ⅱ.例子:
①#删除表中手机号以9结尾的女生信息
DELETE FROM beauty
WHERE phone LIKE '%9';
②#删除黄晓明的信息以及他女朋友的信息
DELETE b,bo
FROM beauty AS b
INNER JOIN boys AS b ON b.`boyfriend_id`=bo.`id`
WHERE bo.`botName`='黄晓明';
(2)方式二 truncate,也叫做清空
Ⅰ.语法:
truncate table 表名
方式二不能添加where条件,一删就是整个表,删库跑路必备?
(3)删除的两种方式比较(★)
Ⅰ.delete可以加where条件,truncate不能加
Ⅱ.truncate删除整个表效率比delete高
Ⅲ.加入要删除的表中有自增长列,
如果用delete删除,之后再插入数据,自增长列的值从断点开始
如果用truncate删除,之后再插入数据,自增长列的值从1开始
Ⅳ.truncate删除没有返回值,delete删除会返回删除的行数
Ⅴ.truncate删除不能回滚,delete删除可以回滚
333

被折叠的 条评论
为什么被折叠?



