目录
数据库操作
数据库类型
创建和删除数据表
表操作
高级操作
SQL 约束
SQL 日期
SQL 函数
总结
参考
登陆数据库: mysql -h xxx -uroot -p pass 数据库名称 创建数据库: CREATE DATABASE 数据库名; 删除数据库: drop database <数据库名>; 显示数据库: show databases; 使用数据库: use 数据库名;
Extra信息 数值类型: INT UNSIGNED、int(10) unsigned、float、 int(size) tinyint(size) tinyint(1、4) NOT NULL DEFAULT '1' COMMENT 'k8sservice端口标识' float NOT NULL DEFAULT '0' COMMENT 'cpu_quota', 日期和时间类型: `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:01' COMMENT '触发时间', `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近修改时间', 字符串类型: `instance_type` varchar(128) NOT NULL DEFAULT '' COMMENT 'instance 类型', varchar(256)\text类型
创建数据表: CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `person` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'key', `name` varchar(65) NOT NULL DEFAULT '' COMMENT '名字', `city` varchar(1024) NOT NULL DEFAULT '' COMMENT '居住城市', `address` varchar(1024) NOT NULL DEFAULT '' COMMENT '居住地址', `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:01' COMMENT '触发时间', PRIMARY KEY ( `id` ) )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='person'; AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。 PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。 ENGINE 设置存储引擎,CHARSET 设置编码。 删除表: DROP TABLE table_name; TRUNCATE TABLE 表名称; 查看创建表: show create table xxx; 查看表结构: desc xxx; 修改表操作: ALTER TABLE 语句 用于在已有的表中添加、修改或删除列。 表中添加列: ALTER TABLE table_name ADD column_name datatype 表中删除列: ALTER TABLE table_name DROP COLUMN column_name 修改列: ALTER TABLE table_name ALTER COLUMN column_name datatype
插入数据: INSERT INTO 表名称 VALUES (值1, 值2,....) // 必须全部指定 INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 指定列插入数据 insert table_name set xxx='',xxx='',xxx=''; insert user set name="evanlixin",role="admin",token="0848a0cbcdde9a24e27a2e5f2918fd8b";
查询数据: SELECT 列名称 FROM 表名称 SELECT * FROM 表名称 distinct: SELECT DISTINCT 列名称 FROM 表名称 关键词 DISTINCT 用于返回唯一不同的值。 where 子句: SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 操作符 描述 = 等于 != 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于 BETWEEN 在某个范围内 LIKE 搜索某种模式 and 和 or运算符 SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter' AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。 如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。 如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。 ORDER BY 语句用于根据指定的列对结果集进行排序。 ORDER BY 语句默认按照升序对记录进行排序。如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。 SELECT Company, OrderNumber FROM Orders ORDER BY Company SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber 按照Company升序排,相同时按照OrderNumber排 SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC 逆序排 SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 注意:在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。
修改表中数据: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
删除表中行: DELETE FROM 表名称 WHERE 列名称 = 值 DELETE FROM table_name
limit语句: LIMIT可以实现top N查询,也可以实现M至N(某一段)的记录查询 SELECT * FROM MYTABLE ORDER BY AFIELD LIMIT offset, recnum 其中offset为从第几条(M+1)记录开始,recnum为返回的记录条数。 select * from person order by name limit 2; select * from person where id >= 1 and id <=3; LIKE操作符: 用于在 WHERE 子句中搜索列中的指定模式 "%" 可用于定义通配符(模式中缺少的字母) SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern SELECT * FROM Persons WHERE City LIKE 'N%'\'%g'\'%lon%'\ NOT LIKE '%lon%' SQL 通配符: 必须与 LIKE 运算符一起使用。 % 替代一个或多个字符 _ 仅替代一个字符 [charlist] 字符列中的任何单一字符 LIKE '[ALN]%' [^charlist] [!charlist] 不在字符列中的任何单一字符 IN 操作符: 在 WHERE 子句中规定多个值 SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...) SQL 别名: 可以为列名称和表名称指定别名(Alias) 别名使查询程序更易阅读和书写 SELECT column_name(s) FROM table_name AS alias_name SELECT column_name AS alias_name FROM table_name SQL INNER JOIN 关键字: 两种写法 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name 我们希望列出所有人的定购 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 内联合的两种写法: SELECT podvm.id, podvm.group_id, podvm.task_id, podvm.name, podvm.hostname, podvm.gpu,podvm.cpu, podvm.memory, podvm.image_address, podvm.vm_index, podvm.pod_ip, podvm.binding_status, podvm.binding_target, podvm.status, podvm.op_user, podvm.region, podvm.create_time, podvm.tor, podvm.offline from podvm INNER JOIN podvmgroup ON podvm.group_id = podvmgroup.id where podvmgroup.service_ns = ?` SELECT podvm.id, podvm.group_id, podvm.task_id, podvm.name, podvm.hostname, podvm.gpu,podvm.cpu, podvm.memory, podvm.image_address, podvm.vm_index, podvm.pod_ip, podvm.binding_status, podvm.binding_target, podvm.status, podvm.op_user, podvm.region, podvm.create_time, podvm.tor, podvm.offline from podvm,podvmgroup where podvm.group_id = podvmgroup.id and podvmgroup.service_ns="evan-test.didicloud.op.didi.com"\G SELECT podvm.id, podvm.group_id, podvm.task_id, podvm.name, podvm.hostname, podvm.gpu, podvm.cpu, podvm.memory, podvm.image_address, podvm.vm_index, podvm.pod_ip, podvm.binding_status, podvm.binding_target, podvm.status, podvm.op_user,podvm.host_ip, podvm.region, podvm.create_time, podvm.tor, podvm.offline from podvm INNER JOIN podvmgroup ON podvm.group_id = podvmgroup.id where podvmgroup.service_ns = ? and podvmgroup.region = ? and podvmgroup.name =? ` LEFT JOIN 关键字 LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。 SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name 我们希望列出所有的定单,以及定购它们的人 - 如果有的话。 SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。 SELECT column_name(s) FROM table_name1 FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
我们将主要探讨以下几种约束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
DEFAULT
NOT NULL 约束 NOT NULL 约束强制列不接受 NULL 值。 NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。 DEFAULT 约束 DEFAULT 约束用于向列中插入默认值。如果没有规定其他的值,那么会将默认值添加到所有的新记录。 PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录。 主键必须包含唯一的值。 主键列不能包含 NULL 值。 每个表都应该有一个主键,并且每个表只能有一个主键。 创建表时通过 PRIMARY KEY ( `runoob_id` ) 进行主键约束。 UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录。 UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 拥有自动定义的 UNIQUE 约束。 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。 UNIQUE KEY `uniq_token` (`token`) FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。 FOREIGN KEY 约束用于预防破坏表之间连接的动作。 FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY
`create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:01' COMMENT '触发时间', `last_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近修改时间', CURRENT_TIMESTAMP 表示当前的时间戳 SELECT NOW(),CURDATE(),CURTIME() 返回当前的日期和时间 DATE() 函数返回日期或日期/时间表达式的日期部分。 DATE(date) EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。 EXTRACT(unit FROM date) DATE_ADD() 函数向日期添加指定的时间间隔。DATE_ADD(date,INTERVAL expr type) date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。 DATE_SUB() 函数从日期减去指定的时间间隔。 DATE_SUB(date,INTERVAL expr type) DATEDIFF() 函数返回两个日期之间的天数。 DATEDIFF(date1,date2) 数据库表统计七天之内的数据: select count(*) from task where category_type="xxx" and task_type="xxx" and date_sub(NOW(),INTERVAL 7 DAY) <= last_update_time
拥有很多可用于计数和计算的内建函数。 SELECT function(列) FROM 表 AVG 函数返回数值列的平均值。NULL 值不包括在计算中。 SELECT AVG(column_name) FROM table_name COUNT() 函数返回匹配指定条件的行数. SELECT COUNT(column_name) FROM table_name SELECT COUNT(*) FROM table_name SELECT COUNT(DISTINCT column_name) FROM table_name MAX 函数返回一列中的最大值。NULL 值不包括在计算中。 SELECT MAX(column_name) FROM table_name MIN 函数返回一列中的最小值。NULL 值不包括在计算中。 SELECT MIN(column_name) FROM table_name SUM 函数返回数值列的总数(总额)。 SELECT SUM(column_name) FROM table_name GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name 区别: SELECT name, COUNT(*) FROM employee_tbl GROUP BY name; SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer SELECT Customer,SUM(OrderPrice) FROM Orders 解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 列的总计),而 "Customer" 返回 6 个值(每个值对应 "Orders" 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。 HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。主要是对合计结果做过滤 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value LEN 函数返回文本字段中值的长度。 SELECT LEN(column_name) FROM table_name ROUND 函数用于把数值字段舍入为指定的小数位数。 SELECT ROUND(column_name,decimals) FROM table_name NOW 函数返回当前的日期和时间。 SELECT NOW() FROM table_name
都是些基本操作,也算是回顾复习了吧!!!
http://www.w3school.com.cn/sql/sql_quiz.asp