/**PageBeginHtml Block Begin **/ /***自定义返回顶部小火箭***/ /*生成博客目录的JS 开始*/ /*生成博客目录的JS 结束*/

interTbale ___AlterTable

* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。
* @author Alan
* @Email no008@foxmail.com

 

正文

-


-

Account Mysql

mysql -h localhost -u user -p menagerie
host
user
********


--


--

show Databases

pattern
expr

--


--

USE Statement

USE db1;
SELECT COUNT(*) FROM mytable;   # selects from db1.mytable
USE db2;
SELECT COUNT(*) FROM mytable;   # selects from db2.mytable


--


--

CREATE DATABASE

mysql> CREATE DATABASE menagerie;
 

--


--

SELECT DATABASE()

mysql> SELECT DATABASE(); -> 'test'

mysql> select database();
+------------+ | database() | +------------+ | menagerie  | +------------+ 1 row in set (0.00 sec)

mysql>

--


--

SHOW TABLES

db_name
pattern
expr

--


--

CREATE TABLE

tbl_name
create_definition
table_options
partition_options
tbl_name
create_definition
table_options
partition_options
query_expression
tbl_name
old_tbl_name
old_tbl_name
create_definition
col_name
column_definition
index_name
index_type
key_part
index_option
index_name
key_part
index_option
symbol
index_type
key_part
index_option
symbol
index_name
index_type
key_part
index_option
symbol
index_name
col_name
reference_definition
check_constraint_definition
column_definition
data_type
literal
expr
string
collation_name
string
string
reference_definition
check_constraint_definition
data_type
collation_name
expr
string
reference_definition
check_constraint_definition
data_type
key_part
col_name
length
expr
index_type
index_option
value
index_type
parser_name
string
ENGINE_ATTRIBUTE
string
SECONDARY_ENGINE_ATTRIBUTE
string
check_constraint_definition
symbol
expr
reference_definition
tbl_name
key_part
reference_option
reference_option
reference_option
table_options
table_option
table_option
table_option
value
value
value
charset_name
collation_name
string
connect_string
absolute path to directory
engine_name
string
value
value
value
string
string
value
tablespace_name
tbl_name
tbl_name
partition_options
expr
column_list
expr
column_list
expr
column_list
num
expr
column_list
num
partition_definition
partition_definition
partition_definition
partition_name
expr
value_list
value_list
engine_name
string
data_dir
data_dir
index_dir
index_dir
max_number_of_rows
min_number_of_rows
subpartition_definition
subpartition_definition
subpartition_definition
logical_name
engine_name
string
data_dir
data_dir
index_dir
index_dir
max_number_of_rows
min_number_of_rows
query_expression:
Some valid select or union statement

--


--

CHAR,  VARCHAR

Value CHAR(4) Storage Required VARCHAR(4) Storage Required
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

--


--

ALTER TABLE Statement


tbl_name
alter_option
alter_option
partition_options
alter_option
table_options
col_name
column_definition
col_name
col_name
column_definition
index_name
index_type
key_part
index_option
index_name
key_part
index_option
symbol
index_type
key_part
index_option
symbol
index_name
index_type
key_part
index_option
symbol
index_name
col_name
reference_definition
symbol
expr
symbol
symbol
col_name
literal
expr
index_name
old_col_name
new_col_name
column_definition
col_name
charset_name
collation_name
charset_name
collation_name
col_name
index_name
fk_symbol
col_name
column_definition
col_name
col_name
col_name
old_col_name
new_col_name
old_index_name
new_index_name
new_tbl_name
partition_options
partition_option
partition_option
partition_option
partition_definition
partition_names
partition_names
partition_names
partition_names
number
partition_names
partition_definitions
partition_name
tbl_name
partition_names
partition_names
partition_names
partition_names
partition_names
key_part
col_name
length
expr
index_type
index_option
value
index_type
parser_name
string
table_options
table_option
table_option
table_option
value
value
value
charset_name
collation_name
string
connect_string
absolute path to directory
engine_name
string
value
value
value
string
string
value
tablespace_name
tbl_name
tbl_name
partition_options
CREATE TABLE

--


--

The DATE, DATETIME, and TIMESTAMP Types

CREATE TABLE ts (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
col TIMESTAMP NOT NULL
) AUTO_INCREMENT = 1;
CREATE TABLE dt (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
col DATETIME NOT NULL
) AUTO_INCREMENT = 1;
SET @@time_zone = 'SYSTEM';
INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'),
('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
SET @@time_zone = '+00:00';
INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'),
('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
SET @@time_zone = 'SYSTEM';
INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'),
('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
SET @@time_zone = '+00:00';
INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'),
('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
SET @@time_zone = 'SYSTEM';
SELECT @@system_time_zone;
SELECT col, UNIX_TIMESTAMP(col) FROM dt ORDER BY id;
SELECT col, UNIX_TIMESTAMP(col) FROM ts ORDER BY id;
SELECT col,
CAST(col AT TIME ZONE INTERVAL '+00:00' AS DATETIME) AS ut
FROM ts ORDER BY id;

--


--

DESCRIBE

mysql> DESCRIBE City;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| Id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name       | char(35) | NO   |     |         |                |
| Country    | char(3)  | NO   | UNI |         |                |
| District   | char(20) | YES  | MUL |         |                |
| Population | int(11)  | NO   |     | 0       |                |
+------------+----------+------+-----+---------+----------------+

--


--

LOAD DATA Statement

file_name
tbl_name
partition_name
partition_name
charset_name
string
char
char
string
string
number
col_name_or_user_var
col_name_or_user_var
col_name
expr
col_name
expr

--


--

INSERT Statement


tbl_name
partition_name
partition_name
col_name
col_name
value_list
value_list
row_constructor_list
row_alias
col_alias
col_alias
assignment_list
tbl_name
partition_name
partition_name
row_alias
col_alias
col_alias
assignment_list
assignment_list
tbl_name
partition_name
partition_name
col_name
col_name
row_alias
col_alias
col_alias
table_name
assignment_list
value
expr
value_list
value
value
row_constructor_list
value_list
value_list
assignment
col_name
row_alias
value
assignment_list
assignment
assignment

--


--


---


select

what_to_select
which_table
conditions_to_satisfy



select_expr
select_expr
into_option
table_references
partition_list
where_condition
col_name
expr
position
where_condition
window_name
window_spec
window_name
window_spec
col_name
expr
position
offset
row_count
row_count
offset
into_option
tbl_name
tbl_name
into_option
into_option
file_name
charset_name
export_options
file_name
var_name
var_name

选择所有数据


mysql> SELECT * FROM pet; +----------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+--------+---------+------+------------+------------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Fang | Benny | dog | m | 1990-08-27 | NULL | | Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 | | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +----------+--------+---------+------+------------+------------+





create table pet (     NAME varchar (60),     OWNER varchar (60),     species varchar (60),     sex varchar (3),     birth date ,     death date );

insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Puffball','Diane','hamster','f','1999-03-30',NULL); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Fluffy','Harold','cat','f','1993-02-04',NULL); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Claws','Gwen','cat','m','1994-03-17',NULL); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Buffy','Harold','dog','f','1989-05-13',NULL); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Fang','Benny','dog','m','1990-08-27',NULL); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Bowser','Diane','dog','m','1979-08-31','1995-07-29'); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Chirpy    ','Gwen','bird','f','1998-09-11',NULL); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Whistler','Gwen','bird','','1997-12-09',NULL); insert into `pet` (`NAME`, `OWNER`, `species`, `sex`, `birth`, `death`) values('Slim','Benny','snake','m','1996-04-29',NULL);






选择特定的行  where 、   and 、 or  、DISTINCT

mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+


mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+


mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+


SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
OR (species = 'dog' AND sex = 'f');

选择特定的列   where 、   and 、 or  、DISTINCT


如果您不想看到表中的整个行,只需用逗号分隔感兴趣的列即可。例如,如果您想知道动物何时出生,请选择namebirth列:

mysql> SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

要查找谁拥有宠物,请使用以下查询:

mysql> SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+


请注意,查询只是owner从每个记录中检索 列,并且其中一些出现多次。为了最大程度地减少输出,只需添加关键字即可检索每个唯一的输出记录一次 DISTINCT

mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+

使用WHERE子句将行选择与列选择结合起来。例如,要仅获取狗和猫的出生日期,请使用以下查询:

SELECT name, species, birth FROM pet
WHERE species = 'dog' OR species = 'cat';

行排序  ORDER BY

在前面的示例中,您可能已经注意到结果行的显示顺序没有特定的顺序。当以某种有意义的方式对行进行排序时,通常更容易检查查询输出。要对结果排序,请使用ORDER BY子句。

这是动物生日,按日期排序:


mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+

在字符类型列上,与所有其他比较操作一样,排序通常以不区分大小写的方式执行。这意味着除了大小写相同以外,其他列均未定义顺序。您可以BINARY像这样使用强制对列进行区分大小写的排序: 。 ORDER BY BINARY col_name

SELECT 'a' = 'A';
SELECT BINARY 'a' = 'A';
SELECT 'a' = 'a ';
SELECT BINARY 'a' = 'a ';

默认的排序顺序是升序,最小值先出现。要以相反的顺序(降序)排序,请将DESC关键字添加到要排序 的列的名称上:

mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+

您可以对多个列进行排序,也可以按不同方向对不同的列进行排序。例如,要按升序对动物类型进行排序,然后按降序对动物类型内的出生日期进行排序(首先是最年轻的动物),请使用以下查询:

SELECT name, species, birth FROM pet
ORDER BY species, birth DESC;

DESC关键字只适用于紧靠它的列名(出生);它不影响物种列的排序顺序。

日期计算

MySQL提供了几个函数,您可以使用它们来执行日期计算,例如,计算年龄或提取日期的一部分。

要确定宠物的年龄,可以使用TIMESTAMPDIFF()函数。它的参数是您希望表示结果的单位,以及取差值的两个日期。下面的查询显示每只宠物的出生日期、当前日期和年龄(以年为单位)。决赛使用别名(年龄)

SELECT TIME('2003-12-31 01:02:03');
SELECT TIME('2003-12-31 01:02:03.000123');
SELECT TIMEDIFF('2000:01:01 00:00:00',
'2000:01:01 00:00:00.000001');
SELECT TIMEDIFF('2008-12-31 23:59:59.000001',
                '2008-12-30 01:01:01.000002');
SELECT TIMESTAMP('2003-12-31');
SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');
mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
        -> '100 100 04 04 4'
SELECT TIME_TO_SEC('22:23:00');
SELECT TIME_TO_SEC('00:39:38');
mysql> SELECT TO_DAYS('2008-10-07'), TO_DAYS('08-10-07');
        -> 733687, 733687
SELECT TO_DAYS('0000-00-00');
SHOW WARNINGS;
SELECT TO_DAYS('0000-01-01');
SELECT TO_SECONDS(950501);
SELECT TO_SECONDS('2009-11-29');
SELECT TO_SECONDS('2009-11-29 13:43:32');
SELECT TO_SECONDS( NOW() );
SELECT TO_SECONDS('0000-00-00');
SHOW WARNINGS;
SELECT TO_SECONDS('0000-01-01');
SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');
SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');
SET time_zone = 'MET';
SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
SELECT FROM_UNIXTIME(1111885200);
mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
        -> '2003-08-14', 20030814
mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
        -> '18:07:53', 180753.000000
mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
        -> '2003-08-14 18:08:04', 20030814180804.000000
SELECT WEEK('2008-02-20');
SELECT WEEK('2008-02-20',0);
SELECT WEEK('2008-02-20',1);
SELECT WEEK('2008-12-31',1);
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
        -> 2000, 0
SELECT YEARWEEK('2000-01-01');
SELECT MID(YEARWEEK('2000-01-01'),5,2);
SELECT WEEKDAY('2008-02-03 22:23:00');
SELECT WEEKDAY('2007-11-06');
mysql> SELECT WEEKOFYEAR('2008-02-20');
        -> 8
mysql> SELECT YEAR('1987-01-01');
        -> 1987
mysql> SELECT YEARWEEK('1987-01-01');
        -> 198652
Specifier Description
%a Abbreviated weekday name (Sun..Sat)
%b Abbreviated month name (Jan..Dec)
%c Month, numeric (0..12)
%D Day of the month with English suffix (0th, 1st, 2nd, 3rd, …)
%d Day of the month, numeric (00..31)
%e Day of the month, numeric (0..31)
%f Microseconds (000000..999999)
%H Hour (00..23)
%h Hour (01..12)
%I Hour (01..12)
%i Minutes, numeric (00..59)
%j Day of year (001..366)
%k Hour (0..23)
%l Hour (1..12)
%M Month name (January..December)
%m Month, numeric (00..12)
%p AM or PM
%r Time, 12-hour (hh:mm:ss followed by AM or PM)
%S Seconds (00..59)
%s Seconds (00..59)
%T Time, 24-hour (hh:mm:ss)
%U Week (00..53), where Sunday is the first day of the week; WEEK() mode 0
%u Week (00..53), where Monday is the first day of the week; WEEK() mode 1
%V Week (01..53), where Sunday is the first day of the week; WEEK() mode 2; used with %X
%v Week (01..53), where Monday is the first day of the week; WEEK() mode 3; used with %x
%W Weekday name (Sunday..Saturday)
%w Day of the week (0=Sunday..6=Saturday)
%X Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
%x Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
%Y Year, numeric, four digits
%y Year, numeric (two digits)
%% A literal % character
%x x, for any x not listed above
Function Call Result
GET_FORMAT(DATE,'USA') '%m.%d.%Y'
GET_FORMAT(DATE,'JIS') '%Y-%m-%d'
GET_FORMAT(DATE,'ISO') '%Y-%m-%d'
GET_FORMAT(DATE,'EUR') '%d.%m.%Y'
GET_FORMAT(DATE,'INTERNAL') '%Y%m%d'
GET_FORMAT(DATETIME,'USA') '%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'JIS') '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'ISO') '%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'EUR') '%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL') '%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA') '%h:%i:%s %p'
GET_FORMAT(TIME,'JIS') '%H:%i:%s'
GET_FORMAT(TIME,'ISO') '%H:%i:%s'
GET_FORMAT(TIME,'EUR') '%H.%i.%s'
GET_FORMAT(TIME,'INTERNAL') '%H%i%s'




---------------------------------------------------------------------------------------------------------------------------------------------


SELECT name, birth, CURDATE(),
TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
FROM pet;

查询工作,但如果行以某些顺序呈现,则可以更容易地扫描结果。这可以通过在名称子句中添加一个顺序来完成,以按名称排序输出:

SELECT name, birth, CURDATE(),
TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
FROM pet ORDER BY name;
SELECT name, birth, CURDATE(),
TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
FROM pet ORDER BY age;

Is null、is not null

可以使用类似的查询来确定已经死亡的动物的死亡年龄。您可以通过检查death值 是否为来确定这些动物是哪些NULL。然后,对于那些没有NULL值的对象,计算deathbirth值之间的差:

SELECT name, birth, death,
TIMESTAMPDIFF(YEAR,birth,death) AS age
FROM pet WHERE death IS NOT NULL ORDER BY age;

查询使用death IS NOT NULL而不是,death <> NULL因为它 NULL是一个特殊值,无法使用常规比较运算符进行比较。

------------------------------------------------------------------------------------------------------------------------------------------

NULL值问题

NULL对于SQL的新手来说,值 的概念是一个常见的困惑源,他们经常认为这 NULL与空字符串是同一回事 ''不是这种情况。例如,以下语句完全不同:

INSERT INTO my_table (phone) VALUES (NULL);
INSERT INTO my_table (phone) VALUES ('');

这两个语句都会在该phone列中插入一个值,但是第一个语句将插入一个 NULL值,第二个语句将 插入一个空字符串。第一个的含义可以视为 未知电话号码,第二个的含义可以视为已知该人没有电话,因此也没有电话号码”。

为了帮助NULL处理,可以使用 IS NULLIS NOT NULL运算符以及 IFNULL()函数。

在SQL中,与NULL其他任何值(甚至)相比,该值永远不会为真NULL除非文档中针对表达式中涉及的运算符和函数另有说明,否则包含的表达式NULL始终会产生一个NULL值。以下示例中的所有列均返回NULL

mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);

要搜索为的列值NULL,您不能使用expr = NULL测试。以下语句不返回任何行,因为expr = NULL对于任何表达式都不是真的:

mysql> SELECT * FROM my_table WHERE phone = NULL;

要查找NULL值,必须使用 IS NULL测试。以下语句显示如何查找NULL电话号码和空电话号码:

SELECT * FROM my_table WHERE phone IS NULL;
SELECT * FROM my_table WHERE phone = '';

您可以在可以有一列中添加索引 NULL,如果您使用的值 MyISAMInnoDB MEMORY存储引擎。否则,您必须声明一个索引列NOT NULL,并且不能插入NULL该列。

使用读取数据时LOAD DATA,空白列或缺失列将使用更新 ''要将NULL加载到列中,请\N在数据文件中使用。NULL在某些情况下,也可以使用原义词

使用DISTINCTGROUP BY或时ORDER BY,所有 NULL值均视为相等。

使用时ORDER BY NULL值将首先显示,如果您指定DESC按降序排序,则最后显示

集合体(组)的功能,例如 COUNT() MIN(),和 SUM()忽略 NULL的值。例外是 COUNT(*),它计算行而不是单个列的值。例如,以下语句产生两个计数。第一个是对表中行数的计数,第二个是NULLage中非 数的计数

mysql> SELECT COUNT(*), COUNT(age) FROM person;

对于某些数据类型,MySQLNULL 专门处理值。如果插入NULL到一个 TIMESTAMP列,当前日期和时间插入。如果您插入 NULL具有AUTO_INCREMENT 属性的整数或浮点列,则将插入序列中的下一个数字。


------------------------------------------------------------------------------------------------------------------------------------------

NULL您习惯之前,值可能令人惊讶。从概念上讲,它NULL表示 缺少的未知值”,并且与其他值的处理方式有所不同。

要测试NULL,请使用 IS NULLIS NOT NULL运算符,如下所示:

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;

+-----------+---------------+ | 1 IS NULL | 1 IS NOT NULL | +-----------+---------------+ |         0 |             1 | +-----------+---------------+ 1 row in set (0.00 sec)

你不能使用算术比较操作符,如 = < <>以测试NULL为了自己演示这一点,请尝试以下查询:

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;

+----------+-----------+----------+----------+ | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | +----------+-----------+----------+----------+ |     NULL |      NULL |     NULL |     NULL | +----------+-----------+----------+----------+
1 row in set (0.00 sec)

由于与的任何算术比较结果 NULL也为NULL,因此您无法从此类比较中获得任何有意义的结果。

在MySQL中,0NULL 表示false,其他表示true。布尔运算的默认真值是1

的特殊处理NULL是为什么在上一节中,有必要使用death IS NOT NULL来代替确定哪些动物不再存活death <> NULL

在中,两个NULL值被视为相等 GROUP BY

进行时ORDER BY如果先执行 NULL则先显示值, ORDER BY ... ASC然后执行 ORDER BY ... DESC

使用时的一个常见错误NULL是假定无法在定义为的列中插入零或空字符串NOT NULL,但事实并非如此。这些实际上是值,而 NULL意味着没有值。您可以使用这个测试很轻松地 IS [NOT] NULL,如图所示:

mysql> select 0 is null ,0 is not null ,'' is null ,'' is not null;
+-----------+---------------+------------+----------------+ | 0 is null | 0 is not null | '' is null | '' is not null | +-----------+---------------+------------+----------------+ |         0 |             1 |          0 |              1 | +-----------+---------------+------------+----------------+ 1 row in set (0.00 sec)

因此,实际上可以将零或空字符串插入一NOT NULL列中NOT NULL


--------------------------------------------------------------------------------------------------------------------------------------------



YEAR()MONTH() DAYOFMONTH()

---------------------------------------------------------------------------------------------------------------------------

mysql> SELECT YEAR('1987-01-01');
        -> 1987
mysql> SELECT MONTH('2008-02-03');
        -> 2

DAYOFMONTH(date)

Returns the day of the month for date, in the range 1 to 31, or 0 for dates such as '0000-00-00' or '2008-00-00' that have a zero day part.

mysql> SELECT DAYOFMONTH('2007-02-03');
        -> 3



--------------------------------------------------------------------------------------------------------------------------

mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+


mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+



DATE_ADD()CURDATE()

----------------------------------------------------------------------------------------




---------------------------------------------------------------------------------------


SELECT name, birth FROM pet
WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));

完成相同任务的另一种方法是,在使用modulo函数(MOD)将月份值包装为0(如果当前为12)后,在当前月份之后加1得到下一个月:

SELECT name, birth FROM pet
WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

MONTH()返回一个1到12之间的数字。MOD(某数,12)返回一个0到11之间的数字。所以必须在MOD()之后添加,否则我们将从11月11日到1月1日。

如果计算使用了无效日期,计算将失败并产生警告:

SELECT '2018-10-31' + INTERVAL 1 DAY;
SELECT '2018-10-32' + INTERVAL 1 DAY;
SHOW WARNINGS;


模式匹配  like

MySQL提供了标准的SQL模式匹配,以及一种基于扩展正则表达式的模式匹配形式,类似于Unix实用程序(如vi、grep和sed)所使用的模式匹配。

SQL模式匹配允许使用_来匹配任何单个字符,使用%来匹配任意数量的字符(包括0个字符)。在MySQL中,SQL模式默认不区分大小写。这里展示了一些例子。不要使用=或&lt;&gt;当您使用SQL模式时。使用LIKE或NOT LIKE比较操作符代替。

查找以b开头的名字:

mysql> SELECT * FROM pet WHERE name LIKE 'b%';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

查找以fy结尾的名字:

mysql> SELECT * FROM pet WHERE name LIKE '%fy';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

查找包含w的名称:

mysql> SELECT * FROM pet WHERE name LIKE '%w%';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

要找到恰好包含5个字符的名称,请使用5个_模式字符的实例:

mysql> SELECT * FROM pet WHERE name LIKE '_____';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+


模式匹配  REGEXP_LIKE()

下表描述了扩展正则表达式的一些特征:

  • . 匹配任何单个字符。

  • 字符类[...]与方括号内的任何字符匹配。例如, [abc]匹配abc。要命名字符范围,请使用破折号。[a-z] 匹配任何字母,而[0-9] 匹配任何数字。

  • *匹配零个或多个前面事物的实例。例如,x* 匹配任意数量的x字符, [0-9]*匹配任意数量的数字,以及.*匹配任意数量的任何东西。

  • 如果正则表达式模式匹配成功,则该模式匹配成功。(这与LIKE模式匹配不同,后者仅在模式匹配整个值时才成功。)

  • 锚定的图案,使得它必须使用匹配的值的开头或结尾正在测试中,^在开始时或$在图案的端部。

为了演示扩展正则表达式的工作原理,LIKE此处显示的 查询在此处重写为use REGEXP_LIKE()

要查找以开头的名称b,请使用 ^匹配名称的开头:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b');
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

若要强制正则表达式比较区分大小写,请使用区分大小写的排序规则,或使用BINARY关键字使其中一个字符串成为二进制字符串,或指定c匹配控制字符。这些查询只匹配名字开头的小写b:

SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b' COLLATE utf8mb4_0900_as_cs);
SELECT * FROM pet WHERE REGEXP_LIKE(name, BINARY '^b');
SELECT * FROM pet WHERE REGEXP_LIKE(name, '^b', 'c');

要查找以fy结尾的名称,使用$来匹配名称的结尾:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'fy$');
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

要查找包含w的名称,使用以下查询:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, 'w');
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

因为正则表达式模式会匹配值中的任何位置,所以在前面的查询中,没有必要像在SQL模式中那样,在模式的任意一侧放置通配符来匹配整个值。

要找到恰好包含5个字符的名称,使用^和$来匹配名称的开头和结尾,以及的5个实例。之间:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.....$');
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

您也可以使用{n} (" repeat-n-times ")操作符来编写前面的查询:

mysql> SELECT * FROM pet WHERE REGEXP_LIKE(name, '^.{5}$');
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+


计数行 count

数据库通常用于回答以下问题:“表中某种类型的数据多久出现一次?” 例如,您可能想知道您拥有多少只宠物,或者每个所有者拥有多少只宠物,或者您可能想对动物进行各种普查操作。


复制代码
/*
计算你拥有的动物总数和“宠物表有多少行”是一样的问题。“因为每只宠物有一项记录。COUNT(*)计数行数,所以计数你的动物的查询看起来像这样:
*/
mysql> select  count(*)  from pet;
+----------+
| count(*) |
+----------+
|        9 |
+----------+
1 row in set (0.02 sec)


/*
之前,你检索了养宠物的人的名字。如果你想知道每个主人有多少只宠物,你可以使用COUNT():
*/

mysql>  SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Diane  |        2 |
| Harold |        2 |
| Gwen   |        3 |
| Benny  |        2 |
+--------+----------+
4 rows in set (0.01 sec)



复制代码
/*
如果启用了ONLY_FULL_GROUP_BY SQL模式,出现如下错误:
*/
mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT owner, COUNT(*) FROM pet;
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'menagerie.pet.owner'; this is incompatible with sql_mode=only_full_group_by

/*
如果没有启用ONLY_FULL_GROUP_BY,则通过将所有行视为单个组来处理查询,但是为每个命名列选择的值是不确定的。服务器可以从任意行选择值:
*/
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT owner, COUNT(*) FROM pet;
+-------+----------+
| owner | COUNT(*) |
+-------+----------+
| Diane |        9 |
+-------+----------+
1 row in set (0.00 sec)

mysql>


复制代码



复制代码

使用多个表 








--


--

INSERT


tbl_name
partition_name
partition_name
col_name
col_name
value_list
value_list
row_constructor_list
row_alias
col_alias
col_alias
assignment_list
tbl_name
partition_name
partition_name
row_alias
col_alias
col_alias
assignment_list
assignment_list
tbl_name
partition_name
partition_name
col_name
col_name
row_alias
col_alias
col_alias
table_name
assignment_list
value
expr
value_list
value
value
row_constructor_list
value_list
value_list
assignment
col_name
row_alias
value
assignment_list
assignment
assignment


INSERT INTO pet
VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);



--


--

--


DELETE Statement

tbl_name
tbl_alias
partition_name
partition_name
where_condition
row_count


--


--

UPDATE

table_reference
assignment_list
where_condition
row_count
value
expr
assignment
col_name
value
assignment_list
assignment
assignment


--


正则表达式

正则表达式

表12.14正则表达式函数和运算符

名称 描述
NOT REGEXP 否REGEXP
REGEXP 字符串是否匹配正则表达式
REGEXP_INSTR() 子串匹配正则表达式的起始索引
REGEXP_LIKE() 字符串是否匹配正则表达式
REGEXP_REPLACE() 替换匹配正则表达式的子字符串
REGEXP_SUBSTR() 返回匹配正则表达式的子字符串
RLIKE 字符串是否匹配正则表达式

正则表达式是为复杂搜索指定模式的有效方法。本节讨论可用于正则表达式匹配的函数和运算符,并举例说明可用于正则表达式操作的一些特殊字符和构造。

MySQL使用Unicode国际组件(ICU)实现了正则表达式支持,该组件提供了完整的Unicode支持并且是多字节安全的。(在MySQL 8.0.4之前,MySQL使用Henry Spencer的正则表达式实现,该实现以字节方式运行,并且不是多字节安全的。有关使用正则表达式的应用程序可能受实现更改影响的方式的信息,请参见 正则表达式兼容性注意事项。)

  • 正则表达式函数和运算符

  • 正则表达式语法

  • 正则表达式资源控制

  • 正则表达式兼容性注意事项

正则表达式函数和运算符

  • expr NOT REGEXP pat expr NOT RLIKE pat

    这与相同 NOT (expr REGEXP pat)

  • expr REGEXP pat expr RLIKE pat

    如果字符串expr 与模式指定的正则表达式匹配,则 返回1,否则返回pat0。如果 expr或者 patNULL,返回值是NULL

    REGEXP并且 RLIKE是同义词REGEXP_LIKE()

    有关如何进行匹配的其他信息,请参见的描述 REGEXP_LIKE()







----


posted @   一品堂.技术学习笔记  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2018-12-23 Linux查看显示编辑文本文件
2018-12-23 第五章:管理数据库实例
2018-12-23 yum [Errno 256] No more mirrors to try 解决方法
2017-12-23 SQL*Plus命令
点击右上角即可分享
微信分享提示

目录导航