sql语法

这是一篇sql语法的总结笔记

sql语法表

语句 语法
AND / OR SELECT column_name(s) FROM table_name WHERE condition AND|OR condition
ALTER TABLE (add column) ALTER TABLE table_name ADD column_name datatype
ALTER TABLE (drop column) ALTER TABLE table_name DROP COLUMN column_name
AS (alias for column) SELECT column_name AS column_alias FROM table_name
AS (alias for table) SELECT column_name FROM table_name AS table_alias
BETWEEN SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
CREATE DATABASE CREATE DATABASE database_name
CREATE INDEX CREATE INDEX index_name ON table_name (column_name)
CREATE TABLE CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, ……. )
CREATE UNIQUE INDEX CREATE UNIQUE INDEX index_name ON table_name (column_name)
CREATE VIEW CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
DELETE FROM DELETE FROM table_name (Note: Deletes the entire table!!) or DELETE FROM table_name WHERE condition
DROP DATABASE DROP DATABASE database_name
DROP INDEX DROP INDEX table_name.index_name
DROP TABLE DROP TABLE table_name
GROUP BY SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1
HAVING HAVING 是用来限制GROUP BY子句的结构的;HAVING作用于GROUP BY 之后的每一个group SELECT column_name1,SUM(column_name2) FROM table_name GROUP BY column_name1 HAVING SUM(column_name2) condition value
IN SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..)
INSERT INTO INSERT INTO table_name VALUES (value1, value2,….) or INSERT INTO table_name (column_name1, column_name2,…) VALUES (value1, value2,….)
LIKE SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern (% _ [] [^])
ORDER BY SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC]
SELECT SELECT column_name(s) FROM table_name
SELECT * SELECT * FROM table_name
SELECT DISTINCT SELECT DISTINCT column_name(s) FROM table_name
SELECT INTO (used to create backup copies of tables) SELECT * INTO new_table_name FROM original_table_name or SELECT column_name(s) INTO new_table_name FROM original_table_name
TRUNCATE TABLE (deletes only the data inside the table) TRUNCATE TABLE table_name
UPDATE UPDATE table_name SET column_name=new_value [, column_name=new_value] WHERE column_name=some_value
WHERE SELECT column_name(s) FROM table_name WHERE condition

添加列

mysql添加列必须说明数据类型,删除列可以省略column

错误:
alter table employee add memo
alter table employee add column

正确:
alter table employee drop column age
alter table employee drop age

limit

select * from message limit 5,5; //从第5条开始取,取5条

批量删除多条记录–in

DELETE FROM message WHERE commandid IN (640,634,633);

统计SQL语句查询出来的条数

SELECT COUNT(*) FROM micro_message.COMMAND;

批量插入

INSERT INTO COMMAND (COMMAND,DESCRIPTION) VALUES(‘HAHA’, ‘ASDASD’),(‘SAD’,’SADAS’)

sql语句顺序

select, from, where, group by, having, order by, limit

where增加分组前的限定,having增加分组后的限定

union

UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)

UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)

SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;

排序order by

默认是asc

如果字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY:

SELECT * 
FROM runoob_tbl
ORDER BY runoob_title asc;

如果字符集采用的是 utf8(万国码),需要先对字段进行转码然后排序:

SELECT * 
FROM runoob_tbl
ORDER BY CONVERT(runoob_title using gbk) desc;

GROUP BY

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

1.group by 可以实现一个最简单的去重查询,假设想看下有哪些员工,除了用 distinct,还可以用:

SELECT name FROM employee_tbl GROUP BY name;

2.分组后的条件使用 HAVING 来限定,WHERE 是对原始数据进行条件限制。几个关键字的使用顺序为 where 、group by 、having、order by ,例如:

SELECT coalesce(name, '总数')as name1 ,sum(singin) as sum1 FROM employee_tbl GROUP BY name having sum1>5 order by sum1 desc;

其中coalesce(a,b,c)用来设置一个可以取代 NUll 的名称:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

join–Mysql连接的使用

之前都是在一张表中读取数据,但是在真正的应用中经常需要从多个数据表中读取数据, JOIN就是在两个或多个表中查询数据。

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。省略 INNER 使用 JOIN,效果一样

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

SQL联合查询(主表与子表联合查询)–left join on

SELECT A.DESCRIPTION,B.CONTENT FROM COMMAND A LEFT JOIN COMMAND_CONTENT B ON A.COMMAND_ID=B.COMMAND_ID WHERE A.COMMAND_ID='查看';

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

这个问题请看这个LEFT JOIN 使用时的注意事项left join on and 与 left join on where的区别

inner join 与 left join 之间的区别

来源: inner join 与 left join 之间的区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

inner join(等值连接) 只返回两个表中联结字段相等的行

下面的这条语句是:根据seckillId查询SuccessKilled实体(也携带Seckill秒杀商品对象实体),即查询的同时也为SuccessKilled中属性为Seckill的实体对象赋值

<!--mybatis把结果映射到SuccessKilled,同时映射属性seckill属性-->
SELECT
  sk.seckillId,
  sk.user_phone,
  sk.state,
  sk.create_time,
  s.seckillId "seckill.seckill_id",
  s.name "seckill.name",
  s.number "seckill.number",
  s.start_time "seckill.start_time",
  s.end_time "seckill.end_time",
  s.create_time "seckill.create_time"
FROM success_killed sk INNER JOIN seckill s
ON sk.seckill_id = s.seckill_id
WHERE sk.seckillId = #{seckillId}

MySQL NULL 值处理

不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。

IS NULL: 当列的值是 NULL,此运算符返回 true。

select a2 is null from aaa where a1='a';

SELECT * FROM runoob_test_tbl WHERE runoob_count IS NULL;

IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。

<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。

like 与 正则表达式

e.g.

like '%a$'like 'a_.{0,2}'

ALTER命令

当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令。

1.修改表名:

ALTER TABLE testalter_tbl RENAME TO alter_tbl;

2.删除,添加或修改表字段:

ALTER TABLE testalter_tbl ADD i INT;//添加列i到数据表字段的末尾。
ALTER TABLE testalter_tbl DROP i;//删除表中名i的列
ALTER TABLE testalter_tbl ADD i INT FIRST;//添加第一列名i
ALTER TABLE testalter_tbl DROP i;//删除表中名i的列
ALTER TABLE testalter_tbl ADD i INT AFTER c;//在列c后添加列名i

使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。

3.修改字段类型及名称

ALTER TABLE testalter_tbl CHANGE i j BIGINT;

MySQL 复制表

完整的复制MySQL数据表,步骤如下:

1.使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。

mysql> SHOW CREATE TABLE runoob_tbl \G;
*************************** 1. row ***************************
       Table: runoob_tbl
Create Table: CREATE TABLE `runoob_tbl` (
  `runoob_id` int(11) NOT NULL auto_increment,
  `runoob_title` varchar(100) NOT NULL default '',
  `runoob_author` varchar(40) NOT NULL default '',
  `submission_date` date default NULL,
  PRIMARY KEY  (`runoob_id`),
  UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
) ENGINE=InnoDB 
1 row in set (0.00 sec)

ERROR:
No query specified

2.复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。

CREATE TABLE `clone_tbl` (
  -> `runoob_id` int(11) NOT NULL auto_increment,
  -> `runoob_title` varchar(100) NOT NULL default '',
  -> `runoob_author` varchar(40) NOT NULL default '',
  -> `submission_date` date default NULL,
  -> PRIMARY KEY  (`runoob_id`),
  -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (1.80 sec)

3.如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。

INSERT INTO clone_tbl (runoob_id,
->                     runoob_title,
->                     runoob_author,
->                     submission_date)
    -> SELECT runoob_id,runoob_title,
    ->        runoob_author,submission_date
    -> FROM runoob_tbl;
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql获取元数据

1.使用 SHOW TABLES 或 SHOW DATABASES 语句来获取数据库和数据表列表

2.获取服务器元数据:

SELECT VERSION( )    服务器版本信息
SELECT DATABASE( )    当前数据库名 (或者返回空)
SELECT USER( )    当前用户名
SHOW STATUS    服务器状态
SHOW VARIABLES    服务器配置变量

AUTO_INCREMENT–MySQL 序列相关

MySQL 序列-菜鸟教程

MySQL 处理重复数据

MySQL 处理重复数据-菜鸟教程

统计表中 first_name 和 last_name的重复记录数:

SELECT COUNT(*) as repetitions, last_name, first_name
FROM person_tbl
GROUP BY last_name, first_name
HAVING repetitions > 1;

过滤重复数据:

SELECT DISTINCT last_name, first_name
FROM person_tbl;

也可以使用 GROUP BY 来读取数据表中不重复的数据:
SELECT last_name, first_name
FROM person_tbl
GROUP BY (last_name, first_name);

删除重复数据:

1:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

2:也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录

mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);

欢迎转载,欢迎错误指正与技术交流,欢迎交友谈心

文章标题:sql语法

文章字数:2.3k

本文作者:Brain Cao

发布时间:2018-04-08, 16:03:01

最后更新:2020-03-07, 14:15:58

原始链接:https://braincao.cn/2018/04/08/sql-grammar/

版权声明:本文为博主原创文章,遵循 BY-NC-SA 4.0 版权协议,转载请保留原文链接与作者。

目录
×

喜欢请收藏,疼爱就打赏