MySQL 之DDL.DML.DCL.DQL语法及数据类型


一、MySQL语句


1.SQL的种类

1.)sql_mode

SQL的模式: 规范SQL语句的书写方式
mysql> select @@sql_mode;
+------------------------+
| @@sql_mode             |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
"5.6版本"

"5.7版本有更多" 例如: only_full_group_by...

例子:
mysql> select 4/0;
+------+
| 4/0  |
+------+
| NULL |
+------+
在较早的版本中会显示结果为0

2.)mysql客户端命令

3.)mysql服务端命令

mysql> help contents
categories:
   Account Management
   Administration
   Compound Statements
   Contents
   Data Definition
   Data Manipulation
   Data Types
   Functions
   Geographic Features
   Help Metadata
   Language Structure
   Plugins
   Procedures
   Storage Engines
   Table Maintenance
   Transactions
   User-Defined Functions
   Utility

4.)常用命令

DDL: 数据定义语言  Data Definition Language
DCL: 数据控制语言  Data Control Language
DML: 数据操作语言  Data Manipulate Language
DQL: 数据查询语言  Data Query Language

5.)字符集

  • utf8 : 最大存储3个字节长度.
  • utf8mb4 (建议): 最大存储4个字节长度. 支持emoji

建库默认是latin1
create database zabbix charset utfmb4;

6.)校对规则

每种字符集有多种校对规则.
主要影响到排序. 比如大小写
utf8mb4_general_ci | utf8mb4 | 45 默认,大小写不敏感
utf8mb4_bin | utf8mb4 | 46 区分大小写.

2. DDL.DML语句

  • DDL : create alter drop trancate
  • DML : update insert delete

DDL语句对于生产的影响:
在mysql中,ddl对表操作时是要锁"元数据表",此时所有修改命令是无法运行的.
对于大表和业务繁忙的表操作的时候ddl操作要谨慎.
要避开业务高峰期.

# 方案:
使用pt-osc(pt-online-schema-change)   gh-ost工具进行ddl操作,来减少锁表影响.
如果8.0以上可以不用pt工具.

1.)create 针对库

1. # 针对库的操作语法
mysql> help create database
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ...
create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name
2. # 创建库
mysql> create database db1;
mysql> create schema db2;
mysql> create database if not exists db1;          
#  (即使库已存在也不会报错)
# 操作的数据库名称为纯数字的时候需要用到``把内容包含在里面才能执行命令
例如:mysql> create database `12345`;
     mysql> drop database `12345`;
3)查看建库语句(以创建当前状态为准)
mysql> show create database db1;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| db1      | CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+
'不指定字符集的建库默认为 latin1'

4)创建数据库并指定字符集utf8和校验规则
mysql> create database db3 charset utf8 collate utf8_general_ci;
'不指定校验规则默认就是 utf8_general_ci '

5)删库
mysql> drop database db1;

6)修改库
mysql> alter database db2 charset utf8 collate utf8_general_ci;

2.)create 针对表

1. # 针对表的操作语法
mysql> help create table;
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    { LIKE old_tbl_name | (LIKE old_tbl_name) }
2)建表
#1.进入一个库
mysql> use db2
Database changed

#2.查看当前所在库
mysql> select database();
+------------+
| database() |
+------------+
| db2        |
+------------+

#3.建表,建表最少有一列
mysql> create table tb1;
ERROR 1113 (42000): A table must have at least 1 column

mysql> create table tb1(id int);
Query OK, 0 rows affected (0.04 sec)

#4.查看当前库下的所有表清单
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| tb1           |
+---------------+

# 查看tb1表的表结构
mysql> desc tb1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

#5.建表并插入内容
1.)建表
mysql> create table student(
    -> id int,
    -> name varchar(12),
    -> age tinyint,
    -> gender enum('M','F'),
    -> cometime datetime);

2.)插入数据
mysql> insert into student values(1,'邱导',-18,'M',now());

3.)查看数据
mysql> select * from student;
+------+--------+------+--------+---------------------+
| id   | name   | age  | gender | cometime            |
+------+--------+------+--------+---------------------+
|    1 | 邱导   |  -18 | M      | 2020-07-14 19:34:04 |
+------+--------+------+--------+---------------------+

3.)建表数据类型

int             整数  -2^31 - 2^31-1    (-2147483648 - 2147483647)
tinyint         最小整数   -128 - 127   #年龄  0 - 255
varchar         字符类型(变长)     '必须指定长度'
char            字符类型(定长)     '需要指定长度'
enum            枚举类型    #给它固定选项,只能选则选择项中的值    性别
datetime        时间类型    年月日时分秒
'mysql的日期时间类型格式:'

日期时间类型
一般用整型保存时间戳,因为PHP可以很方便的将时间戳进行格式化。

datetime 8字节 日期及时间 1000-01-01 00:00:00 到 9999-12-31 23:59:59

date 3字节 日期 1000-01-01 到 9999-12-31

timestamp 4字节 时间戳 19700101000000 到 2038-01-19 03:14:07

time 3字节 时间 -838:59:59 到 838:59:59

year 1字节 年份 1901 - 2155

datetime YYYY-MM-DD hh:mm:ss

timestamp 格式如下:
YY-MM-DD hh:mm:ss
YYYYMMDDhhmmss
YYMMDDhhmmss
YYYYMMDDhhmmss
YYMMDDhhmmss
date YYYY-MM-DD
YY-MM-DD
YYYYMMDD
YYMMDD
YYYYMMDD
YYMMDD
time hh:mm:ss
hhmmss
hhmmss
year YYYY
YY
YYYY
YY

4.)建表数据属性

not null:           #非空
primary key:        #主键(唯一且非空的)
auto_increment:     #自增(此列必须是:primary key或者unique key)
unique key:         #唯一键,单独的唯一的
default:            #默认值
unsigned:           #非负数
comment:            #注释

# 加上属性建表
create table students(
id int primary key auto_increment comment "学生id",
name varchar(12) not null comment "学生姓名",
age tinyint unsigned not null comment "学生年龄",
gender enum('M','F') default 'M' comment "学生性别",
cometime datetime default now() comment "入学时间");

# 插入数据
mysql> insert into students values(1,'qiudao',18,'M',now());
# 正规插入数据的写法
mysql> insert students(name,age) values('lhd',18);
# 查看表内容
mysql> select * from students;
+----+--------+-----+--------+---------------------+
| id | name   | age | gender | cometime            |
+----+--------+-----+--------+---------------------+
|  1 | qiudao |  18 | M      | 2020-07-14 19:51:44 |
|  2 | lhd    |  12 | M      | 2020-07-14 19:53:58 |
+----+--------+-----+--------+---------------------+

mysql> select * from test1;
+------+
| id   |
+------+
|    1 |
+------+
mysql> select id,'name' name,100-id 值 from test1;
+------+------+------+
| id   | name | 值   |
+------+------+------+
|    1 | name |   99 |
+------+------+------+


# 查看表结构2种方式:
mysql> show columns from test;
mysql> desc test;

# 删除表
mysql> drop table students;
# 查看表详情(包含其中的注释和权限)
show full columns from 数据表;

"unsigned 属性必须跟在数据类型的后面,不然会报错。"


5.)alter修改表结构

#1.新建表
mysql> create table linux(daijiadong tinyint);

#2.修改表名
mysql> alter table linux rename linux9;

#3.插入新字段
mysql> alter table linux9 add rengyufeng int;

#4.插入多个新字段
mysql> alter table linux9 add liukong int,
add wangzhangxing int,add abcd varchar(20),
add ccb char(8),add aww enum('m','f');

#5.插入字段到最前面
mysql> alter table linux9 add kangpeiwen varchar(100) first;

#6.插入字段到指定字段后面
mysql> alter table class add zzz tinyint unsigned not null default 1 com
ment "度",add zzz2 int after ccb;

mysql> desc class;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| ccb   | char(8)             | YES  |     | NULL    |       |
| zzz2  | int(11)             | YES  |     | NULL    |       |
| aww   | enum('m','f')       | YES  |     | NULL    |       |
| zzz   | tinyint(3) unsigned | NO   |     | 1       |       |
+-------+---------------------+------+-----+---------+-------+
'其中一条默认插入到表格的最后一行。'

#7.删除指定多列
mysql> alter table class drop bbb,drop ccc,drop ddd;

#8.修改字段
mysql> alter table class change aaa uuu char(7),drop ccb,change aww b int;

#9.修改字段属性2方法
mysql> alter table class change uuu uuu int;
mysql> alter table class modify uuu tinyint;
'如果数据属性冲突,会清零该字段的数据,如果长度不够会自动删除超长部分的数据'

6.)修改表delete/insert

# 增加一条数据: insert into
mysql> insert into linux9 values(列1内容,列2内容...)

# 删除一条数据: delete from
mysql> delete from linux9 where id=3;

# 修改数据:update ...set ... where
mysql> update 表名 set 字段名1=‘新值1’,字段名2=‘新值2’ where '条件' 
'注意!!!如果不加where条件那么将会把所有的记录的值都修改掉。'

# 查看数据:select ... from
mysql> select id,zzz from class where id=2 or id=3;
mysql> Select 字段1,字段2,……from 表名。字段之间用“,”隔开,如果查询所有的字段用“*”来代替。
# 要清空表(危险)
mysql> delete from student where 1=1;
mysql> truncate table student;
mysql> drop table student

1.delete是DML语句,可以选择删除部分数据,也可以选择删除全部数据;删除的数据可以回滚;不会释放空间,会产生碎片。
2.drop是DDL语句,删除表结构和所有数据,同时删除表结构所依赖的约束、触发器和索引;删除的数据
无法回滚;会释放空间
3.truncate是DDL语句,删除表的所有数据,不能删除表的部分数据,也不能删除表的结构;删除的数据
无法回滚;会释放空间

执行速度:drop > truncate > delete
'一般使用场景:如果一张表确定不再使用,我们使用drop来操作;'
'如果只是删表中的全部数据,一般使truncate;如果删除的是表中的部分数据,一般使用delet'

=====================
# 批量插入
select into from 要求目标表不存在,因为在插入时会自动创建。
insert into select from 要求目标表已存在数据库中。

例如:
insert into aaa1_copy1 (select * from aaa1 where id> 4 )
=====================

'一直使用delete语句导致的碎片太多使数据空间不足,一般可以通过导出数据后再重新导入数据即可清理'

7.)update修改内容

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值,update语句的写法:
1、 UPDATE table_name SET column1=value1,column2=value2,...
    WHERE column(1)=value(1),column(2)=value(2)...and column(n)=value(n);

2、UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
   WHERE LastName = 'Wilson'

3、在 MySQL 中,可以使⽤“UPDATE table1 t1,table2,...,table n set t1.??=t2.??? where t1.???=t2.???? ”的⽅式来多表更新,SQL 语句和运⾏结果如下:
UPDATE product p, product_price pp SET pp.price = p.price * 0.8 WHERE p.productid= pp.productId;

Query OK, 5 rows affected (0.02 sec)

------------
# 生产中使用update代替delete

1.添加状态字段
mysql> alter table student add del_status enum('1','0') default 1;

2.使用update代替delete
mysql> update student set status='0' where id =2; 
#相当于删除学生

3.可使用update恢复数据
#相当于学生回来
mysql> update student set status='1' where id =2;

3. DCL语句

1.)grant授权扩展

#1.授权语句
grant all on *.* to root@'172.16.1.%' identified by '123';

#2.查看用户权限
mysql> show grants for root@'localhost';

#3.扩展参数
max_queries_per_hour:一个用户每小时可发出的查询数量:
mysql> grant all on *.* to root@'172.16.1.%' identified by '123' with max_queries_per_hour 2;

max_updates_per_hour:一个用户每小时可发出的更新数量:
mysql> grant all on *.* to root@'172.16.1.%' identified by '123' with max_updates_per_hour 2;

max_connetions_per_hour:一个用户每小时可连接到服务器的次数:
mysql> grant all on *.* to lhd@'172.16.1.%' identified by '123' with max_connections_per_hour 2;

max_user_connetions:允许同时连接数量:
mysql> grant all on *.* to lhd@'172.16.1.%' identified by '123' with max_user_connections 1;

2.)revoke回收权限

mysql> revoke drop on *.* from lhd@'172.16.1.%';
mysql> show grants for lhd@'172.16.1.%';

#mysql所有权限列表
SELECT, INSERT, UPDATE, DELETE, CREATE, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, 
ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, 
REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, 
EVENT, TRIGGER, CREATE TABLESPACE, DROP, GRANT

'使用revoke回收权限的时候会同时默认回收grant和drop权限。'

3.)ROLLBACK

2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
回滚---ROLLBACK
回滚命令使数据库状态回到上次最后提交的状态。其格式为:
SQL>ROLLBACK;

4.)COMMIT

COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据
库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看
到所做的事情,别人只有在最后提交完成后才可以看到。

提交数据有三种类型:显式提交、隐式提交及自动提交。下面分
别说明这三种类型。

(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;

(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;


4. DQL语句

1.)select查询语句

select标准用法:
- 单表
select
1.from 表1,表2...
2.where 条件1,条件2...
3.group by 条件列1,条件列2...
4.select_list 列名列表
5.having 条件1,条件2...
6.order by 条件列1,条件列2...
7.limit 限制


# 以下为在MySQL数据库中查询数据通用的 SELECT 语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
SELECT 命令可以读取一条或者多条记录。
你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
你可以使用 WHERE 语句来包含任何条件。
你可以使用 LIMIT 属性来设定返回的记录数。
'你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。'

# 以下是 SQL SELECT 语句使用 WHERE 子句从数据表中读取数据的通用语法:
SELECT field1, field2,...fieldN FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2.....
查询语句中你可以使用一个或者多个表,表之间使用逗号, 分割,并使用WHERE语句来设定查询条件。
你可以在 WHERE 子句中指定任何条件。
你可以使用 AND 或者 OR 指定一个或多个条件。
WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
以下为操作符列表,可用于 WHERE 子句中。

'MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。'
如下实例:
BINARY 关键字
mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='runoob.com';
Empty set (0.01 sec)
 
mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author='RUNOOB.COM';
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title  | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3         | JAVA 教程     | RUNOOB.COM    | 2016-05-06      |
| 4         | 学习 Python   | RUNOOB.COM    | 2016-03-06      |
+-----------+---------------+---------------+-----------------+
2 rows in set (0.01 sec)

# MySQL的like查询时不区分大小写的
解决方法(查询时指定区分大小写):在like后面加个binary就OK了,或者在查询字段前面加binary

SELECT * FROM address WHERE district LIKE BINARY  '%m%'


1)查询表中所有的数据  
#很危险,数据量过大,容易导致down机
mysql> select * from student;

#先查询数据总量,然后决定是否可以查询所有数据
mysql> select count(*) from student;
+----------+
| count(*) |
+----------+
|        6 |
+----------+

2)查看指定列的数据
mysql> select user,host from mysql.user;

3.) order查看数据时排序(按照人口数量)
#语法
select 查询列 from 表 【where 条件】 order by 排序列 【asc|desc】
order by 子句中可以支持单个、多个字段、表达式、函数、别名。
#升序 asc (可以省略)
mysql> select Name,Population from city order by Population limit 100;
'limit 100 必须放在最后,不然会报错'

#降序 desc
mysql> select Name,Population from city order by Population desc;

4.)查询部分数据
#查看前十条数据
mysql> select Name,Population from city order by Population desc limit 10;

5.)按照步长查询数据
mysql> select id,Name,Population from city limit 50,50;
#50起始位置  50步长
mysql> select id,number from people limit 1,2;
' 1号位置开始,从下一个位置显示2行,即显示第2行和第三行 ' 

select查询语句深入

#1.查询常量值:
select 100;
select 'aaa';

#2.查询表达式:
select 100%98   #取模

#3.查询函数:
select version();

#4.起别名(便于直观显示结果):
mysql> select 100%98 as 取模;
+--------+
| 取模   |
+--------+
|      2 |
+--------+
#1.)其中as可以省略
#2.)如果要查询的字段有重名的情况,可以使用别名区分开来。
#3.)别名不能有空格和特殊符号,如果有的话用单或双引号括起来。例如:
select id as "out put" from table1;
select id as 'out put' from table1;

#5.去重显示结果distinct
select distinct id from table1;

#6.+号的作用(mysql中+只有运算符一个功能)
select 100+90; 两个数做加法运算
select '123'+90; 其中一方为字符型,会试图将字符型转换为数值型,如果成功,则再继续加法运算。
select 'aaa'+90; 如果转换失败则会把字符型转换为0再做运算。
select null+10; 只要一方为null其结果为null

#7.连接字符concat
例如:查询员工 名 和 姓 ,接成一个字段,并显示为 姓名
select concat('a','b','c') as 结果;
mysql> select concat('a','b','c') as 结果;
+-----------+
| 结果      |
+-----------+
| abc       |
+-----------+
1 row in set (0.05 sec)

#注意如果拼接的字符中有结果为null,最后的结果也为null,例如:
mysql> select concat('a','b',null) as 结果;
+--------+
| 结果   |
+--------+
| NULL   |
+--------+
1 row in set (0.01 sec)

附加:# ifnull 和 isnull
所以一般带null情况的需要特别加入判断语句ifnull防止结果为null。例如:
aaa=null
select ifnull(aaa,0)  #判断aaa是否为null,如果为null则输出结果0,如果不为null则按aaa值输出。
mysql> select concat('a','b',ifnull(null,0)) as 结果;
+--------+
| 结果   |
+--------+
| ab0    |
+--------+

mysql> select concat('a','b',ifnull(null,'')) as 结果;
+--------+
| 结果   |
+--------+
| ab     |
+--------+


# 使用 isnull 判断方式。输出结果为0或1:
select concat('a','b',isnull(null)) as 结果;
+--------+
| 结果   |
+--------+
| ab1    |
+--------+
1 row in set (0.00 sec)

mysql> select concat('a','b',isnull(8)) as 结果; 
+--------+
| 结果   |
+--------+
| ab0    |
+--------+
1 row in set (0.00 sec)
# 如果结果是null输出1,如果结果不为null则输出0.

#8.查询中加入运算符号
mysql> select * from aaa;
+------+------+
| id   | name |
+------+------+
|    1 | abc  |
|    2 | cbc  |
|    3 | dbc  |
+------+------+
3 rows in set (0.01 sec)

mysql> select name,id * 2 as id2 from aaa;
+------+------+
| name | id2  |
+------+------+
| abc  |    2 |
| cbc  |    4 |
| dbc  |    6 |
+------+------+
3 rows in set (0.01 sec)



9.# 按条件查询,就是使用where语句,where语句可以使用的符号
条件符号:= < > <= >= != <> or and like
    精确匹配:=
    范围匹配:< > <= >= != <>   # <>表示不等于
    模糊匹配:like, between and,in,is null
    连接语句:and or not (&& || ! 与或非)

# 查询中国人口数量小于100000的城市并升序排列:
mysql> select name,population from city where countrycode='CHN' and population < 1000000 order by population ;

#使用or
mysql> select name,population from city where countrycode = 'CHN' or countrycode = 'USA';

#使用in 或使用union all (见下注释)
mysql> select name,population from city where countrycode in ('CHN','USA');

10. 模糊匹配 
#匹配以N结尾的数据
mysql> select name,countrycode from city where countrycode like '%N';
'N%'  匹配以N开头的数据 
'%N%' 匹配包含N的数据
'_a_b%' 匹配第2个字符为a,第4个字符为b的数据
'_\_%' 匹配第2个字符为_的数据(使用转义符)
%代表任意多个字符
_代表任意单个字符
#可以用escape定义转义符,例如:
select aa from table1 where aa like '__%' escape '';
查找匹配第2个字符为_的数据(使用自定义的转义符$)

11. between and
#取区间包含临界值(两者相同)
where my_id between 100 and 120;
where my_id >= 100 and my_id <=120;
上两者等价,所以不能使用between 120 and 100 这种方式。
'还可以使用not between and 方式。'

12.# in包含
select aa from table1 where aa='1' or aa='2' or aa='3';
select aa from table1 where aa in ('1','2','3');
上两者等价,in列表的值属性必须统一或者兼容,不支持通配符。

13.# is null 用于查找是null的值
由于不能使用条件aa=null这种方式(=号不能判断null值),会没有结果。
所以必须使用 aa is null 和aa is not null这种方式。

14.# 安全等于 <=>
既可以用于null值的判断,有可以用于常规的=判断。
aa <=> null
aa <=> '123'

15.# 长度函数 length()
select length(name) 字节长度,id from 表;

16. # order by 按多个字段排序
select * from 表 order by aaa asc,bbb desc;
先按aaa升序排列,相同的情况下再按bbb降序排列。

综合例子:在工资表中查询员工的姓名.部门号和年薪并按年薪从大到小排序。
年薪需要使用月工资*12*(1+奖金率)换算。
select name,部门号,月工资*12*(1+ifnull(奖金率,0)) as 年薪 
from 工资表 order by 年薪 desc;
因为奖金率可能为null,所以要用ifnull判断,并且最后的表达式可以用as后的别名替代来简化。

'使用union all (union),UNION 操作符用于合并两个或多个 SELECT 语句的结果集。'
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2;
'默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。' 

2.)select 联表查询

直接显示两个表(自动等行)
select a.*,b.* from temp1.aaa1 a,temp1.aaa2
#集合
name:[qiudao,zengdao,qiandao]
mark:[80,90,100]

#数据库
'表1:students'
id:[1,2,3]
name:[qiudao,zengdao,qiandao]
'表2:score'
id:[1,2,3]
mark:[80,90,100]

#查看邱导的分数
mysql> select students.name,score.mark from students,score where students.id=1 and score.id=1;
#查询所有学生成绩
mysql> select students.name,score.mark from students,score where students.id=score.id

3.)select 自连接

NATURAL JOIN #自己查找相同字段,使用自连接,两个关联的表必须有相同字段和相同数据: 
SELECT country.name,city.name,city.population FROM city NATURAL JOIN country WHERE population < 100 ORDER BY population;

#注意:
1.自连接必须有相同字段和相同值
2.两个表中的数据必须完全相同

4.)select 内外连接

1.)语法格式 inner join 
select * from 表1 join 表2 on 相关联的条件 where 条件;

#注意:命中率(驱动的概念)
    表1 小表
    表2 大表

select * from 表1 inner join 表2 on 相关联的条件 where 条件;

Urluon.png

# 是将两个表的满足连接条件的所有数据(即内连接数据),
# 再加上那些“左边”表中,不能满足连接条件的数据的总和。
# 对于左边表中不能满足条件的数据,则,在结果中的右边部分,都补上“null”(空值);

5.补充show命令


二、MySQL 数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。


1.数值类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 byte (-128,127) (0,255) 小整数值
SMALLINT 2 bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

2.日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

3.字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

DECIMAL(N,M)中M值的是小数部分的位数,若插入的值未指定小数部分或者小数部分不足M位则会自动补到M位小数,若插入的值小数部分超过了M为则会发生截断,截取前M位小数。N值得是整数部分加小数部分的总长度,也即插入的数字整数部分不能超过N-M位,否则不能成功插入,会报超出范围的错误。

Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » MySQL 之DDL.DML.DCL.DQL语法及数据类型

发表评论

提供最优质的资源集合

立即查看 了解详情