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 处理重复数据
统计表中 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 版权协议,转载请保留原文链接与作者。