mysql中的sql语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中的sql语句相关的知识,希望对你有一定的参考价值。

CREATE TABLE mytable(
  id INT PRIMARY KEY AUTO_INCREMENT,
  myvalue VARCHAR(10),
  mydate DATETIME
  )
  INSERT INTO mytable(myvalue,mydate) VALUES('a','2014-07-22 14:23:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('b','2014-07-22 15:28:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('c','2014-07-23 11:23:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('d','2014-07-25 14:23:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('f','2014-07-26 07:23:00');
INSERT INTO mytable(myvalue,mydate) VALUES('e','2014-07-25 19:26:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('g','2014-07-27 14:23:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('h','2014-07-27 15:23:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('i','2014-07-27 19:51:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('k','2014-07-28 14:23:00');
  INSERT INTO mytable(myvalue,mydate) VALUES('l','2014-07-29 14:23:00');

--查询23号到28号中每天的最后一条数据的集合,即从这张表中筛选出myvalue为c、e、f、i、k
哎呀,想写个sql真是太难了,心好累。

character introducer翻译过来就是字符引导。也就是针对字符串,显式的给定一个字符编码和排序规则,不受系统参数的影响。

总结 Introducer 使用规则:

1. convert 函数

convert 函数类似于 introducer,不过只能指定字符集。

2. charset 函数

检测字符串的字符集。可以检测出当前字符串在当前 session 的字符集。

3. set names 语句

语法为:

SET NAMES 'charset_name'[COLLATE 'collation_name'] | DEFAULT

这条语句最常用,可是也最容易被滥用,比如语句:

    set names latin1 collate latin1_bin;

    执行后会默认执行一系列语句,也就是把非服务端的相关参数给重新设定了。

4. set character set 语句语法为:

SET CHARACTER SET | CHARSET'charset_name' | DEFAULT

    类似语句 set names,同样是设置以下三个 session 参数:

    character_set_results

    character_set_client

    character_set_connection

同样是可以恢复默认值,还有同样的限制规则等。不过有两点不同:1)参数 character_set_connection 的值不会被设定为指定的字符集,而是继承参数 character_set_database 所设定的字符集。

5. collate 子句

collate 语句强制指定排序规则,优先级最高。也就是显式指定 collate 会覆盖已有的排序规则。

这里涉及到单个字符串以及字符串拼接的排序规则问题。

参考技术A

兄弟,你这是mysql,开始被你误导啦

select a.* from mytable a,
(select date(mydate) mydate,max(mydate) max_datetime from mytable where date(mydate) between '2014-07-23' and '2014-07-28' group by date(mydate)) b
where a.mydate=b.max_datetime
and date(a.mydate)=b.mydate

本回答被提问者和网友采纳
参考技术B $mysqli->query("SELECT answer FROM FAQ WHERE question="hello"")这句里面出错了,修改的办法有2种:
第一把双引号内部的双引号转义:
$mysqli->query("SELECT answer FROM FAQ WHERE question=\"hello\"");第二种把双引号变成单引号:
$mysqli->query("SELECT answer FROM FAQ WHERE question='hello'");希望对你有所帮助!
参考技术C 查出23到28号的结果集再用程序处理不行么

MySQL中的基本SQL语句

标准SQL包含了4种基本的语句类别:

  • DDL语句,数据定义语句,主要用来定义数据库,表名,字段,例如create,drop,alter.
  • DML语句,数据操作语句,用来对数据记录的增删改查,还用来保证数据的一致性。主要有select,delete,insert,update语句。
  • DCL语句,数据控制语句,用于控制不同数据对象访问级别的语句。定义了数据库、表、表、用户的访问权限和完全级别。常用的语句包括grant、revoke等
  • TCL语句,事务控制语句,用来确保事务的特性。

CREATE TABLE建表语句

在介绍建表语句之前,先简单说明一下创建数据库的语句。

mysql> create database mytest;      #创建数据库
Query OK, 1 row affected (0.00 sec)
mysql> use mytest;                        #改变当前的数据库
Database changed
mysql> select database();               #查看当前选中的数据库
+------------+
| database() |
+------------+
| mytest     |
+------------+
1 row in set (0.00 sec)

mysql> select user();                           #查看当前登录的用户
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> show create database mytest;   #查看创建数据库的语句,默认添加了字符集,会在字符集中介绍
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| mytest   | CREATE DATABASE `mytest` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select version();          #查看当前数据库的版本
+------------+
| version()  |
+------------+
| 5.7.22-log |
+------------+
1 row in set (0.00 sec)

mysql> 
创建数据库

数据库创建之后,然后就是建表:

建表语句的作用就是在数据库创建一张二维表,因此在建表语句要指定每一个字段名(二维表中的列名),还有要指定对填入这些字段的数据的限制(约束条件),同时建表语句还可以指定这张表的字符集,以及之前规划好的索引等。
create table tb1(
c1  int auto_increment primary key,
c2 varchar(20)
);
创建了tb1表,表中有两列(两个字段),
auto_increment: 指定字段c1为自增字段,mysql中一个表中只能有一个自增字段,且须为主键。
mysql> show create table tb1\\G
*************************** 1. row ***************************
       Table: tb1
Create Table: CREATE TABLE `tb1` (
  `c1` int(11) NOT NULL AUTO_INCREMENT,
  `c2` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

#查看建表语句,mysql会默认选择表的存储引擎和字符集
mysql> system ls /data/mysql/mytest/tb1.*
/data/mysql/mytest/tb1.frm  /data/mysql/mytest/tb1.ibd
#在datadir对应的目录下面会生成对应的表结构文件tb1.frm,和数据文件tb1.ibd。

MySQL支持在建表时指定temporary参数,这样创建的表是临时表,临时表是基于会话级别的表。

#创建临时表,临时表使用show tables查不到其存在,但是可以查看表结构,也可以向临时表插入数据
mysql> create temporary table tb2(id int, info varchar(20)); Query OK, 0 rows affected (0.00 sec) mysql> show tables; +------------------+ | Tables_in_mytest | +------------------+ | tb1 | +------------------+ 1 row in set (0.00 sec) mysql> show create table tb2; +-------+--------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------------------------------------------------------+ | tb2 | CREATE TEMPORARY TABLE `tb2` ( `id` int(11) DEFAULT NULL, `info` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+--------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> insert into tb2 values(1,"a"); Query OK, 1 row affected (0.00 sec)
#临时表的表结构存在于/tmp/目录下面
mysql> show variables like "tmpdir";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp  |
+---------------+-------+
1 row in set (0.01 sec)
[root@test3 tmp]# pwd
/tmp
[root@test3 tmp]# ls
#sql2966_99_0.frm
#临时表的数据文件在MySQL5.7之后由专门的文件存储
mysql> show variables like "innodb%temp%";
+----------------------------+-----------------------+
| Variable_name              | Value                 |
+----------------------------+-----------------------+
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
+----------------------------+-----------------------+
1 row in set (0.00 sec)
#临时表有专门的存储引擎
mysql> show variables like "default%tmp%";
+----------------------------+--------+
| Variable_name              | Value  |
+----------------------------+--------+
| default_tmp_storage_engine | InnoDB |
+----------------------------+--------+
1 row in set (0.00 sec)
#临时表只对当前会话有效,当前会话断开,临时表会自动删除,在其余的会话也看不到临时表。
mysql> insert into tb2 values(1,"a");
ERROR 1146 (42S02): Table \'mytest.tb2\' doesn\'t exist
mysql>

crate table语句还有很多参数可以使用,这些只是基本的用法,可以查看官方文档,也可以查看work bench中的介绍。

删除数据库和表

#删除数据库
mysql> drop database mytesti;
Query OK, 0 rows affected (0.00 sec)

#删除表,和表结构一起删除
mysql> drop table tb1;
Query OK, 0 rows affected (0.02 sec)
#删除表中的所有记录,但是不删除表结构
mysql> truncate tb4;
Query OK, 0 rows affected (0.04 sec)

#delete用来删除表中的数据
mysql> delete table tb2;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'table tb2\' at line 1
mysql> delete from  tb2 where c = 1;
Query OK, 0 rows affected (0.00 sec)

修改表结构

#创建如下表
CREATE TABLE IF NOT EXISTS tb2 (
    id INT,
    NAME VARCHAR (20),
    email VARCHAR (50)
);
#查看表的结构如下:
mysql> desc tb2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| NAME  | varchar(20) | YES  |     | NULL    |       |
| email | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

#修改表名
// ALTER TABLE OLD_TB_NAME  RENAME [TO] NEW_TB_NAME; 
mysql> alter table tb2 rename to tb3;
Query OK, 0 rows affected (0.00 sec)
// TO可以省略
mysql> alter table tb3 rename  tb2;
Query OK, 0 rows affected (0.00 sec)

#修改字段数据类型(把id字段的int类型修改为varchar类型)
// ALTER TABLE TBNAME MODIFY 字段名 新属性
ALTER TABLE tb2 MODIFY id VARCHAR(10);
mysql> desc tb2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | varchar(10) | YES  |     | NULL    |       |
| NAME  | varchar(20) | YES  |     | NULL    |       |
| email | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

#修改字段名 (把上面的id字段名修改为user_id)
ALTER TABLE TBNAME CHANGE 旧字段名 新字段名 约束条件;
#需要注意的是这种方法不仅可以修改字段名,还可以修改字段的数据类型。
ALTER TABLE tb2 change id  user_id varchar(10);

#增加字段
//ALTER TABLE 表名 ADD 新字段名 date FIRST|AFTER 字段A名。 first表示新加的字段在A的前面,after表示在A的后面。
ALTER TABLE tb2 ADD birth  date; #默认的新增字段是在最后插入的。
mysql> desc tb2;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| user_id | varchar(10) | YES  |     | NULL    |       |
| NAME    | varchar(20) | YES  |     | NULL    |       |
| email   | varchar(50) | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

#删除字段
//ALTER TABLE 表名 DROP 字段名;
ALTER TABLE tb2 DROP user_id;

#字段排序
ALTER TABLE TBNAME MODIFY 字段1 数据类型 FIRST|AFTER 字段2.

#更改表的存储引擎:
ALTER TABLE 表名 engine = "存储引擎名"

#删除外键
ALTER TABLE 表名 FOREIGN KEY 外键别名。

 insert插入数据

 insert用于向表中插入数据。

#默认插入所有的字段
insert into tb2 values(1,"a");
#插入指定的字段
insert into tb2(id) values("3");
#一次插入多个数值
insert into tb2 values(4,"c"),(5,"d"),(6,"e");

mysql> select * from tb2;
+------+------+
| id   | NAME |
+------+------+
|    1 | a    |
|    3 | NULL |
|    4 | c    |
|    5 | d    |
|    6 | e    |
+------+------+
5 rows in set (0.00 sec)

mysql>
insert插入数据

update更新数据

update更新语句一般于where条件句联合使用。

mysql> update tb2  set name = "b" where id =3;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

#如果不使用where条件语句限制,则更新表中所有的行

select查询

在查询之前先导入MySQL官方提供的employeeso库数据。

下载地址:https://github.com/datacharmer/test_db/archive/master.zip

方法:直接下载zip压缩包,然后直接导入employees.sql文件即可

导入的表,各个表之间的关系如下:

单表查询

 

mysql> select * from employees limit 1;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.00 sec)

mysql> select emp_no, concat(first_name, " ", last_name) as full_name, gender from employees limit 1;
+--------+----------------+--------+
| emp_no | full_name      | gender |
+--------+----------------+--------+
|  10001 | Georgi Facello | M      |
+--------+----------------+--------+
1 row in set (0.01 sec)

#查询可以使用*号代替表中所有的字段,也可以使用对应字段的字符,只查询出对应的要查询的字段。
#concat函数,就是连接字符串,在这里和as结合,连接了两个字段,并且重命名为full_name。

MySQL中有许多内嵌的函数可以调用,详细的函数列表参照:https://dev.mysql.com/doc/refman/5.7/en/string-functions.html  可以使用Google浏览器打开,可以翻译为中文!

单表查询和一些条件语句结合:

查看表中记录的数量

mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
|   300024 |
+----------+
1 row in set (0.53 sec)

使用order  by语句按照某字段排序:

#默认是按照正序排列
mysql> select * from employees order by  emp_no  limit 3;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
+--------+------------+------------+-----------+--------+------------+
3 rows in set (0.00 sec)

#加入关键字按照倒序排列
mysql> select * from employees order by  emp_no desc limit 3;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
| 499999 | 1958-05-01 | Sachin     | Tsukuda   | M      | 1997-11-30 |
| 499998 | 1956-09-05 | Patricia   | Breugel   | M      | 1993-10-13 |
| 499997 | 1961-08-03 | Berhard    | Lenart    | M      | 1986-04-21 |
+--------+------------+------------+-----------+--------+------------+
3 rows in set (0.00 sec)
order by

使用where条件语句:

#查找部门经理表中,员工号为d006的记录
mysql> select * from dept_manager where dept_no = "d006";
+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    |
+--------+---------+------------+------------+
| 110725 | d006    | 1985-01-01 | 1989-05-06 |
| 110765 | d006    | 1989-05-06 | 1991-09-12 |
| 110800 | d006    | 1991-09-12 | 1994-06-28 |
| 110854 | d006    | 1994-06-28 | 9999-01-01 |
+--------+---------+------------+------------+
4 rows in set (0.06 sec)

#where可以使用大于,小于,不等于
SELECT * FROM dept_manager where dept_no > "d006";
SELECT * FROM dept_manager where dept_no < "d004";
SELECT * FROM dept_manager where dept_no <> "d006";
#where语句也可以使用in关键字
mysql> select * from dept_manager where dept_no in ("d006", "d001");
+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    |以上是关于mysql中的sql语句的主要内容,如果未能解决你的问题,请参考以下文章

如何实时监控mysql中的SQL语句的执行情况

mysql中的sql语句存在关键字怎么办?

mysql中的sql语句存在关键字怎么办

各种数据库中的sql语句中都怎么加注释

MySQL中的基本SQL语句

Sql server中有没有replace语句? 没有的话,怎样实现类似于mySql中的repla