03__mysql-基本SQL语句
一、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中如何求帮助
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、字段类型(了解)
- 字段类型
- 整数型
- int
- -2147483648 到 2147483647 常规
- 0 到 4294967295 无符号*
- int( ),在括号中规定最大位数。
- tinyint
- -128 到 127 常规
- 0 到 255 无符号*
- tinyint( ),在括号中规定最大位数。
- smallint
- mediumint
- bigint
- int
- 小数型
- 浮点型
- float
- double
- 定点型
- decimal
- 浮点型
- 字符型
- char
- 定长型,长度范围是0到255之间
- 字符串占指定长度,长度不足时用特殊空格补,读取时删除特殊空格
- varchar
- 变长型,最大可用存储范围是65535-3=65532字节
- 字符串长度根据需要分配,从第二个字符开始存储,第一个字符记录该字符串长度
- 长度超过最大长度的字符,使用TEXT类型进行保存
- set
- enum
- 枚举类型
- blob
- text
- 长度超过VARCHAR最大长度的字符,都可以使用TEXT类型进行保存
- char
- 时间日期型
- date
- '0000-00-00'
- time
- '00:00:00'
- datetime
- '0000-00-00 00:00:00'
- timestamp
- '0000-00-00 00:00:00'
- year
- '0000'
- date
- 整数型
☆ 整数型
MysQL支持的整数类型所需的存储和范围
Type | 存储(bytes) | 最小值(有符号) | 最小(无符号) | 最大(有符号) | 最大(无符号) |
---|---|---|---|---|---|
TINYINT | 1 | -128 | 0 | 127 | 255 |
SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT | 8 | -2“63” | 0 | 2“63”-1 | 2“64”-1 |
ps: -2“63” 意为:-2的63次方
TINYINT(size)
-128 到 127 常规。0 到 255 无符号*。
在括号中规定最大位数。
INT(size)
-2147483648 到 2147483647 常规
0 到 4294967295 无符号*
在括号中规定最大位数。
☆ 小数型
① 定点类型
DECIMAL
和NUMERIC
类型的存储==精确的数值数据==。使用这些类型时,重要的是要保留==精确的精度==,
例如使用货币数据。
在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==
FLOAT
和DOUBLE
类型代表近似数字数据值。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’ |
YEAR | 0000 |
日期时间类型字段定义主要看需要哪种格式!
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
- having与where类似,根据条件对==数据==进行过滤筛选
- ==where==针对表中的==列==发挥作用,查询数据
- ==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}