一、MySQL概述

1、MySQL体系结构

数据(记录record) —> 数据表(table) —> 数据库(database)

2、数据库相关概念

  • 数据库:database
  • 数据表:table
  • 字段:field(每列的表头)
  • 记录:record(每行即1条记录)

1)一个MySQL数据库实例,可以同时创建多个database数据库

2)一个database数据库可以同时拥有多个table数据表

3)每个表都有自己的表头信息,如ID、Name、Gender、Addtime,称为field字段

4)每个表可以拥有多个记录,如Tom、King、Kylie、Jennie等个人信息

二、MySQL语句

1、SQL语句的分类

  • DDL(Data Definition Languages)语句:

    ==数据定义语言==,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter、rename、truncate

  • DML(Data Manipulation Language)语句:

    ==数据操纵语句==,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、update等。

  • DCL(Data Control Language)语句:

    ==数据控制语句==,用于控制权限,不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括 grant、revoke 等。

  • DQL(Data Query Language)语句:

    ==数据查询语句==,用于从一个或多个表中检索信息。主要的语句关键字包括 select

2. MySQL中如何求帮助

MySQL5.6官方文档

MySQL5.7官方文档

man文档
[root@db01 ~]# man mysql

SQL的语句求帮助
mysql> help;
mysql> ?
mysql> help create table;

寻求账户管理的帮助(一级一级的向内部查)
mysql> ? Account Management
mysql> ? CREATE USER

mysql> SELECT VERSION(); #获取数据版本号

三、数据库操作

1、创建数据库

创建规范:
1.注意库名不能数字开头,大小写不敏感
2.如果编译时指定字符集是 utf8,创建数据库时默认指定是 utf8

格式:
mysql>create database 数据库名;

创建数据库db1
mysql>create database 数据库名;
mysql>create database db1;
创建数据库db1并指定默认字符集
mysql>create database 数据库名 default charset 字符集;
mysql>create database db1 default charset gbk;
创建数据库db1,如果存在不报错(if not exists)
mysql>create database if not exists 数据库名 default character set 字符集;
mysql>create database if not exists db1 default character set utf8;
说明:不能创建相同名字的数据库!

2、查询数据库

查看所有数据库:
mysql> show databases;

查看创建信息(包含存储引擎,字符集等)
mysql>show create database 数据库名;
栗子:
mysql> show create database yunwei_6;
+----------+----------------------------------------------------------------------+
| Database | Create Database                                                      |
+----------+----------------------------------------------------------------------+
| yunwei_6 | CREATE DATABASE `yunwei_6` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+----------------------------------------------------------------------+
1 row in set (0.00 sec)

3、删除数据库

格式:
mysql>drop database 数据库名;

删除数据库db1
mysql>drop database db1;

4、更改数据库字符集

更改数据库db1的默认字符集
mysql>alter database 数据库名 default charset=字符集;

mysql>alter database db1 default character set gbk;
mysql>alter database db2 default charset utf8;

注:数据库名称不能更新,只能删除后在重新创建。

四、数据表操作

1、创建-数据表

1>切换数据库

格式:
mysql>use 数据库名;

切换到数据库db1
mysql> use db1;

2>创建数据表

格式:
mysql>create table 表名 (字段1,字段2,...);
mysql>create table 表名 (字段1 数据类型(字符长度),字段2,...);
mysql>create table 表名 (字段1 数据类型(字符长度) 约束条件,字段2,...);

栗子:
mysql> create table yumwei( id int, name varchar(15));


根据已有的表创建新表:
A:CREATE TABLE tab_new like tab_old (使用旧表创建新表);
B:CREATE TABLE tab_new as select col1,col2… from tab_old definition only;


建表时设定字段的特殊属性:
1<存储引擎:engine
	mysql>create table 表名 (
	字段1 数据类型(字符长度),
	字段2,...
	)engine=引擎名;

2<字符集:charset
	mysql>alter table  表名  default  charset=字符集;

3<不可为空:not null
	mysql>create table 表名 (
	字段1 数据类型(字符长度) not null,
	字段2,...
	);
	
4<值唯一:primary key(设置为键)
	mysql>create table 表名 (
	字段1 数据类型(字符长度) primary key,
	字段2,...
	);

5<自动增长:auto_increment(为空自动创建 0)
	mysql>create table 表名 (
    字段1 数据类型(字符长度) auto_increment,
	字段2,...
	);

6<默认值:default(此项记录为空时自动用默认值补充)
    mysql>create table 表名 (
    字段1 数据类型(字符长度) default='默认值',
    字段2,...
    );

3>创建数据包

create table t1(
  id int not null auto_increment primary key,
  name varchar(40) not null,
  age tinyint unsigned default 0,
  mobile char(11),
  remark varchar(255)
);

备注:
not null,当前字段插入或更新数据时不能为空
auto_increment,自动增长,插入时设置为null即可
primary key,主键,要求此字段的每个值必须唯一
unsigned,无符号型,说白了就是必须为0或正整数
default,默认值,不写默认就是这个值

2、字段类型(了解)

  • 字段类型
    1. 整数型
      • int
        • -2147483648 到 2147483647 常规
        • 0 到 4294967295 无符号*
        • int( ),在括号中规定最大位数。
      • tinyint
        • -128 到 127 常规
        • 0 到 255 无符号*
        • tinyint( ),在括号中规定最大位数。
      • smallint
      • mediumint
      • bigint
    2. 小数型
      1. 浮点型
        • float
        • double
      2. 定点型
        • decimal
    3. 字符型
      • char
        • 定长型,长度范围是0到255之间
        • 字符串占指定长度,长度不足时用特殊空格补,读取时删除特殊空格
      • varchar
        • 变长型,最大可用存储范围是65535-3=65532字节
        • 字符串长度根据需要分配,从第二个字符开始存储,第一个字符记录该字符串长度
        • 长度超过最大长度的字符,使用TEXT类型进行保存
      • set
      • enum
        • 枚举类型
      • blob
      • text
        • 长度超过VARCHAR最大长度的字符,都可以使用TEXT类型进行保存
    4. 时间日期型
      • date
        • '0000-00-00'
      • time
        • '00:00:00'
      • datetime
        • '0000-00-00 00:00:00'
      • timestamp
        • '0000-00-00 00:00:00'
      • year
        • '0000'

☆ 整数型

MysQL支持的整数类型所需的存储和范围

Type存储(bytes)最小值(有符号)最小(无符号)最大(有符号)最大(无符号)
TINYINT1-1280127255
SMALLINT2-3276803276765535
MEDIUMINT3-83886080838860716777215
INT4-2147483648021474836474294967295
BIGINT8-2“63”02“63”-12“64”-1

ps: -2“63” 意为:-2的63次方

TINYINT(size)
	-128 到 127 常规。0 到 255 无符号*。
	在括号中规定最大位数。

INT(size)
	-2147483648 到 2147483647 常规
	0 到 4294967295 无符号*
	在括号中规定最大位数。

☆ 小数型

① 定点类型

DECIMALNUMERIC 类型的存储==精确的数值数据==。使用这些类型时,重要的是要保留==精确的精度==,

例如使用货币数据

在MySQL中, NUMERIC被作为DECIMAL来应用,所以下面的举例DECIMAL同样适用于 NUMERIC

1-DECIMAL
mysql> create table yumwei( id int, price DECIMAL(5,2));
在上面的例子中,薪水price字段的类型为decimal,表示精确的数字。
其中,5代表精度,2代表刻度。
	精度---表示数值存储的有效位数(小数点前后相加的总长度),
	刻度---表示小数点后面可存储的位数(小数点后面的位数)。
DECIMAL(5,2)能够存储五位数和两位小数的任何值,因此可以存储在price列中的值的范围-999.99是 999.99

特殊注意:
DECIMAL(M)和DECIMAL(M,0)是相等的,存储长度取决于M的值,默认情况下M值为10.刻度为0表示没有小数。

==② 浮点类型(近似值)=> FLOAT和DOUBLE==

FLOATDOUBLE类型代表近似数字数据值。MySQL对于单精度值使用四个字节,对于双精度值使用八个字节。 FLOAT单精度浮点数精确到约7位小数,DOUBLE双精度浮点数精确到大约15位小数 。FLOAT类型会随着数值的增大精度会减小。

FLOAT(M,D),其中,M表示存储的有效位数,D代表小数点后面的位数;即整数位数+小数部分不能超过M值。
colum1 FLOAT(7,4)
上面例子中,如果你插入为999.00009到cloum1列,那么mysql在存储时会四舍五入变为999.0001插入。

==③ 对比总结==

数值类型精度存储空间精确性
FLOAT单精度4字节
DOUBLE双精度8字节低,比float高
DECIMAL高精度变长

☆ 字符串类型

==① CHAR类型==

定长类型.长度范围是0到255之间的任何值.占用定长的存储空间,不足的部分用==空格==填充;读取时删掉后面的空格。

存储空间:一个中文在utf8字符集中占用3个bytes、gbk占用2个bytes、数字和字符统一用一个字符表示。

存储机制:在不够M长度时,MySQL在存储数据时,需要填充特殊的空格.

举个栗子:

name CHAR(M),M表示字符数(长度)

==② VARCHAR类型==

==变长存储==

存储空间:一个中文在utf8字符集中占用3个bytes、gbk统一占用2个bytes、数字和字符一个字符表示。

存储机制:VARCHAR(M)字段存储实际是从第二个字节开始存储,然后用1到2个字节表示实际长度,剩下的才是可以存储数据的范围,因此最大可用存储范围是65535-3=65532字节;

第一个字节标识是否为空.(长度小于255字节,使用一个字节来表示长度;大于255字节使用两个字节来表示长度)。

==③ TEXT类型==

长度超过VARCHAR最大长度的字符,都可以使用TEXT类型进行保存。

☆ 日期时间类型

Data Type‘Zero’Value
DATE‘0000-00-00’
TIME‘00:00:00’
DARETIME‘0000-00-00 00:00:00’
TIMESTAMP‘0000-00-00 00:00:00’
YEAR0000

日期时间类型字段定义主要看需要哪种格式!

3、查询-数据表

查看所有表
mysql> show tables;

查询表的结构
mysql>desc 表名称;

查看表的的创建信息(包含数据类型)
mysql> show create table class;

4、修改-数据表和字段

更改表属性(修改字段、修改引擎)

增加一列成为第一列
alter table 表名称 add 列名称 数据类型 位置;
alter table t1 add id int first;

ps:位置表示方式
first;		# 第一列
after age;	#在age后面
在age后面增加一列叫sex
alter table t1 add sex enum('男','女','保密') after age;

删除列(字段)
alter table 表名称 drop 列名称;

修改列名称和数据类型
alter table 表名称 change 旧列名称 新列名称 数据类型;
修改列的数据类型
alter table 表名称 modify 列名称 数据类型;

查看数据库有哪些存储引擎
show engines;

常用存储引擎:
MyISAM	#
InnoDB	#数据安全性高

修改表的存储引擎
alter table 表名称 engine 引擎名称;
查看修改存储引擎是否成功
show create table 表名称;
修改表的默认字符集
alter table 表名称 default charset=字符集;

更改表名称:

只重命名表名 
rename table 旧表名称 to 新表名称;
或者
alter table 旧表名称 rename  新表名称;
--------------------------------------------------------------
移动表到另一个库里并重命名
rename table 库名称.旧表名称 to 库名称.新表名称;
或者
alter table 库名称.旧表名称 rename 库名称.新表名称;

5、删除-数据表

drop table 表名称;

清空数据库

truncate table 库名称;
delete * from 库名称;


其中truncate操作中的table可以省略,delete操作中的*可以省略。这两者都是将wp_comments表中数据清空,不过也是有区别的,如下:

truncate是整体删除(速度较快), delete是逐条删除(速度较慢)。
truncate不写服务器log,delete写服务器log,也就是truncate效率比delete高的原因。
truncate不激活trigger(触发器),但是会重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录,而不是接着原来的ID数。而delete删除以后,Identity依旧是接着被删除的最近的那一条记录ID加1后进行记录。


如果只需删除表中的部分记录,只能使用DELETE语句配合where条件。 DELETE FROM wp_comments WHERE……

五、数据操作

1、增加数据

以下是往表里插入数据的几种不同方法
插入记录
insert into 表名 set 字段1=xx,字段2=xx;
insert into t1 set id=3,name='li';

一次性插入多个记录(必须所有字段都有数据)
insert into 表名 values(值1,值2),(值1,值2);
insert into t1 values(1,'zhang'),(2,'wang');

一次性插入多个记录(给指定字段插入)
insert into 表名 (指定字段1,指定字段2) values(字段1值,字段2值);
insert into t2 (id,name) values(3,'li');


insert into 表1 select * from 表2;
insert into t1(name) select name from t2;


说明:
1.插入的数据来自于另外一张表
2.一定要保证两张表的结构一致(插入表里字段数和后面表查找出来的字段要相匹配)
3.两张表结构完全一致;或者人造让两边字段一致

2、查询数据

查询表里所有记录
select * from 表名;

3、更改数据

update 表名 set 字段1=新值,字段2=新值,... where条件;

案例:
update t1 set name='harry' where id=1;
update t1 set name='jack',id=33 where id=3;
update t1 set id=222,name='wanger' where id=2;

4、删除数据

删除表里所有的记录
方法1:
delete from 表名;

方法2:(truncate只能删除所有)
truncate 表名;

删除符合条件的所有记录 
delete from 表名 where 条件;
delete from t1 where id>3;


5、delete与truncate

- delete:删除数据记录
  - 数据操作语言(DML)
  - 在事务控制里,DML语句要么commit,要么rollback
  - 删除大量记录速度慢,只删除数据不回收高水位线
  - 可以带条件删除
- truncate:删除所有数据记录(相当于清空并重构了这个表)
  - 数据定义语言(DDL)
  - 不在事务控制里,DDL语句执行前会提交前面所有未提交的事务
  - 清里大量数据速度快,回收高水位线(high water mark)
  - 不能带条件删除

高水位线:
解释:
https://www.cnblogs.com/kscnchina/p/4570777.html
https://blog.51cto.com/kasimoyv5/1670824

六、视图

需求描述:

  在看mysql的视图,对于视图的定义,进行基本的了解,在此记录下.

概念解释:

  视图:存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色.

测试过程:

说明:

  • 如果要对一张表或者多张表进行查询,可以通过写复杂的SQL语句来实现
  • 如果要这些SQL语句存储为视图,那么查询的时候,就直接查询这个视图就可以了.

1.创建表,插入数据,并且执行查询

mysql> CREATE TABLE t (qty INT, price INT);
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO t VALUES(3, 50), (5, 60);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t;
+------+-------+
| qty  | price |
+------+-------+
|    3 |    50 |
|    5 |    60 |
+------+-------+
2 rows in set (0.00 sec)

2.创建视图,视图中的查询根据具体的情况有相应的表达式

mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
Query OK, 0 rows affected (0.01 sec)

3.查询视图v

mysql> SELECT * FROM v;
+------+-------+-------+
| qty  | price | value |
+------+-------+-------+
|    3 |    50 |   150 |
|    5 |    60 |   300 |
+------+-------+-------+
2 rows in set (0.00 sec)

对于视图的查询也可以加上过滤条件:
mysql> SELECT * FROM v WHERE qty = 5;
+------+-------+-------+
| qty  | price | value |
+------+-------+-------+
|    5 |    60 |   300 |
+------+-------+-------+
1 row in set (0.00 sec)

备注:所以仅仅查询这个视图,和执行定义语句中的SQL语句的效果相同.即就相当于查询了一张表.同时,视图也就等同于后面的查询语句,视图是存储在数据库中的,所以就理解了开头说的存储的查询.

4.查看当前库下所有的视图

mysql> show full tables where table_type like 'VIEW';
+----------------+------------+
| Tables_in_test | Table_type |
+----------------+------------+
| v              | VIEW       |
| vw_01          | VIEW       |
+----------------+------------+
2 rows in set (0.00 sec)

5.基于其他的视图来创建视图

mysql> select * from vw_01;  #vw_01是一个视图.
+---+------+
| a | b    |
+---+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
+---+------+
4 rows in set (0.00 sec)

mysql> create view v01 as select a,b from vw_01;  #基于视图来创建视图,也就是说,视图定义中的SELECT查询的是另外的视图.
Query OK, 0 rows affected (0.02 sec)

mysql> select * from v01;
+---+------+
| a | b    |
+---+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
+---+------+
4 rows in set (0.00 sec)

报错记录

1,ERROR 1136 (21S01): Column count doesn't match value count at row 1
插入记录时,有字段没有指定值,需要给所有字段指定值,或者更换写法

/////////////////////

一、查询语句

1. 常见符号

符号说明
%匹配0个或任意多个字符
_(下划线)匹配单个字符
like模糊匹配
=等于,精确匹配
>大于
<小于
>=大于等于
<=小于等于
!=和<>不等于
! 和 not逻辑非
|| 和 or逻辑或
&& 和 and逻辑与
between...and....两者之间
in (....)在...
not in (....)不在

2. 其他关键字

符号说明
regexp使用正则来匹配
order by排序
asc升序排列
desc降序排列
group by聚合
having筛选
distinct去除重复的行

3. 查询举例

1、 基本查询

1 基本简单查询

select 字段1,字段2,... from 表名;

查看所有数据
select * from emp;
查看指定列
select empno,ename,job,sal from 0.
给列指定别名
select empno 工号,ename 姓名,job 工作,sal 工资 from emp;
或者
select empno as 工号,ename as 姓名,job as 工作,sal as 工资 from emp;

2,去重

select distinct 字段 from 表名称;

select distinct deptno from emp;

3、 四则运算

操作对象:字段
语法:
select 运算式 from 表名称;

select 1+2;
select 1-3;
select 1*4;
select 1/4;
select 1 + 1, (10-1)/3, 2*2/2;
select 1 + 1 from dual;		dual表,俗称万能表
乘幂需要调用函数:-3表示2的三次幂取倒数
mysql> select pow(2,3),power(2,3),pow(2,-3),power(2,-3);
+----------+------------+-----------+-------------+
| pow(2,3) | power(2,3) | pow(2,-3) | power(2,-3) |
+----------+------------+-----------+-------------+
|        8 |          8 |     0.125 |       0.125 | 
+----------+------------+-----------+-------------+
1 row in set (0.00 sec)

2、五子句

1-带where条件查询
使用逻辑运算符
select * from t3 where english >60 && english <90;
select * from t3 where math >= 60 and english >= 60;
select * from t3 where math >= 60 or english >= 60;
select * from t3 where math >= 60 and not english >= 60;

使用正则表达式匹配
select 字段 from 表名称 where 字段 regexp '表达式';
select * from t3 where name regexp '^h';
select * from t1 where name regexp '.*[0-9]';
select * from t1 where name regexp '.*[0-9]+.*';
select * from t1 where name regexp '.*[0-9]{2}.*' ;

sal不在3000与5000之间的记录 
select * from emp where sal not between 3000 and 5000;

sal在500-1000或者3000-5000之间
select * from emp where sal >= 3000 and sal <= 5000 or sal >=500 and sal <=1000;
模糊查询
select * from 表名称 where 字段 like '条件'

select * from class where name like 'a%'
select * from class whrer name regexp '^a'
select * from class whrer name regexp 'a.*'
2、分组和统计 group by

根据给定==数据列==的查询结果进行分组统计,最终得到一个==分组汇总表==

注:一般情况下group by需与==统计函数==一起使用才有意义

常见统计函数说明
max求最大值
min求最小值
sum求和
avg求平均值
asc升序
desc降序
count求总行数
操作对象:字段

语法:
select 统计函数(字段) from 表名称 group by 被分组字段;

每个部门最大工资和部门人数:
select deptno,max(sal),count(*) from emp group by deptno;
+--------+----------+----------+
| deptno | max(sal) | count(*) |
+--------+----------+----------+
|     10 |  5000.00 |        3 |
|     20 |  3000.00 |        5 |
|     30 |  2850.00 |        6 |
+--------+----------+----------+
查找10号和20号部门最大工资和人数
select deptno,max(sal),count(*) from emp where deptno in (10,20) group by deptno;
+--------+----------+----------+
| deptno | max(sal) | count(*) |
+--------+----------+----------+
|     10 |  5000.00 |        3 |
|     20 |  3000.00 |        5 |
+--------+----------+----------+
3、 having
  1. having与where类似,根据条件对==数据==进行过滤筛选
  2. ==where==针对表中的==列==发挥作用,查询数据
  3. ==having==针对查询==结果集==发挥作用,筛选数据
  • 举例说明
查询员工数大于5个的部门编号和最大工资及员工数
select deptno,max(sal),count(*) from emp group by deptno having count(*)>5;
查询底薪+提成大于2000的员工相关信息
select empno,ename,sal+ifnull(comm,0) sum from emp having sum >2000;
查询每个部门最大工资的员工信息
select ename,empno,deptno,sal from emp where sal in (select max(sal) from emp group by deptno);
+-------+-------+--------+---------+
| ename | empno | deptno | sal     |
+-------+-------+--------+---------+
| BLAKE |  7698 |     30 | 2850.00 |
| SCOTT |  7788 |     20 | 3000.00 |
| KING  |  7839 |     10 | 5000.00 |
| FORD  |  7902 |     20 | 3000.00 |
+-------+-------+--------+---------+
4 rows in set (0.00 sec)

查询20和30号部门基本工资加提成大于2000的人员信息
select deptno,empno,ename,sal+ifnull(comm,0) sum from emp where deptno in(30,20)having sum >2000;
  • IFNULL函数扩展
IFNULL()函数:
MySQL中的IFNULL函数类似于Oracle中的NVL函数,其表达式为:IFNULL(expr1,expr2),如果第一个参数不为空,则返回第一个参数,否则返回第二个参数。
ifnull(comm,0)

IFNULL(expr1,expr2)
If expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.

IF()函数:
IF(expr1,expr2,expr3)类似于Oracle中的NVL2函数,如果第一个表达式的值为TRUE(不为0或null),则返回第二个参数的值,否则返回第三个参数的值
       
IF(expr1,expr2,expr3)
If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL), IF() returns expr2. Otherwise, it returns expr3.

NULLIF()函数:
NULLIF(expr1,expr2),如果expr1=expr2为真,返回null;否则返回expr1

NULLIF(expr1,expr2)
Returns NULL if expr1 = expr2 is true, otherwise returns expr1. This is the same as CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.
4、排序 order by
操作对象:字段

从小到大(升序)
order by asc
select * from 表名称 order by 字段;		#不指定默认升序
select * from 表名称 order by 字段 asc;
--------------------------------------------------------
从大到小(降序)
order by desc
select * from 表名称 order by 字段 desc;
5、函数附加条件 limit

常配合其他函数使用,如排序

操作对象:结果集

语法:limit 起始位置 数量		 #起始位置从0开始
select * from 表名称 limit n;			显示前n行
select * from 表名称 limit n,m;		显示n+1行至表中的n+m行

select * from 表名称 limit 10;			显示前10行
select * from 表名称 limit 10,10;		显示11至20行

3、高级查询

1、合并列函数(concat)

select concat(字段1,'分隔符,可不加',字段2) as 临时字段 from 表名称; 
临时字段如有数字或字符,可以用引号引起来
select concat(user,'    ',password) as 用户名和密码 from mysql.user;
create table t3(path1 varchar(255),homedir varchar(255));
insert into t3 set path1='/www/itcast',homedir='u01';
select concat(path1,'/', homedir) from t3;
select concat(path1,'/', homedir) as '家目录' from t3;

2、多表联合查询

1<常规查询表:

常规查询表:
select * from emp,dept where emp.deptno=dept.deptno;

select dept.deptno,dept.dname,emp.ename,emp.job from emp,dept where emp.deptno=dept.deptno;

select e.ename,e.job,e.hiredate,d.dname,e.deptno from emp e,dept d where e.deptno=d.deptno;

2<左连接/右连接

  • 显示主表全部及匹配的附表
左连接(以左表为标准连接右表):
    left join=left [outer] join
    select 显示的内容 from 表1 left join 表2 on 条件;
    #条件可以用运算式或匹配符号

select emp.ename,emp.job,dept.deptno from dept left join emp on emp.deptno=dept.deptno;
--------------------------------------------------------------------------------------------------------------------
右连接(以右表为标准连接左表):
    right join= right [outer] join
    select 显示的内容 from 表1 right join 表2 on 条件;	
    #条件可以用运算式或匹配符号

select emp.ename,emp.job,dept.deptno from dept right join emp on emp.deptno=dept.deptno;

3<内连接

  • 取多表之间的交集
方法1:
    select 显示的内容 from 表1,表2 where 条件;	
    #条件可以用运算式或匹配符号
方法2:
    select 显示的内容 from 表1 inner join 表2 on 条件;	
    #条件可以用运算式或匹配符号

inner join
select emp.ename,emp.job,dept.deptno from emp inner join dept on emp.deptno=dept.deptno;
select * from emp inner join dept on emp.deptno=dept.deptno;
select * from dept inner join emp no emp.deptno=dept.deptno;

4<纵向连接

  • 合并【表结构相同】
纵向连接:合并【表结构相同】
#select 显示的内容 from 表1,表2 where 条件;
 
select name,math,english,'' as 'chinese' from t2 union select name,math,english,chinese from t3;

3、查询嵌套

  • 查询中嵌套一个查询

1

SQL Server 将一个表中字段的值复制到另一个表的字段中
具体方法如下

一:update 表2 set (要插入的列名)= select 表1.某一列 from 表1 left jion 表2 on 表1和表2的关联 where .....  

二:update 表1 set 表1.列=表2.列 from 表2 where 表2.id=表1.id 

三:update _a set 列=_b.列 from 表1 _a join 表2 _b on _a.id=_b.id

2、事务处理

  • 检测sql语句事务是否全部执行完毕,是则写入数据库,否则丢弃。
  • 只能使用innodb引擎
三、创建事务
T-SQL中管理事务的语句:
1 开始事务: begin transaction
2 提交事务:commit transaction
3 回滚事务: rollback transaction
三、事务处理
1、什么是事务处理
事务:一系列将要发生或正在发生的连续操作。

事务安全,是一种保护连续操作同时实现(完成)的机制。事务安全的意义就是,保证数据操作的一致性与完整性。

2、举个栗子:借钱
涛哥最近手头紧,没钱,找许少华借钱。
涛哥:0.20元
银行转账
少华:1000.20元

要完成一系列操作:转账(关联很多SQL语句)
少华银行卡扣钱-1000
update 数据表 set money=money-1000 where name='少华';

少华:0.20元
银行机器突然故障、断电了,问题:导致数据不一致,数据不完整。(事务安全)
涛哥:0.20元

涛哥银行卡增钱+1000
update 数据表 set money=money+1000 where name='涛哥';
当以上两个SQL语句同时完成,则认为交易成功,交易成功才能写入数据库。

3、事务处理的前提
MySQL引擎:MyISAM引擎(查)与InnoDB引擎(安全)
记住:事务处理只能发生在InnoDB引擎上,从MySQL5.5以后版本开始,系统默认的引擎都是InnoDB引擎。

实验:事务处理必须使用InnoDB引擎
create table it_bank(
   id int not null auto_increment primary key,
   name varchar(40),
   money decimal(11,2)
) engine=innodb default charset=utf8;
#插入测试数据
insert into it_bank values (null,'许少华',1000.20);
insert into it_bank values (null,'王金涛',0.20);

4、事务处理步骤
第一步:开启事务
start transaction;
第二步:执行SQL语句
update it_bank set money=money-1000 where id=1;
update it_bank set money=money+1000 where id=2;
...
第三步:如果成功,则提交。反之,则回滚
commit;  #提交
或
rollback;  #回滚
注意:以上事务处理全部是手工完成的,实际应用中,事务处理都是自动完成的。
# mysql > show variables like 'autocommit';

5、事务处理有4个特性(ACID、背下来)
原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

3、查询重复数据

SELECT ttc,COUNT(*) FROM `sm_oilvouch` GROUP BY ttc HAVING COUNT(*) > 1;

4、查看正在执行的SQL进程:

show processlist;

5、查出来之后, 可以使用下面的命令终止SQL进程:

kill ${进程ID}